Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET: MsqBox

uusi [16.01.2009 10:27:18]

#

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.

uusi [16.01.2009 12:19:24]

#

Keksinkin jo itte ratkaisun. Onnistui sillä, että otin makrot pois käytöstä hakutiedostosta komenolla:
Application.EnableEvents = False

jwinterh [16.01.2009 15:25:41]

#

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ä.

uusi [19.01.2009 10:42:51]

#

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.

neau33 [19.01.2009 14:44:41]

#

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

neau33 [21.01.2009 03:59:22]

#

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

mikke3141 [30.01.2009 20:44:52]

#

Hienoa Nea... en olisi uskonut ;o)

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta