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.
Compiler-Konstanten
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
 
   -  in Excel 2002 (XP)
 
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
 


Vorheriger Tipp Zum Seitenanfang Nächster Tipp

Startseite | Projekte | Tutorials | API-Referenz | VB-/VBA-Tipps | Komponenten | Bücherecke | VB/VBA-Forum | VB.Net-Forum | DirectX-Forum | Foren-Archiv | DirectX | VB.Net-Tipps | Chat | Spielplatz | Links | Suchen | Stichwortverzeichnis | Feedback | Impressum

Seite empfehlen Bug-Report
Letzte Aktualisierung: Sonntag, 23. Januar 2011