LÖSUNGEN

Prüfen, ob das VBA-Projekt geändert wurde

Jeder Programmierer kennt das Problem: Der Benutzer hat angeblich nichts am Code verändert, und trotzdem funktioniert er nicht mehr. Solchem Ärger können Sie vorbeugen, indem Sie die Datenbank prüfen lassen, ob das VBA-Projekt geändert wurde.

Das ist viel einfacher, als es sich anhört. Zunächst benötigen Sie dazu eine Funktion geaendert, die prüft, ob die in der Registry gespeicherten Informationen über das VBA-Projekt zutreffen. In diesem Fall gibt die Funktion False zurück, andernfalls, also wenn es Änderungen gab, gibt sie True zurück. Um das VBA-Projekt auf Änderungen zu prüfen, werden die folgenden Eigenschaften gespeichert und mit den aktuellen Werten verglichen:

  • Anzahl Module (einschließlich Klassenmodulen)

  • Anzahl Zeilen im Deklarationsbereich eines Moduls

  • Anzahl Zeilen eines Moduls

  • Typ der Module

Darüber hinaus benötigen Sie eine Prozedur Statusermitteln, die den aktuellen Status des VBAProjekts in die Registry schreibt, wenn die Einträge noch fehlen. Als Letztes ist eine Funktion pruefen erforderlich, die Sie im AutoExec-Makro aufrufen und die abhängig vom Rückgabewert der Funktion geaendert die gewünschten Aktionen durchführt. In der Beispielsprozedur wird Access geschlossen, wenn das Projekt manipuliert wurde.

Neben dem Code müssen Sie noch einen Verweis erstellen, indem Sie in der Entwicklungsumgebung Extras/Verweise auswählen und das Kontrollkästchen vor dem Eintrag Microsoft Visual Basic for Applications Extensibility 5.3 aktivieren.

'Prüft, ob das VBA-Projekt manipuliert wurde
Function geaendert() As Boolean
Dim strSchluessel As String
Dim objKomp As VBComponent
Dim lngI As Long
geaendert = False
strSchluessel = Application.CurrentDb.Name
'Prüfen, ob Einstellungen vorhanden sind
If GetSetting(strSchluessel, "VBA", _
"Anzahl Module", "-1") = "-1" Then
'Eintrag nicht vorhanden
'Werte ermitteln und eintragen
Statusermitteln
End If
If Application.VBE.ActiveVBProject.FileName = _
strSchluessel Then
If GetSetting(strSchluessel, "VBA", _
"Anzahl Module", "-1") <> _
CStr(Application.VBE.ActiveVBProject. _
VBComponents.Count) Then
geaendert = True
Exit Function
End If
'On Error Resume Next
For lngI = 1 To Application.VBE.ActiveVBProject. _
VBComponents.Count
Set objKomp = Application.VBE. _
ActiveVBProject.VBComponents.Item(lngI)
If GetSetting(strSchluessel, objKomp.Name, _
"Typ", "-1") <> CStr(objKomp.Type) Then
geaendert = True
Exit Function
End If
If (objKomp.Type = vbext_ct_StdModule) _
Or (objKomp.Type = vbext_ct_ClassModule _
) Then
If GetSetting(strSchluessel, _
objKomp.Name, "Zeilen", "-1") <> _
CStr(objKomp.CodeModule.CountOfLines _
) Then
geaendert = True
Exit Function
End If
If GetSetting(strSchluessel, _
objKomp.Name, "DecZeilen", "-1") <> _
CStr(objKomp.CodeModule. _
CountOfDeclarationLines) Then
geaendert = True
Exit Function
End If
End If
Next lngI
End If
End Function
Sub Statusermitteln()
Dim strSchluessel As String
Dim objKomp As VBComponent
Dim lngI As Long
strSchluessel = Application.CurrentDb.Name
'Prüfen, ob Einstellungen vorhanden sind
If Application.VBE.ActiveVBProject.FileName = _
strSchluessel Then
SaveSetting strSchluessel, "VBA", _
"Anzahl Module", Application.VBE. _
ActiveVBProject.VBComponents.Count
For lngI = 1 To Application.VBE. _
ActiveVBProject.VBComponents.Count
Set objKomp = Application.VBE. _
ActiveVBProject
VBComponents.Item(lngI)
SaveSetting strSchluessel, objKomp.Name, _
"Typ", objKomp.Type
If (objKomp.Type = vbext_ct_StdModule) Or _
(objKomp.Type = vbext_ct_ClassModule) Then
SaveSetting strSchluessel, _
objKomp.Name, "Zeilen", _
objKomp.CodeModule.CountOfLines
SaveSetting strSchluessel, _
objKomp.Name, "DecZeilen", _
objKomp.CodeModule. _
CountOfDeclarationLines
End If
Next lngI
End If
End Sub
Function pruefen()
Dim boolG As Boolean
boolG = geaendert()
If boolG = True Then
MsgBox "Das VBA-Projekt wurde manipuliert!" & _
vbCrLf & "Die Anwendung wird beendet!"
Application.Quit
Else
MsgBox "Alles OK!"
End If
End Function