Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen

Fehler abfangen, wenn Datei nicht vorhanden? | Herbers Excel-Forum


Betrifft: Fehler abfangen, wenn Datei nicht vorhanden? von: Kasimir
Geschrieben am: 15.01.2010 18:55:30

Hallo an alle!

Ich benötige mal Eure Hilfe. Ich will bestimmte Schlüssel in der Registry abfragen. Da ich nicht weiß, welcher Schlüssel wirklich auf dem PC des Users vorhanden ist, muss ich die möglichen Schlüssel abfragen. Frage ich nur einen Schlüssel alleine ab und dieser ist auf dem PC nicht vorhanden, funktioniert dieses mit nachfolgendem Code

On Error GoTo Fehler_Java
Javapfad = wsh.RegRead("HKLM\Software\JavaSoft\Java Plug-in\1.6.0_03\JavaHome")
GoTo Fehler_überspringen
Fehler_Java:
MsgBox "Eine Prüfung hat ergeben, dass Sie nicht die richtige Java-Version installiert haben.", vbCritical, Meldetext & " - Fehlende Java-Version..."
Unload frm_Immoberechnung
Exit Sub
Fehler_überspringen:


Versuche ich nun aber das Ganze mit 3 Schlüsseln und mal angenommen, der 1. und der 2. Schlüssel sind nicht vorhanden, dann funktioniert das mit nachfolgendem Code nicht.

On Error GoTo Fehler_Java1
Javapfad = wsh.RegRead("HKLM\Software\JavaSoft\Java Plug-in\1.5.0_01\JavaHome")
GoTo Fehler_überspringen
Fehler_Java1:
On Error GoTo Fehler_Java2
Javapfad1 = wsh.RegRead("HKLM\Software\JavaSoft\Java Plug-in\1.6.0_03\JavaHome")
GoTo Fehler_überspringen
Fehler_Java2:
On Error GoTo Fehler_Java3
Javapfad2 = wsh.RegRead("HKLM\Software\JavaSoft\Java Plug-in\1.6.0_17\JavaHome")
GoTo Fehler_überspringen
Fehler_Java3:
MsgBox "Eine Prüfung hat ergeben, dass Sie nicht die richtige Java-Version installiert haben.", vbCritical, Meldetext & " - Fehlende Java-Version..."
Unload frm_Immoberechnung
Exit Sub
Fehler_überspringen:


Die 1. Schlüsselabfrage funktioniert und die Error-Anweisung wird korrekt abgearbeitet. Aber bei der 2. Schlüsselabfrage wird die Error-Anweisung nicht richtig abgearbeitet, sondern ich erhalte die Laufzeitmeldung

Automatisierungsfehler
Das System kann die angegeben Datei nicht finden.


Das ist ja klar, denn dieser Schlüssel ist wie auch der 1. Schlüssel, der ja richtig mit der Error-Anweisung abgearbeitet, nicht vorhanden. Warum erhalte ich nun hier die Meldung, bzw. wie kriege ich das hin, dass wenn alle 3 Schlüssel nicht vorhanden sind, eine Meldung erscheint, ist aber einer von den 3 Schlüsseln vorhanden keine Meldung erscheint?

Danke Euch für die Hilfe,
Kasimir

  

Betrifft: AW: Fehler abfangen, wenn Datei nicht vorhanden? von: Nepumuk
Geschrieben am: 15.01.2010 21:08:32

Hallo Kasimir,

warum ließt du nicht einfach mal in der Hilfe nach? Darin ist das ganz genau beschrieben.

On Error GoTo Fehler_Java1
Javapfad = wsh.RegRead("HKLM\Software\JavaSoft\Java Plug-in\1.5.0_01\JavaHome")
GoTo Fehler_überspringen
Fehler_Java1:
Err.Clear
On Error GoTo Fehler_Java2
Javapfad1 = wsh.RegRead("HKLM\Software\JavaSoft\Java Plug-in\1.6.0_03\JavaHome")
GoTo Fehler_überspringen
Fehler_Java2:
Err.Clear
On Error GoTo Fehler_Java3
Javapfad2 = wsh.RegRead("HKLM\Software\JavaSoft\Java Plug-in\1.6.0_17\JavaHome")
GoTo Fehler_überspringen
Fehler_Java3:
MsgBox "Eine Prüfung hat ergeben, dass Sie nicht die richtige Java-Version installiert haben.", vbCritical, Meldetext & " - Fehlende Java-Version..."
Unload frm_Immoberechnung
Exit Sub
Fehler_überspringen:


Gruß
Nepumuk


  

Betrifft: AW: Fehler abfangen, wenn Datei nicht vorhanden? von: Kasimir
Geschrieben am: 15.01.2010 21:21:04

Hallo Nepumuck,

danke Dir für Deine Antwort. Aber auch mit Deiner Änderung erhalte ich die Fehlermeldung

Automatisierungsfehler
Das System kann die angegeben Datei nicht finden.


wenn z.B. der 1. und der 2. Schlüssel nicht vorhanden sind.

Gruß,
Kasimir


  

Betrifft: AW: Fehler abfangen, wenn Datei nicht vorhanden? von: Nepumuk
Geschrieben am: 15.01.2010 22:03:46

Hallo Kasimir,

scheint vom Script zu kommen. Würde ich aber auch anders machen, nämlich die installierte Version direkt auslesen. Beispiel:

Option Explicit

Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" ( _
    ByVal hKey As Long, _
    ByVal lpSubKey As String, _
    ByRef phkResult As Long) As Long
Private Declare Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" ( _
    ByVal hKey As Long, _
    ByVal dwIndex As Long, _
    ByVal lpValueName As String, _
    ByRef lpcbValueName As Long, _
    ByVal lpReserved As Long, _
    ByRef lpType As Long, _
    ByRef lpData As Any, _
    ByRef lpcbData As Long) As Long
Private Declare Function RegCloseKey Lib "advapi32.dll" ( _
    ByVal hKey As Long) As Long

Private Const HKEY_LOCAL_MACHINE = &H80000002
Private Const BUFFER_SIZE As Long = 255

Private Sub Test()
    
    Dim lngKey As Long, lngIndex As Long, lngNameLength As Long, lngKeyLength As Long
    Dim strName As String, strKey As String
    
    If RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\JavaSoft", lngKey) = 0 Then
        
        strName = Space$(BUFFER_SIZE)
        strKey = Space$(BUFFER_SIZE)
        lngNameLength = BUFFER_SIZE
        lngKeyLength = BUFFER_SIZE
        
        Call RegEnumValue(lngKey, lngIndex, strName, lngNameLength, _
            0, ByVal 0&, ByVal strKey, lngKeyLength)
        
        If lngKeyLength > 0 Then _
            MsgBox Left$(strName, lngNameLength) & " = " & Left$(strKey, lngKeyLength - 1)
        
        Call RegCloseKey(lngKey)
        
    Else
        
        MsgBox "Kein Java installiert"
        
    End If
    
End Sub


Gruß
Nepumuk


  

Betrifft: AW: Fehler abfangen, wenn Datei nicht vorhanden? von: Kasimir
Geschrieben am: 16.01.2010 06:10:07

Hallo Nepumuk,

danke Dir für diesen VBA-Code. Er funktioniert wunderbar. Jetzt wäre mir aber auch wichtig zu verstehen, was genau in dem Code passiert. Könntest Du mir dazu noch ein paar Erklärungen abgeben, was die einzelnen Zeilen machen?
Kann ich damit auch andere Registryeinträge abfragen?

Danke und Gruß,
Kasimir


  

Betrifft: AW: Fehler abfangen, wenn Datei nicht vorhanden? von: Nepumuk
Geschrieben am: 16.01.2010 11:19:06

Hallo Kasimir,

na erst wird der "Ordner" SOFTWARE\JavaSoft geöffnet, und dann die Schlüssel ausgelesen. Da es nur einen gibt (Index = 0) benötigen wir keine Schleife (lngIndex). Wenn der Wert vorhanden ist (lngKeyLength > 0) spuckt die Msgbox den Namen und dem Wert aus. Dann wird der "Ordner" wieder geschlossen. Ich hab jetzt den Begriff Ordner benutzt, das ist nicht ganz richtig, das es sich um eine Datenbank handelt, darin gibt's natürlich keine Ordner, aber um es anschaulicher zu beschreiben ist es Ok.

Wenn du mehrere Schlüssel aus einem "Ordner" lesen willst, machst du eine Do-Loop Schleife darum in der du intIndex nach jedem lesen eines Schlüssels hochzählst. Da du aber nicht sicher sagen kannst, wie viele Schlüssel es sein werden, musst du den Rückgabewert der Leseoperation abfragen.

Ein Beispiel:

Option Explicit

Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" ( _
    ByVal hKey As Long, _
    ByVal lpSubKey As String, _
    ByRef phkResult As Long) As Long
Private Declare Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" ( _
    ByVal hKey As Long, _
    ByVal dwIndex As Long, _
    ByVal lpValueName As String, _
    ByRef lpcbValueName As Long, _
    ByVal lpReserved As Long, _
    ByRef lpType As Long, _
    ByRef lpData As Any, _
    ByRef lpcbData As Long) As Long
Private Declare Function RegCloseKey Lib "advapi32.dll" ( _
    ByVal hKey As Long) As Long

Private Const HKEY_LOCAL_MACHINE = &H80000002
Private Const BUFFER_SIZE As Long = 255
Private Const ERROR_NO_MORE_ITEMS = 259&

Private Sub Test()
    
    Dim lngKey As Long, lngIndex As Long, lngNameLength As Long, lngKeyLength As Long
    Dim strName As String, strKey As String
    
    If RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\JavaSoft", lngKey) = 0 Then
        
        Do
            
            strName = Space$(BUFFER_SIZE)
            strKey = Space$(BUFFER_SIZE)
            lngNameLength = BUFFER_SIZE
            lngKeyLength = BUFFER_SIZE
            
            If RegEnumValue(lngKey, lngIndex, strName, lngNameLength, _
                0, ByVal 0&, ByVal strKey, lngKeyLength) = ERROR_NO_MORE_ITEMS Then Exit Do
            
            If lngKeyLength > 0 Then _
                MsgBox Left$(strName, lngNameLength) & " = " & Left$(strKey, lngKeyLength - 1)
            
            lngIndex = lngIndex + 1
            
        Loop
        
        Call RegCloseKey(lngKey)
        
    Else
        
        MsgBox "Kein Java installiert"
        
    End If
    
End Sub

Gruß
Nepumuk


  

Betrifft: AW: Fehler abfangen, wenn Datei nicht vorhanden? von: Kasimir
Geschrieben am: 16.01.2010 15:24:43

Hallo Nepumuk,

super, danke Dir für Deine Antwort.

Schönes Wochenende noch,
Kasimir


Beiträge aus den Excel-Beispielen zum Thema "Fehler abfangen, wenn Datei nicht vorhanden?"