Ausführen eines Makros in mehreren Arbeitsmappen (Microsoft Excel)
Wenn Sie über eine ganze Reihe von Arbeitsmappen verfügen, die Sie mithilfe von Makros verarbeiten möchten, könnten Sie versucht sein, das Verarbeitungsmakro in jede Arbeitsmappe einzufügen (als Auto_Open-Makro) und dann eine Art Routine zum Laden jeder Arbeitsmappe zu schreiben. wiederum und speichern Sie es.
Während dies theoretisch gut klingt, funktioniert es in der Praxis nicht. Warum?
Denn wenn Sie eine Arbeitsmappe unter Makrosteuerung öffnen, wird das Auto_Open-Makro in der geöffneten Arbeitsmappe nicht automatisch ausgeführt. Es gibt drei Möglichkeiten, um dieses Problem zu umgehen.
Das erste besteht darin, Ihr Makro zu wiederholen, damit Sie sich nicht in jeder Arbeitsmappe auf Auto_Open-Makros verlassen. Wenn das Auto_Open-Makro in jeder Arbeitsmappe identisch ist, können Sie den Code dann einfach in eine separate Prozedur in der steuernden Arbeitsmappe verschieben. Angenommen, Sie haben Code verwendet, der diesem Prozess gefolgt ist:
Sub MyMacro() Dim J As Integer Dim sTarget As String Application.ScreenUpdating = False For J = 1 To 999 sTarget = "Book" & Format(J, "000") & ".xls" Workbooks.Open sTarget 'Auto_Open runs here Workbooks(sTarget).Save Next J Application.ScreenUpdating = True End Sub
Dies wird aus bereits erläuterten Gründen nicht funktionieren. Eine Lösung besteht darin, den allgemeinen Auto_Open-Code einfach in eine andere Prozedur zu verschieben und ihn dann nach dem Öffnen der Arbeitsmappe aufzurufen, wie hier gezeigt:
Sub MyMacro() Dim J As Integer Dim sTarget As String Application.ScreenUpdating = False For J = 1 To 999 sTarget = "Book" & Format(J, "000") & ".xls" Workbooks.Open sTarget Workbooks(sTarget).Activate DoCommonCode Workbooks(sTarget).Save Next J Application.ScreenUpdating = True End Sub
Sub DoCommonCode() 'Common code goes here End Sub
Dieser Ansatz funktioniert einwandfrei, vorausgesetzt, die Routine ist dieselbe, die auf all Ihren verschiedenen Arbeitsmappen ausgeführt wird. Wenn die Routinen in jeder Arbeitsmappe unterschiedlich sind, können Sie VBA zwingen, das Auto_Open-Makro auszuführen. Dies erfolgt mithilfe der RunAutoMacros-Methode direkt nach dem Öffnen der Arbeitsmappen:
Workbooks.Open sTarget ActiveWorkbook.RunAutoMacros xlAutoOpen
Mit diesem Ansatz könnten Sie leicht ein Makro erstellen, das einfach jede Arbeitsmappe öffnet (damit die Auto_Open-Makros ausgeführt werden können) und sie dann speichert. Ein solches Makro würde wie folgt aussehen:
Sub RunAutoOpenMacrosInBooks() Dim J As Integer Dim sTarget As String Application.ScreenUpdating = False For J = 1 To 999 sTarget = "Book" & Format(J, "000") & ".xls" On Error Resume Next Workbooks.Open sTarget Windows(sTarget).Activate With ActiveWorkbook If .Name <> ThisWorkbook.Name Then .RunAutoMacros xlAutoOpen .Save .Close End If End With Next i Application.ScreenUpdating = True End Sub
Ein dritter und noch besserer Ansatz besteht darin, sich nicht auf Auto_Open-Makros in jeder Ihrer Arbeitsmappen zu verlassen. Verlassen Sie sich stattdessen auf das Workbook_Open-Ereignis, um Ihr Makro auszuführen. Das Workbook_Open-Ereignis wird automatisch ausgelöst, unabhängig davon, ob die Arbeitsmappe manuell oder in einem anderen Makro geöffnet wird. Der Code, den das Ereignis enthält, wird automatisch ausgeführt, genau wie Sie es von einem Auto_Open-Makro erwarten würden.
_Hinweis: _
Wenn Sie wissen möchten, wie die auf dieser Seite (oder auf einer anderen Seite der ExcelTips-Websites) beschriebenen Makros verwendet werden, habe ich eine spezielle Seite vorbereitet, die hilfreiche Informationen enthält.
ExcelTips ist Ihre Quelle für kostengünstige Microsoft Excel-Schulungen.
Dieser Tipp (1850) gilt für Microsoft Excel 2007, 2010 und 2013. Eine Version dieses Tipps für die ältere Menüoberfläche von Excel finden Sie hier: