ThisWorkbook vs. ActiveWorkbook

Es kommt in der Makro Programmierung immer mal wieder vor, dass das Makro nicht in dem Excel Workbook läuft, mit dem der User arbeitet.

Zwei Beispiele:

1. Ich ‚öffne‘ eine Dokumentation in einem neuen Worksheet.
2. Speichern unter einem anderen Namen.

Man muss wissen, wie die verschiedenen geöffneten Tabellenblätter angesteuert werden. Für die Unterscheidung wichtig:

Thisworkbook.Name

Ist das Workbook, in dem das Makro läuft.

Activeworkbook.Name

Ist das Aktive Workbook.

Für die konkreten Beispiele:

Ich benutze für meinen Arbeitsalltag ein eigenes Addin, das die gängisten Makros enthält. In diesem befindet sich auch ein (verstecktes) Tabellenblatt „Doku“. Mittels Makrobutton erstellt das Makro ein neues Tabellenblatt und kopiert das Blatt „Doku“ in dieses.

Sub doku(control As IRibbonControl)

On Error GoTo Fehler

Application.ScreenUpdating = False
Application.DisplayAlerts = False

    Workbooks.Add
    ThisWorkbook.Sheets("Doku").Copy Before:=ActiveWorkbook.Sheets(1)
    ActiveWorkbook.Sheets(4).Delete
    ActiveWorkbook.Sheets(3).Delete
    ActiveWorkbook.Sheets(2).Delete
    
Fehler:
Exit Sub
    
End Sub

Bemerkungen zum Code:

(control AS iRibbonControl) 

wird verwendet, wenn man mit einem eigenen Ribbon arbeitet. Das Makro wird dann über einen Makrobutton angesteuert.

On Error Go To Fehler 
Fehler: Exit Sub

Normales Fehlerhandling. Falls etwas nicht klappt, bricht das Makro ab.

Application.Screenupdating = False
Application.DisplayAlerts = False

Mit der ersten Zeile wird die Bildschirmaktualisierung ausgeschaltet, das heisst erst wenn das Makro fertig ist, sieht man was wechselt. Hier zwar marginal, aber das beschleunigt rechenintensive Makros. Mit der zweiten Zeile unterdrückt man „Are You Sure“ Fragen…

Workbooks.Add
ThisWorkbook.Sheets("Doku").Copy Before:=ActiveWorkbook.Sheets(1)

Hier jetzt das eigentliche Thema: Zuerst wird ein neues Workbook hinzugefügt, dann Kopiere das Blatt „Doku“ aus ThisWorkbook (das Workbook wo das Makro läuft) zum ActiveWorkbook (das Workbook, das am Bildschirm eben erstellt wurde und deshalb aktiv ist).

ActiveWorkbook.Sheets(4).Delete
ActiveWorkbook.Sheets(3).Delete
ActiveWorkbook.Sheets(2).Delete

Löscht die drei Tabellenblätter, die es ebenfalls im neuen Workbook hat. Sind leer und deshalb unnütz. Könnte man natürlich auch mit einer Schleife oder sonstwie löschen.
H

Dieser Beitrag wurde unter Excel VBA veröffentlicht. Setze ein Lesezeichen auf den Permalink.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.