VBA in Excel - Grundlagen: Prozeduraufrufe
Aus Wikibooks
Die Aufruf-Syntax
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
-
Aufruf eines Makros in der aktuellen Arbeitsmappe ohne Parameterübergabe
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
- 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
- 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
- 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
- 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
- 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
- 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
- Prozedur: CallMacros
- Art: Sub
- Modul: Standardmodul
- Zweck: Makros mit variablen Makronamen aufrufen
- Ablaufbeschreibung:
- Variablendeklaration
- Das letzte 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

