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 ThenVoinko 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 Subliitä 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 SubVBA-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 SubVBA-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.