Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1128to1132
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Fehler abfangen, wenn Datei nicht vorhanden?

Fehler abfangen, wenn Datei nicht vorhanden?
Kasimir
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
AW: Fehler abfangen, wenn Datei nicht vorhanden?
15.01.2010 21:08:32
Nepumuk
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
Anzeige
AW: Fehler abfangen, wenn Datei nicht vorhanden?
15.01.2010 21:21:04
Kasimir
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
AW: Fehler abfangen, wenn Datei nicht vorhanden?
15.01.2010 22:03:46
Nepumuk
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
Anzeige
AW: Fehler abfangen, wenn Datei nicht vorhanden?
16.01.2010 06:10:07
Kasimir
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
AW: Fehler abfangen, wenn Datei nicht vorhanden?
16.01.2010 11:19:06
Nepumuk
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
Anzeige
AW: Fehler abfangen, wenn Datei nicht vorhanden?
16.01.2010 15:24:43
Kasimir
Hallo Nepumuk,
super, danke Dir für Deine Antwort.
Schönes Wochenende noch,
Kasimir

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige