Moi,
haen tietoja vba-koodin avulla toisista excel-tiedostoista. Ongelmana on vain, että kun koodi sulkee hakutiedostoa niin ilmestyy kysymysikkuna. Voinko jotenkin vastata automaattisesti koodin avulla messagebokseihin?
Omassa koodissa suljen tiedoston tällä. False viittaa siihen, että tiedostoa ei tallenneta.
Lähde.Close False
Hakutiedostot sisältävät tällaisen kysymyksen:
MsgBox("Haluatko päivittää data välilehden", vbOKCancel, _ "Päivitys") = vbOK Then
Voinko siis viitata kyseiseen boksiin, jotta minun ei tarvitsisi joka kerta klikata Cancel-painiketta?
Lisäksi jokainen hakutiedosto ei sisällä kyseistä kysymystä, joten koodin pitäis tunnistaa mikäli ikkuna ilmestyy.
Keksinkin jo itte ratkaisun. Onnistui sillä, että otin makrot pois käytöstä hakutiedostosta komenolla:
Application.EnableEvents = False
Toinen ratkaisu ehkä olisi se mitä itse käytän. Eli kun luen jotain jostain xls filestä jota en halua tallettaa niin koodillisesti sanon että xls tiedosto on jo talletettu. Tällöin pystyy sulkemaan ilman kysymyksiä.
Kiitoksia vastauksesta jwinterh, mutta kyseinen tapa ei minun tapauksessani toimisi.
Osaisko joku sanoa, että miten makrot saa automaattisesti käyttöön ilman, että joutuu itse klikkailemaan käynnistyksen yhteydessä "Ota makrot käyttöön" -nappia? En halua poistaa suojausta eli muuttaa excelin asetuksia ettei se koskaan kysy kyseistä kysymystä. Haluaisin siis kohdistaa tämän toiminnon vain yhteen makroon.
Moikka taas uusi!
Mitä hyötyä olisi toiminnosta, jonka tarkoituksena on estää automaattinen makrojen suorittaminen jos sen voisi makrolla kiertää..?
Näppäränä ohjelmoijana voit tietysti tehdä ohjelman (esim. C++/C#/VB/VB.NET jne...), joka käpistelee ensin tarvittavaa rekisteriarvoa ja käynnistää sitten Excelin avaten työkirjasi...makroosi voit sitten sisällyttää toiminnon, joka palauttaa rekisteriarvon Exceliä suljettaessa tai avattaessa eri työkirjaa jne...
esim. Klikkaa Käynnistä -> Suorita -> kirjoita tekstiruutuun: regedit -> klikkaa OK, etsi vasemman laatikon 'kansiorakennelmasta' avain: HKEY_CURRENT_USER -> aliavaimet: Software -> Microsoft -> Office -> 11.0 (mikäli Office versiosi on 11 = Office 2003) -> Excel -> Security ->
klikkaa hiiren oikealla Security 'kansion' kuvaketta -> valitse: Vie -> siirry C: aseman juurena ja tallenna rekisteritiedosto esim. nimellä: xlDisable_Macros -> klikkaa rekisterieditorissa oikeassa laatikossa hiiren oikealla kuvaketta: Level -> valitse Muokkaa -> vaihda tekstiruudun arvoksi: 1 -> klikkaa OK -> klikkaa taas vasemmassa laatikossa hiiren oikealla: Security 'kansiota' -> valitse: Vie -> siirry C: aseman juureen ja tallenna avain esim. nimellä: xlEnable_Macros -> klikkaa valikorivillä: Tiedosto -> Tuo -> siirry C: aseman juureen etsi: xlDisable_Macros -> tuplaklikkaa kuvaketta -> klikkaa: Kyllä & sulje rekisterieditori...
tee sitten esim. vb6:lla seuraavanlainen ohjelma
Private Sub Form_Load() Me.Hide Dim xlPath As String, wkPath As String xlPath = "C:\Program files\Microsof Office\OFFICE11\Excel.exe" wkPath = Environ("userprofile") & _ "\Omat tiedostot\TyökirjanNimi.xls" 'esim. If Dir(xlPath) <> And Dir(wkPath)"" Then Shell "regedit -s c:\xlEnable_Macros.reg", vbHide Shell "xlPath wkPath", vbMaximizedFocus Dim delay As Single delay = Timer + 1 Do While delay > Timer: DoEvents: Loop End I End End Sub
liitä VBA-projektiisi Moduuli ja kirjoita koodiksi
Sub auto_close() Shell "regedit -s c:\xlDisable_Macros.reg", vbHide End Sub
ja liitä vielä ThisWorkbook-osioon koodi
Private Sub Workbook_Deactivate() Application.Quit End Sub
Heippaa taas!
tässä vielä sama ilman käsityötä VBS-höysteellä...
VB6-ohjelma:
Private Sub Form_Load() ' VB-Projektiin referenssi: ' Windows Script Host Object Model ' (C:\Windows\System32\wshom.ocx) Me.Hide Dim msoPath As String, _ xlPath As String, _ msoVersion As String msoPath = Environ("homedrive") & _ "\Program files\Microsoft Office" If Dir(msoPath, vbDirectory) <> "" Then For i = 9 To 19 If Dir(msoPath & "\OFFICE" & CStr(i) _ & "\Excel.exe") <> "" Then msoVersion = CStr(i) & ".0" xlPath = msoPath & "\OFFICE" & CStr(i) Exit For End If Next i Else MsgBox "Microsoft Office ei ole asennettu" _ + " oletus asennus hakemistoon" Exit Sub End If If xlPath <> "" Then Dim regKey As String, _ regValue As Variant, _ xlWkPath As String Set WshShell = CreateObject("WScript.Shell") regKey = "HKCU\Software\Microsoft\"Office\" _ + msoVersion + "\Excel\Security\Level" On Error Resume Next regValue = WshShell.RegRead(regKey) If Err <> 0 Then Err.Clear: On Error Goto 0 End If If regValue <> 1 Then WshShell.RegWrite regKey, 1, "REG_DWORD" regKey = "HKCU\Environment\xlSecurityValue" WshShell.RegWrite regKey, regValue, "REG_SZ" regKey = "HKCU\Environment\msoVersion" WshShell.RegWrite regKey, msoVersion, "REG_SZ" End If Set WshShell = Nothing xlWkPath = Chr(34) + Environ("Userprofile") _ & "\Omat tiedostot\TiedostonNimi.xls" + Chr(34) 'esim. Shell xlPath & "\Excel.exe " _ & xlWkPath, vbMaximizedFocus End If End End Sub
VBA-Projekti - Module1
' VBA-Projektiin referenssi: ' Windows Script Host Object Model ' (C:\Windows\System32\wshom.ocx) Sub auto_close() Dim regValue As Varian, _ msoValue As String regValue = Cint(Environ("xlSecurityValue")) msoValue = Environ("msoVersion") If regValue > 1 And msoValue <> "" Then Set WshShell = CreateObject("WScript.Shell") regKey = "HKCU\Software\Microsoft\Office\" _ + msoValue + "\Excel\Security\Level" WshShell.RegWrite regKey, regValue, "REG_SZ" Set WshShell = Nothing End If End Sub
VBA-Projekti - ThisWorkbook
Private Sub Workbook_Deactivate() Application.Quit End Sub
Hienoa Nea... en olisi uskonut ;o)
Aihe on jo aika vanha, joten et voi enää vastata siihen.