Microsoft Excel

Excel und VBA: Formeln, Programmierung, Lösungen

Inhalt dieser Seite

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, daß 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 Alaufgrü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"</li>
    
    

Die Programmierbeispiele

  • Aufruf eines Makros in der aktuellen Arbeitsmappe ohne Paramterü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 aktueller 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 Paramterü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 Paramterü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
            Set wdApp = CreateObject("Word.Application")
            wdApp.documents.Open sFile
            wdApp.Run "Project.Modul1.WdMeldung"
            wdApp.Quit
            Set wdApp = Nothing
         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
         sFile = ThisWorkbook.Path & "\vb07_AccessTest.mdb"
         If Dir(sFile) = "" Then
            Beep
            MsgBox "Access-Datenbank wurde nicht gefunden!"
         Else
            Set accApp = CreateObject("Access.Application")
            accApp.OpenCurrentDatabase sFile
            accApp.Run "AcMeldung"
            accApp.CloseCurrentDatabase
            Set accApp = Nothing
         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