Zum Inhalt springen

VBA in Excel/ XL4-Makros in VBA verwenden

Aus Wikibooks


Zum Aufruf von XL4-Makros in VBA

[Bearbeiten]

Es gibt Bereiche – beispielsweise das Setzen oder Auslesen der PageSetup-Eigenschaften –, in denen VBA deutliche Performance-Nachteile gegenüber alten XL4-Makros aufzeigt. Zudem bieten XL4-Makros Features, die von den VBA-Entwicklern nicht mehr berücksichtigt wurden. Dazu gehört unter anderem die Möglichkeit, Werte aus geschlossenen Arbeitsmappen auszulesen. Der Aufruf von XL4-Makros ist – wie in den nachfolgenden Prozeduren gezeigt wird – aus VBA heraus möglich. Man beachte die Laufzeitschnelligkeit im Vergleich zu VBA-Makros.

Programmierbeispiele

[Bearbeiten]

Tabelle FalseLinks

Auslesen eines Wertes aus geschlossener Arbeitsmappe

[Bearbeiten]
Function xl4Value(strParam As String) As Variant    
    xl4Value = ExecuteExcel4Macro(strParam)
End Function  

Sub CallValue()  
   Dim strSource As String   
   strSource = _
      "'" & _
      Range("A2").Text & _ 
      "\[" & Range("B2").Text & _ 
      "]" & Range("C2").Text & _ 
      "'!" & Range("D2").Text 
   MsgBox "Zellwert Zelle A1: " & xl4Value(strSource)
End Sub  


oder:
Sub Zelle_auslesen()
   Dim Adresse As String, Zeile As Integer, Spalte As Integer, Zellbezug As String
   Pfad = "D:\neue Dokumente\"
   Datei = "Urlaub 2009.xls"
   Register = "Kalender"
   Zeile = 14: Spalte = 20 ' entspricht T14
   Zellbezug = Cells(Zeile, Spalte).Address(ReferenceStyle:=xlR1C1)
   
   Adresse = "'" & Pfad & "[" & Datei & "]" & Register & "'!" & Zellbezug

   Ergebnis = ExecuteExcel4Macro(Adresse)
   MsgBox ("Wert der Zelle T14: " & Ergebnis)

End Sub

Auslesen des ANZAHL2-Wertes aus geschlossener Arbeitsmappe

[Bearbeiten]
Function xl4CountA(strParam As String) As Variant    
    xl4CountA = _
      ExecuteExcel4Macro("CountA(" & strParam & ")")
End Function  

Sub CallCountA()  
   Dim strSource As String   
   strSource = _
      "'" & _
      Range("A3").Text & _ 
      "\[" & Range("B3").Text & _ 
      "]" & Range("C3").Text & _ 
      "'!" & Range("D3").Text 
   MsgBox "ANZAHL2 in A1:A100: " & xl4CountA(strSource)
End Sub

Auslesen einer Summe aus geschlossener Arbeitsmappe

[Bearbeiten]
Function xl4Sum(strParam As String) As Variant    
    xl4Sum = _
      ExecuteExcel4Macro("Sum(" & strParam & ")")
End Function  

Sub CallSum()  
   Dim strSource As String   
   strSource = _
      "'" & _
      Range("A4").Text & _ 
      "\[" & Range("B4").Text & _ 
      "]" & Range("C4").Text & _ 
      "'!" & Range("D4").Text 
   MsgBox "SUMME in A1:B100: " & xl4Sum(strSource)
End Sub

Auslesen eines SVERWEIS-Wertes aus geschlossener Arbeitsmappe

[Bearbeiten]
Function xl4VLookup(strParam As String) As Variant    
    xl4VLookup = ExecuteExcel4Macro _
      ("VLookup(""" & Range("E5").Text & _ 
      """, " & strParam & ", " & _
      Range("F5").Text & ", " & _ 
      Range("G5").Text & ")") 
End Function  

Sub CallVLookup()  
   Dim strSource As String   
   strSource = _
      "'" & _
      Range("A5").Text & _ 
      "\[" & Range("B5").Text & _ 
      "]" & Range("C5").Text & _ 
      "'!" & Range("D5").Text 
   MsgBox "SVERWEIS in A1:B100: " & _
      xl4VLookup(strSource)
End Sub

Auslesen einer Tabelle aus geschlossener und Einlesen in neue Arbeitsmappe

[Bearbeiten]
Sub ReadTable()  
   Dim wks As Worksheet  
   Dim intRow As Integer, intCol As Integer    
   Dim strSource As String   
   Application.ScreenUpdating = False 
   Set wks = ActiveSheet 
   Workbooks.Add
   For intRow = 1 To 20  
      For intCol = 1 To 2  
         strSource = _
            "'" & _
            wks.Range("A3").Text & _ 
            "\[" & wks.Range("B2").Text & _ 
            "]" & wks.Range("C2").Text & _ 
            "'!R" & intRow & "C" & intCol
         Cells(intRow, intCol).Value = _
            xl4Value(strSource)
      Next intCol 
   Next intRow 
   Application.ScreenUpdating = True 
End Sub

SVERWEIS aus XL4 anwenden

[Bearbeiten]

Bei Eingabe eines Suchbegriffes in Spalte A SVERWEIS-Wert in Spalte B eintragen Der Code muss sich im Klassenmodul der Tabelle befinden. Die Daten werden aus der geschlossenen Arbeitsmappe ohne Formeleinsatz ausgelesen.

Private Sub Worksheet_Change(ByVal Target As Range)     
   Dim strSource As String   
   If Target.Column <> 1 Then Exit Sub    
   With Worksheets("FalseLinks")  
      strSource = _
         "'" & _
         .Range("A5").Text & _ 
         "\[" & .Range("B5").Text & _ 
         "]" & .Range("C5").Text & _ 
         "'!" & .Range("D5").Text 
   End With  
   Target.Offset(0, 1).Value = _
      xl4VLookupEvent(strSource, Target.Text)
End Sub  

Private Function xl4VLookupEvent( _  
   strParam As String, _  
   strFind As String) As Variant   
   With Worksheets("FalseLinks")  
      xl4VLookupEvent = _
         ExecuteExcel4Macro("VLookup(""" & strFind & _
         """, " & strParam & ", " & _
         .Range("F5").Text & ", " & _ 
         .Range("G5").Text & ")") 
   End With  
End Function

Namen über XL4 erstellen und ausblenden

[Bearbeiten]

Über XL4-Makros können Namen vergeben werden, die über die VBA-Eigenschaft Visible nicht angezeigt und den Befehl Delete nicht gelöscht werden können. Die Namen sind in allen Arbeitsmappen gültig und können als globale Variablen benutzt werden. Ihre Lebensdauer ist abhängig von der Excel-Sitzung. Routine zum Erstellen, Aufrufen und Löschen einer Text-Konstanten:

Sub SetHiddenConst()   
   Dim txt As String   
   txt = InputBox("Bitte beliebige Meldung eingeben:", , _  
      "Dies ist meine konstante Meldung!")
   If txt = "" Then Exit Sub    
   Application.ExecuteExcel4Macro _
      "SET.NAME(""MyMsg"",""" & txt & """)"
End Sub  

Sub GetHiddenConst()   
   On Error Resume Next    
   MsgBox Application.ExecuteExcel4Macro("MyMsg")
   If Err > 0 Then  
      Beep
      Err.Clear
      MsgBox "Es wurde keine Konstante initialisiert!"
   End If  
   On Error GoTo 0     
End Sub  

Sub DeleteHiddenConst()  
   Application.ExecuteExcel4Macro "SET.NAME(""MyMsg"")"
End Sub

Benannte Formel über XL4 anlegen und aufrufen

[Bearbeiten]

Routine zum Erstellen, Aufrufen und Löschen der Osterformel.

Sub SetHiddenEastern()  
   Application.ExecuteExcel4Macro _
      "SET.NAME(""OSTERN"",""=FLOOR(DATE(MyYear,3," & _
      "MOD(18.37*MOD(MyYear,19)-6,29)),7)+29"")"
End Sub  

Sub GetHiddenEastern()  
   On Error Resume Next    
   MsgBox Format(Evaluate( _ 
      Application.ExecuteExcel4Macro("OSTERN")), _
      "dd.mm.yyyy")
   If Err > 0 Then  
      Beep
      Err.Clear
      MsgBox "Es wurde kein Ostern initialisiert!"
   End If  
   On Error GoTo 0     
End Sub  

Sub DeleteHiddenEastern() 
   Application.ExecuteExcel4Macro "SET.NAME(""OSTERN"")"
End Sub

Routine zum Erstellen, Aufrufen und Löschen der Kalenderwochen-Formel

[Bearbeiten]
Sub SetHiddenKW()  
   Application.ExecuteExcel4Macro _
      "SET.NAME(""DINkw"",""=TRUNC((MyWK-WEEKDAY(MyWK,2)-" & _
      "DATE(YEAR(MyWK+4-WEEKDAY(MyWK,2)),1,-10))/7)"")"
End Sub  

Sub GetHiddenKW()  
   On Error Resume Next    
   MsgBox Evaluate(Application.ExecuteExcel4Macro("DINkw"))
   If Err > 0 Then  
      Beep
      Err.Clear
      MsgBox "Es wurde keine Kalenderwoche initialisiert!"
   End If  
   On Error GoTo 0     
End Sub  

Sub DeleteHiddenKW() 
   Application.ExecuteExcel4Macro "SET.NAME(""DINkw"")"
End Sub

Druckprogrammierung über XL4-Makros

[Bearbeiten]

Wesentliche Geschwindigkeitsvorteile werden erreicht, wenn XL4-Makros beim Auslesen oder beim Setzen von PageSetup-Eigenschaften eingesetzt werden.

Auslesen der Seitenzahl des aktiven Blattes

Sub PageCountActiveSheet() 
   MsgBox "Seitenanzahl: " & _
      ExecuteExcel4Macro("GET.DOCUMENT(50)")
End Sub

Auslesen der Seitenanzahl eines anderen Blattes

Sub PageCountOtherSheet() 
   MsgBox "Seitenanzahl: " & _
      ExecuteExcel4Macro("Get.document(50,""DeleteRows"")") 
End Sub

Auslesen der Seitenanzahl eines Blattes in einer anderen Arbeitsmappe

Sub PageCountOtherWkb() 
   Dim wkb As Workbook  
   On Error Resume Next    
   Set wkb = Workbooks("Test.xls") 
   If Err > 0 Or wkb Is Nothing Then     
      Beep
      MsgBox "Es muss eine Arbeitsmappe ""Test.xls"" geöffnet sein!"
      Exit Sub  
   End If  
   MsgBox "Seitenanzahl: " & _
      ExecuteExcel4Macro("Get.document(50,""[Test.xls]Tabelle1"")") 
End Sub

Setzen von Druckeigenschaften wie Schriftgröße, Schriftart u.ä.

Sub SetPageSetup()  
   ExecuteExcel4Macro _
      "PAGE.SETUP("""",""&L&""""Arial,Bold""""&" & _
      "8MeineFirma GmbH & Co. KG&R&""""Arial,Bold""""&8&F," & _
      "&D,Seite 1"",0.75,0.75,0.91,0.5,FALSE,FALSE,TRUE,FALSE" & _
      ",2,1,95,#N/A,1,TRUE,,0.75,0.25,FALSE,FALSE)"
End Sub

Auslesen aller horizontalen und vertikalen Seitenumbrüche

Sub GetPageBreaks()  
   Dim horzpbArray() As Integer    
   Dim verpbArray() As Integer    
   Dim intCounter As Integer, intCol As Integer, intRow As Integer    
   ThisWorkbook.Names.Add Name:="hzPB", _
      RefersToR1C1:="=GET.DOCUMENT(64,""PrintPages"")"  
   ThisWorkbook.Names.Add Name:="vPB", _
      RefersToR1C1:="=GET.DOCUMENT(65,""PrintPages"")"  
   intCounter = 1
   While Not IsError(Evaluate("Index(hzPB," & intCounter & ")"))     
      ReDim Preserve horzpbArray(1 To intCounter)    
      horzpbArray(intCounter) = Evaluate("Index(hzPB," & intCounter & ")") 
      intCounter = intCounter + 1
   Wend 
   ReDim Preserve horzpbArray(1 To intCounter - 1)    
   intCounter = 1
   While Not IsError(Evaluate("Index(vPB," & intCounter & ")"))     
      ReDim Preserve verpbArray(1 To intCounter)    
      verpbArray(intCounter) = Evaluate("Index(vPB," & intCounter & ")") 
      intCounter = intCounter + 1
   Wend 
   ReDim Preserve verpbArray(1 To intCounter - 1)    
   Workbooks.Add
   With Range("A1")  
      .Value = "Horizontale Seitenumbrüche (Zeilen):"
      .Font.Bold = True 
   End With  
   For intRow = LBound(horzpbArray, 1) To UBound(horzpbArray, 1)  
      Cells(intRow + 1, 1) = horzpbArray(intRow)
   Next intRow 
   With Range("B1")  
      .Value = "Vertikale Seitenumbrüche (Spalten):"
      .Font.Bold = True 
   End With  
   For intCol = LBound(verpbArray, 1) To UBound(verpbArray, 1)  
      Cells(intCol + 1, 2) = verpbArray(intCol)
   Next intCol 
   Columns.AutoFit
   Columns("A:B").HorizontalAlignment = xlCenter
End Sub

Schließen der Arbeitsmappe verhindern

[Bearbeiten]

In den Excel-Versionen ab XL8 kann über das Workbook_BeforeClose-Ereignis das Schließen der Arbeitsmappe verhindert werden. Dieses Ereignis steht bei der Vorgängerversionen nicht zur Verfügung. Wenn also eine Arbeitsmappe abwärtskompatibel sein soll, kann hier ein XL4-Makro eingesetzt werden.

Sub auto_close() 
   If Worksheets("NoClose").CheckBoxes _  
      ("chbClose").Value = xlOn Then   
      ExecuteExcel4Macro "HALT(TRUE)"
      MsgBox "Das Schließen der Arbeitsmappe " & _
         "ist gesperrt -" & vbLf & _
         "Bitte zuerst die Sperre im " & _
         "Blatt ""NoClose"" aufheben!" 
   End If  
End Sub

Arbeitsblattmenüleiste zurücksetzen

[Bearbeiten]

Über Schaltfläche kann die Arbeitsblattmenüleiste zurückgesetzt und die letzte Einstellung wieder gesetzt werden

Sub MenuBar() 
   With ActiveSheet.Buttons(1) 
      If .Caption = "Menüleiste Reset" Then  
         ExecuteExcel4Macro "SHOW.BAR(2)"
         .Caption = "Menüleiste zurück"
      Else 
         ExecuteExcel4Macro "SHOW.BAR(1)"
         .Caption = "Menüleiste Reset"
      End If  
   End With  
End Sub

Bedingtes Löschen von Zeilen

[Bearbeiten]

Das Löschen von Zeilen nach bestimmten Kriterien kann in VBA eine zeitwaufwendige Aufgabe sein, mit XL4-Makros ist das vergleichsweise schnell und einfach zu lösen

Sub DeleteRows() 
   Dim rngAll As Range, rngCriteria As Range   
   Application.ScreenUpdating = False 
   Set rngAll = Range("A1").CurrentRegion  
   rngAll.Name = "'" & ActiveSheet.Name & "'!Datenbank"
   Set rngCriteria = rngAll.Resize(2, 1).Offset _ 
      (0, rngAll.Columns.Count + 1)
   With rngCriteria 
      .Name = "'" & ActiveSheet.Name & _
         "'!Suchkriterien"
      .Cells(1, 1).Value = "Name"
      .Cells(2, 1).Formula = "'<>Hans W. Herber" 
      ExecuteExcel4Macro "DATA.DELETE()"
      .Clear
   End With  
   Application.ScreenUpdating = True 
End Sub