Tipp 0430
|
Code abhängig von der VBA-Version ausführen
|
|
|
Autor/Einsender: Datum: |
|
Angie 04.01.2005 |
|
Entwicklungsumgebung: |
|
Excel |
|
|
Es ist durchaus möglich, VBA-Anwendungen zu erstellen, die in mehreren VBA-Versionen
lauffähig sind. In Office 97 wird die VBA-Version 5 verwendet, ab Office 2000
die VBA-Version 6. Beim Versuch Anweisungen, Prozeduren und Funktionen zu verwenden, die es
in der aktuellen VBA-Version nicht gibt, würde es schon beim Kompilieren zu einer
Fehlermeldung kommen, Abhilfe schafft hier jedoch die bedingte Kompilierung und/oder aber auch
späte Bindung (Late Binding).
|
Mit der bedingten Kompilierung können Sie definieren, welcher Quellcode vom Compiler
kompiliert werden soll. Es können Funktionen ergänzt werden, die in früheren
VBA-Versionen fehlen, wie z.B. die Funktionen Split, Join und Replace, die erst ab
VBA 6/Office 2000 zur Verfügung stehen, oder aber auch abhängig von
der Version Funktionen, Methoden usw. unterschiedlich aufgerufen werden. Die Code-Blöcke
für die bedingte Kompilierung werden mit der #If...Then...#Else-Anweisung
gekennzeichnet.
|
|
|
#If VBA6 = False Then
'Code, der nur in Nicht-VBA 6-Umgebung ausgeführt wird
#End If
|
|
|
Bei der Konstante VBA6 handelt es sich um eine vordefinierte Konstante
des Compilers, die den Wert True hat, wenn VBA 6 verwendet wird,
andernfalls False. Eine solche Verzweigung kann sowohl auf Modulebene
als auch innerhalb einer Prozedur verwendet werden. Auf Modulebene definiert, darf sie nur Code
enthalten, den man auch auf Modulebene definieren darf, wie z.B. Prozedurdefinitionen, Datentypen
und Variablendeklarationen, dito innerhalb von Prozeduren und Funktionen. Eine Prozedur oder
Funktion innerhalb obiger #If...Then...#Else-Anweisung wird nur in
VBA 5-Anwendungen kompiliert, in VBA 6-Anwendungen betrachtet der Compiler sie als Kommentar.
|
|
|
Visual Basic für Applikationen (VBA) definiert Konstanten zur exklusiven Verwendung mit der
#If...Then...#Else-Anweisung. Die Funktion dieser Konstanten entspricht
der von Konstanten, die mit der #If...Then...#Else-Anweisung definiert wurden,
mit dem Unterschied, daß sie einen globalen Gültigkeitsbereich haben, d.h., sie sind
überall in einem Projekt anwendbar.
|
Auf 32-Bit-Entwicklungsplattformen werden die Compiler-Konstanten folgendermaßen definiert:
|
|
Konstante |
Rückgabe |
Vba6 |
True, wenn die Entwicklungsumgebung Visual Basic für Applikationen,
Version 6.0, ist, andernfalls False.
|
Win16 |
True, wenn es sich um eine 16-Bit-Windows-Entwicklungsumgebung handelt,
andernfalls False.
|
Win32 |
True, wenn es sich um eine 32-Bit-Windows-Entwicklungsumgebung handelt,
andernfalls False.
|
Mac |
True, wenn die Entwicklungsumgebung Macintosh ist, andernfalls False.
|
Anmerkung
|
Da die hier definierten Konstanten von Visual Basic bereitgestellt werden, können
Sie Ihre eigenen Konstanten auf keiner Ebene mit diesen Namen definieren.
|
|
Beispiel - Protect-Methode in Excel |
|
In Excel können in einer Arbeitsmappe sowohl die ganze Arbeitsmappe als auch Tabellen- und
Diagrammblätter mit der Protect-Methode geschützt werden. Hier sei darauf
hingewiesen, dass sich die Anzahl und Bedeutung der Parameter für die Protect-Methode
der Objekte Workbook, Worksheet und Chart voneinander unterscheiden,
siehe dazu die Protect-Methode in der Excel-VB-Hilfe.
|
Synthax der Protect-Methode des Worksheet-Objekts (Tabellenblatt)
|
- in Excel 97 und Excel 2000
|
|
|
Ausdruck.Protect Password, DrawingObjects, Contents, _
Scenarios, UserInterfaceOnly
|
|
|
|
|
Ausdruck.Protect Password, DrawingObjects, Contents, _
Scenarios, UserInterfaceOnly, AllowFormattingCells, _
AllowFormattingColumns, AllowFormattingRows, _
AllowInsertingColumns, AllowInsertingRows, _
AllowInsertingHyperlinks, AllowDeletingColumns, _
AllowDeletingRows, AllowSorting, AllowFiltering, _
AllowUsingPivotTables
|
|
|
Wie aus der obigen Synthax ersichtlich ist, wurde die Protect-Methode ab Excel 2002 (XP)
durch Parameter ergänzt, die in Excel 2000 und früheren Versionen nicht existieren. Eine
Unterscheidung zwischen Excel 2000 und Excel XP ist also erforderlich, die jedoch mit bedingter
Kompilierung nicht möglich ist, da beide Excel-Versionen VBA 6 verwenden.
Hier hilft jedoch die späte Bindung (Late Binding) weiter, wenn die Variable
objSht nicht als Worksheet-Objekt sondern vom Typ
Objekt deklariert wird. Damit kann der Compiler nicht prüfen, ob die Parameter
der Methode korrekt sind. Es würde zwar bei der Ausführung in Excel 2000 ein Laufzeitfehler
auftreten, dieser könnte jedoch mit einer On Error Resume Next-Anweisung
übergangen werden. Soll die Protect-Methode aber auch in Excel 2000 ausgeführt werden,
muss wie in folgendem Beispiel die Excel-Version ermittelt und die Protect-Methode mit
den entsprechenden Parametern aufgerufen werden.
|
|
|
#If VBA6 Then
'Code, der in VBA 6-Umgebung ausgeführt wird
Sub ProtectWorksheet(ByVal objSht As Object, _
ByVal strPW As String)
If Val(Application.Version) = 9 Then
'Code für Excel 2000
objSht.Protect Password:=strPW
Else
'Code für Excel 2002 (XP) und höher
objSht.Protect Password:=strPW, _
AllowFormattingCells:=True, _
AllowFiltering:=True, _
AllowSorting:=True
End If
End Sub
#Else
'Code, der in Nicht-VBA 6-Umgebung ausgeführt wird
Sub ProtectWorksheet(ByVal objSht As Worksheet, _
ByVal strPW As String)
'Code für Excel 97
objSht.Protect Password:=strPW
End Sub
#End If
Sub Demo_Aufruf()
Dim objSht As Worksheet
Set objSht = ThisWorkbook.Worksheets(1)
ProtectWorksheet objSht, "test"
End Sub
|
|
|
Ohne zwischen den einzelnen VBA-Versionen mit bedingter Kompilierung zu unterscheiden,
könnte die Prozedur aber auch wie folgt aussehen:
|
|
|
Sub ProtectWorksheet(ByVal objSht As Object, ByVal strPW As String)
Dim lngAppVersion As Long
lngAppVersion = Val(Application.Version)
If lngAppVersion = 8 Or lngAppVersion = 9 Then
'Code für Excel 97 und 2000
objSht.Protect Password:=strPW
ElseIf lngAppVersion >= 10 Then
'Code für Excel 2002 (XP) und höher
objSht.Protect Password:=strPW, _
AllowFormattingCells:=True, _
AllowFiltering:=True, _
AllowSorting:=True
Else
End If
End Sub
|
|
|
Der Vollständigkeithalber hier noch die Beispiel-Prozedur zum Aufheben des Tabellenblatt-Schutzes:
|
|
|
Sub UnprotectWorksheet(ByVal objSht As Worksheet, _
ByVal strPW As String)
objSht.Unprotect strPW
End Sub
|
|
|
|