VBA in Excel/ Prozeduraufrufe

Aus Wikibooks


Die Aufruf-Syntax[Bearbeiten]

Die Syntax der Aufrufe von VBA-Programmen und -Unterprogrammen mit oder ohne Übergabe von Parametern kann sehr unterschiedlich sein. Achten Sie bitte bei Ihren VBA-Programmierungen darauf, dass Sie Unterprogramme, die sich in der gleichen Arbeitsmappe wie die aufrufende Prozedur befinden, immer mit Call aufrufen:

    Call Unterprogramm

Das vorangestellte Call ist optional, sollte aber im Interesse der Übersichtlichkeit des Codes dennoch verwendet werden.

Weichen Sie von dieser Regel nur dann ab, wenn Sie aus Ablaufgründen den Namen der aufzurufenden Unterprozedur variabel halten müssen. Weiter unten folgt hierfür ein Beispiel.

Befindet sich die aufzurufende Prozedur in einem Klassenmodul und der Aufruf erfolgt aus einem anderen Modul, so ist dem Aufruf die Klasse voranzustellen:

    Call Tabelle1.Unterprogramm

Als Private deklarierte Funktionen können nicht aufgerufen werden.

Prozeduren in anderen Arbeitsmappen oder Anwendungen werden mit Run gestartet, wobei der Makroname zusammen mit dem Namen des Container-Dokuments als String übergeben wird:

    Run "'Mappe1'!MeinMakro"

Hierbei ist zu beachten:

  • Dateinamen mit Leerzeichen müssen im Run-Aufruf in Apostrophs gesetzt werden
  • Die mit Run aufgerufene Arbeitsmappe wird - wenn nicht geöffnet - im aktuellen Verzeichnis (CurDir) gesucht. Nicht machbar ist:
  Run "'c:\mappe1.xls'!Meldung"

Die Programmierbeispiele[Bearbeiten]

Aufruf eines Makros in der aktuellen Arbeitsmappe ohne Parameterübergabe[Bearbeiten]

Das aufzurufende Unterprogramm befindet sich in einem Standardmodul der aufrufenden Arbeitsmappe.

  • Prozedur: CallSimple
  • Art: Sub
  • Modul: Standardmodul
  • Zweck: Unterprogramm aufrufen
  • Ablaufbeschreibung:
    • Makroaufruf
  • Code:
Sub CallSimple()
   MsgBox "Ein normaler Aufruf!"
End Sub

Aufruf einer Funktion in der aktuellen Arbeitsmappe mit Parameterübergabe[Bearbeiten]

  • Prozedur: CallFunction
  • Art: Sub
  • Modul: Standardmodul
  • Zweck: Funktion mit Parameter aufrufen und Funktionsergebnis melden
  • Ablaufbeschreibung:
    • Meldung eines von einer Funktion ermittelten Wertes
  • Code:
Sub CallFunction()
   MsgBox "Anzahl der Punkte der Schaltfläche: " & vbLf & _
      CStr(GetPixel(ActiveSheet.Buttons(Application.Caller)))
End Sub

Aufruf eines Makros in einer anderen Arbeitsmappe ohne Parameterübergabe[Bearbeiten]

  • Prozedur: CallWkbA
  • Art: Sub
  • Modul: Standardmodul
  • Zweck: Makro einer anderen Arbeitsmappe ohne Parameter aufrufen
  • Ablaufbeschreibung:
    • Variablendeklaration
    • Arbeitsmappenname an String-Variable übergeben
    • Fehlerroutine starten
    • Arbeitsmappe an Objektvariable übergeben
    • Fehlerroutine beenden
    • Wenn die Arbeitsmappe nicht geöffnet ist...
    • Negativmeldung
    • Sonst...
    • Makro in anderer Arbeitsmappe starten
  • Code:
Sub CallWkbA()
   Dim sFile As String
   Dim wkb As Workbook
   sFile = "'vb07_test.xls'"
   On Error Resume Next
   Set wkb = Workbooks(sFile)
   On Error GoTo 0
   If wkb Is Nothing Then
      MsgBox "Die Testarbeitsmappe " & sFile & " wurde nicht gefunden!"
   Else
      Run sFile & "!Meldung"
   End If
End Sub

Aufruf einer Funktion in einer anderen Arbeitsmappe mit Parameterübergabe[Bearbeiten]

  • Prozedur: CallWkbB
  • Art: Sub
  • Modul: Standardmodul
  • Zweck: Funktion einer anderen Arbeitsmappe mit Parameter aufrufen
  • Ablaufbeschreibung:
    • Variablendeklaration
    • Arbeitsmappenname an String-Variable übergeben
    • Fehlerroutine starten
    • Arbeitsmappe an Objektvariable übergeben
    • Fehlerroutine beenden
    • Wenn die Arbeitsmappe nicht geöffnet ist...
    • Negativmeldung
    • Sonst...
    • Funktion in anderer Arbeitsmappe aufrufen und Ergebnis melden
  • Code:
Sub CallWkbB()
   Dim sFile As String
   Dim wkb As Workbook
   sFile = "'vb07_test.xls'"
   On Error Resume Next
   Set wkb = Workbooks(sFile)
   On Error GoTo 0
   If wkb Is Nothing Then
      MsgBox "Die Testarbeitsmappe " & sFile & " wurde nicht gefunden!"
   Else
      MsgBox Run(sFile & "!CallerName", Application.Caller)
   End If
End Sub

Aufruf eines Makros in einem Klassenmodul einer anderen Arbeitsmappe[Bearbeiten]

  • Prozedur: CallWkbC
  • Art: Sub
  • Modul: Standardmodul
  • Zweck: Ein Makro im Klassenmodul einer anderen Arbeitsmappe aufrufen
  • Ablaufbeschreibung:
    • Variablendeklaration
    • Arbeitsmappenname an String-Variable übergeben
    • Fehlerroutine starten
    • Arbeitsmappe an Objektvariable übergeben
    • Fehlerroutine beenden
    • Wenn die Arbeitsmappe nicht geöffnet ist...
    • Negativmeldung
    • Sonst...
    • Makro in anderer Arbeitsmappe starten
  • Code:
Sub CallWkbC()
   Dim sFile As String
   Dim wkb As Workbook
   sFile = "'vb07_test.xls'"
   On Error Resume Next
   Set wkb = Workbooks(sFile)
   On Error GoTo 0
   If wkb Is Nothing Then
      MsgBox "Die Testarbeitsmappe " & sFile & " wurde nicht gefunden!"
   Else
      Run sFile & "!Tabelle1.CallClassModule"
   End If
End Sub

Word-Makro aus Excel-Arbeitsmappe aufrufen[Bearbeiten]

  • Prozedur: CallWord
  • Art: Sub
  • Modul: Standardmodul
  • Zweck: Ein Makro in einem Word-Dokument aufrufen
  • Ablaufbeschreibung:
    • Variablendeklaration
    • Name des Worddokumentes an String-Variable übergeben
    • Wenn die Datei nicht existiert...
    • Negativmeldung
    • Sonst...
    • Word-Instanz bilden
    • Word-Dokument öffnen
    • Word-Makro aufrufen
    • Word-Instanz schließen
    • Objektvariable zurücksetzen
  • Code:
Sub CallWord()
   Dim wdApp As Object
   Dim sFile As String
   sFile = ThisWorkbook.Path & "\vb07_WordTest.doc"
   If Dir$(sFile) = "" Then
      MsgBox "Test-Word-Dokument " & sFile & " wurde nicht gefunden!"
   Else
      With CreateObject("Word.Application")
          .documents.Open sFile
          .Run "Project.Modul1.WdMeldung"
          .Quit
      End With
   End If
End Sub

Access-Makro aus Excel-Arbeitsmappe aufrufen[Bearbeiten]

  • Prozedur: CallAccess
  • Art: Sub
  • Modul: Standardmodul
  • Zweck: Ein Makro in einer Access-Datenbank aufrufen
  • Ablaufbeschreibung:
    • Variablendeklaration
    • Name der Access-Datenbank an String-Variable übergeben
    • Wenn die Datei nicht existiert...
    • Negativmeldung
    • Sonst...
    • Acess-Instanz bilden
    • Access-Datenbank öffnen
    • Access-Makro aufrufen
    • Access-Instanz schließen
    • Objektvariable zurücksetzen
  • Code:
Sub CallAccess()
   Dim accApp As Object
   Dim sFile As String
   ' Pfad, wenn die Access-MDB im gleichen Verzeichnis wie die XLS-Datei liegt 
   sFile = ThisWorkbook.Path & "\vb07_AccessTest.mdb"
   If Dir(sFile) = "" Then
      Beep
      MsgBox "Access-Datenbank wurde nicht gefunden!"
   Else
      With CreateObject("Access.Application")
          .OpenCurrentDatabase sFile
          .Run "AcMeldung"
          .CloseCurrentDatabase
      End With
   End If
End Sub

Aufruf von Prozeduren in der aktuellen Arbeitsmappe mit variablen Makronamen[Bearbeiten]

  • Prozedur: CallMacros
  • Art: Sub
  • Modul: Standardmodul
  • Zweck: Makros mit variablen Makronamen aufrufen
  • Ablaufbeschreibung:
    • Variablendeklaration
    • Die letzten 6 Zeichen des Namens der aufrufenden Schaltfläche an eine String-Variable übergeben
    • Meldung, dass jetzt zu dem Makro mit dem in der String-Variablen hinterlegten Namen verzweigt wird
    • Makro mit dem in der String-Variablen hinterlegten Namen aufrufen
  • Code:
Sub CallMacros()
   Dim sMacro As String
   sMacro = Right(Application.Caller, 6)
   MsgBox "Ich verzweige jetzt zu " & sMacro
   Run sMacro
End Sub