Category Archives: Makrorekorder

Meine Frau meinte, ich solle ein paar Kaffeebohnen malen. Jetzt ist es auch wieder nicht recht.

VBA-Schulung. Wir üben den Makrorekorder. Ändert man die Schriftart über das Dropdownsymbol in der Registerkarte „Start“,

zeichnet der Makrorekorder auf:

Sub Schriftart()
'
' Schriftart Makro
'

'
    With Selection.Font
        .Name = "Algerian"
        .Size = 11
        .Strikethrough = False
        .Superscript = False
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .Underline = xlUnderlineStyleNone
        .ThemeColor = xlThemeColorLight1
        .TintAndShade = 0
        .ThemeFont = xlThemeFontNone
    End With
End Sub

Also: der ganze Dialog (oder genauer: die Registerkarte „Schrift“ des Dialogs „Zeichen formatieren“) wird aufgezeichnet.

Ein Teilnehmer fragt, was denn aufgezeichnet wird, wenn man im Dialog „Zeichen formatieren“ die Schrift ändert und dies aufzeichnet. Peinlich: ich weiß es nicht. Wir zeichnen auf. Das gleiche Ergebnis – auch hier wird nicht der gesamte Dialog (wie beispielsweise beim „Seite einrichten“) aufgezeichnet, aber auch nicht nur der eine Befehl, der geändert wurde, sondern sämtliche Befehle des Registers:

Was mir an IQ fehlt, hol ich mit BMW wieder auf

VBA-Schulung. Ich zeige und erkläre den Makrorekorder.

Aufgabe: Zeichnen Sie ein Makro auf, das eine Zelle formatiert, beispielsweise: fett, kursiv, Schriftart, Schriftgröße, Ausrichtung, Hintergrundfarbe, … und testen es an einer anderen Zelle.

Eine Teilnehmerin beschwert sich, dass der Makrorekorder nicht „optimale Spaltenbreite“ aufzeichnet.

Was hat sie gemacht? Sie hat ihr Makro in einer anderen Zelle in einer anderen Spalte ausprobiert. Leider zeichnet der Makrorekorder „hart“ den Spaltennamen auf, beispielsweise:

Columns("D:D").EntireColumn.AutoFit

Später erkläre ich den Unterschied zwischen der relativen und der absoluten Aufzeichnung

Wir zeichnen das Makro relativ auf und erhalten:

ActiveCell.Columns("A:A").EntireColumn.EntireColumn.AutoFit

Mein Kommentar: funktioniert, aber „schön“ ist der Code nicht gerade. Besser wäre sicherlich:

ActiveCell.EntireColumn.AutoFit

Forscher haben Mikroplastik im menschlichen Darm gefunden. Die nächste Evolutionsstufe heißt dann „Lego“.

Hallo Rene,

deine Mails mit positiven Informationen und Anhang erreichten mich.

Themenwechsel 3 von 3:

Falls du an weiteren Fragen rund um EXCEL-VBA Interesse hast, informiere mich einfach. Dazu habe ich dir zwei Dateien mitgesendet.
Die Lösung der Probleme ist kein MUSS.

Die Thematiken:

(1) ein Filterproblem ist bestimmt nicht so schwierig zu lösen. Eine Liste:

Der Filter:

Nach Filtersetzen werden keine Daten angezeigt.

Der Code:

    ActiveSheet.Range("$A$3:$F$12").AutoFilter Field:=4, Criteria1:= _
        ">=01.01.2000", Operator:=xlAnd, Criteria2:="<=31.03.2022"

Hallo Jürgen,

der Filter verlangt einen Datumswert, der in eine Zahl konvertiert wurde:

    ActiveSheet.Range("$A$3:$F$12").AutoFilter _
        Field:=4, 
        Criteria1:= ">=" & CDbl(DateSerial(2000, 1, 1)), _
        Operator:=xlAnd, _
        Criteria2:="<=" & CDbl(DateSerial(2022, 3, 31))

Dann klappt es:


Wenn ich sowieso zur Hölle fahre, kann ich auch die landschaftlich schöne Route nehmen

Merkwürdig. In einer Zelle steht eine Formel:

=SUMMENPRODUKT((JAHR(Tabelle2[Aktionsstart])=2021)*(Tabelle2[Carrier für den Versand]="contoso")*(Tabelle2[Gesamtmenge]))

Ich benötige die Formel und lasse sie vom Makrorekorder aufzeichnen:

    ActiveCell.Formula2R1C1 = _
        "=SUMPRODUCT((YEAR(Tabelle2[Aktionsstart])=2021)*(Tabelle2[Carrier für den Versand]=""contoso"")*(Tabelle2[Gesamtmenge]))"

Baue sie etwas um.

Der Kunde beschwert sich über einen Fehler. Der Grund: die Eigenschaft

Formula2R1C1

ist noch nicht in Excel 2013 verfügbar *ggrrrr*

Warum zeichnet Excel nicht

ActiveCell.FormulaR1C1 = 

auf?

Es gibt Tage, da trete ich nicht ins Fettnäpfchen. Da falle ich in die Fritöse.

Kennst du Anrufe, die beginnen mit einem „hast du mal einen Moment Zeit?“ oder: „störe ich gerade?“

Richtig: Angelika rief am Wochenende an. Meine Kollegin Angelika. Sie bereitet gerade einen Excel-Makro-Kurs vor und suchte einige gute Gedanken für Befehle, die man mit dem Makrorekorder aufzeichnen könne. Dabei stieß sie auf die benutzerdefinierte Kopfzeile.

„Sag mal“, fragte sie, „wenn ich in der Kopfzeile aufzeichne: Seitennummerierung, Datum, Dateiname und Tabellenblattname passiert etwas ganz Komisches.“

Zuerst glaubte ich es nicht. Also – auch aufgezeichnet:

Ich lasse das Makro laufen:

Das Ergebnis verblüfft:

Und noch einmal:

Und wieder:

Und wieder. Und wieder. Und wieder ….

Ich schaue im Code nach:

[...]
    With ActiveSheet.PageSetup
        .LeftHeader = "&P / &N"
        .CenterHeader = "&D / &T"
        .RightHeader = "&Z&F / &A"

Eigentlich alles okay. Ich habe keine Ahnung, was hier passiert!

Ich rate Angelika, im Makrokurs nur den Firmennamen als Text aufzuzeichnen. Das klappt!

Okay – für Datum und Uhrzeit stehen die VBA-Befehle Date und Time zur Verfügung; für den Dateiname ActiveWorkbook.Name (oder Fullname), für den Blattnamen ActiveSheet.Name, aber für die Seitennummer? Ich weiß keine Lösung.

Danke an Angelika Meyer für diesen Hinweis!

Und nur wenig nach der Veröffentlichung des Artikels erreicht mich ein Kommentar von Ernst. Großartig – DAS ist des Rätsels Lösung! Hier sein Kommentar:

Hallo Rene,

dieses eigenartige Verhalten tritt bei mir (Excel 2019) nur dann auf, wenn vor dem Festlegen der PageSetup-Eigenschaften die Application.PrintCommunication-Eigenschaft auf False gesetzt wird. Wenn die Kommunikation mit dem Drucker nicht abgeschaltet wird, tritt dieses Verhalten nicht auf.

Bei der Makroaufzeichnung werden die Befehle
Application.PrintCommunication = False und Application.PrintCommunication = True
verwendet.

Bei Microsoft steht wohl folgender Hinweis:

Legen Sie die PrintCommunication-Eigenschaft auf False fest, um die Ausführung von Code zu beschleunigen, mit dem PageSetup-Eigenschaften festgelegt werden.

Legen Sie die PrintCommunication-Eigenschaft nach dem Festlegen der Eigenschaften auf True fest, um alle im Cache vorhandenen PageSetup-Befehle auszuführen.

Scheinbar klappt dies nicht richtig.

Salü

Ernst

Eine Packung Toffifee hat 600 Kalorien. Aber das stört mich nicht – ich esse ja nicht die Packung!

In einem Formular steht eine Formel. Okay – es befinden sich eine Reihe an Formeln dort – aber einige sind besonders lang. Manchmal soll die Zelle mit einem Wert überschrieben werden und nicht mehr variablen sein (wenn bestimmte Voraussetzungen erfüllt werden, welche die Formel nicht abbildet); dann wiederum soll die Formel zurückgesetzt werden. Also gehe ich auf die Suche – wie heißt der VBA-Code der Formel. Die Berechnung lautet:

=WENN(Datenblatt_Logistikdaten!$B$40="";"";WENN(UND(Datenblatt_Logistikdaten!$B$39="Paket";Datenblatt_Logistikdaten!$B$40="DHL Paket");Datenblatt_Logistikdaten!L16; WENN(UND(Datenblatt_Logistikdaten!$B$39="Paket";Datenblatt_Logistikdaten!$B$40="Hermes Paket");Datenblatt_Logistikdaten!M16; WENN(UND(Datenblatt_Logistikdaten!$B$39="2MH";Datenblatt_Logistikdaten!$B$40="Hermes 2-MH");Datenblatt_Logistikdaten!L47; WENN(UND(Datenblatt_Logistikdaten!$B$39="2MH";Datenblatt_Logistikdaten!$B$40="AO");Datenblatt_Logistikdaten!M47; WENN(UND(Datenblatt_Logistikdaten!$B$39="Spedition";Datenblatt_Logistikdaten!$B$40="DSV");Datenblatt_Logistikdaten!L30; WENN(UND(Datenblatt_Logistikdaten!$B$39="Spedition";Datenblatt_Logistikdaten!$B$40="Hellmann");Datenblatt_Logistikdaten!M30;"")))))))

Ich zeichne mit dem Makrorekorder auf und stutze:

Ein seltsamer Umbruch! Noch erstaunlicher ist er am Ende der Zeile:

Der Makrorekorder bricht die Codezeile nach einer bestimmten Anzahl von Zellen um, was sehr merkwürdig wirkt:

ActiveCell.FormulaR1C1 = _
"=IF(Datenblatt_Logistikdaten!R40C2="""","""",IF(AND(Datenblatt_Logistikdaten!R39C2=""Paket"",Datenblatt_Logistikdaten!R40C2=""DHL Paket""),Datenblatt_Logistikdaten!R[-41]C[8], IF(AND(Datenblatt_Logistikdaten!R39C2=""Paket"",Datenblatt_Logistikdaten!R40C2=""Hermes Paket""),Datenblatt_Logistikdaten!R[-41]C[9], IF(AND(Datenblatt_Logistikdaten!R39C2=""2MH"",Datenblatt_L" & _
        "ogistikdaten!R40C2=""Hermes 2-MH""),Datenblatt_Logistikdaten!R[-10]C[8], IF(AND(Datenblatt_Logistikdaten!R39C2=""2MH"",Datenblatt_Logistikdaten!R40C2=""AO""),Datenblatt_Logistikdaten!R[-10]C[9], IF(AND(Datenblatt_Logistikdaten!R39C2=""Spedition"",Datenblatt_Logistikdaten!R40C2=""DSV""),Datenblatt_Logistikdaten!R[-27]C[8], IF(AND(Datenblatt_Logistikdaten!R39C2=""Sped" & _
"ition"",Datenblatt_Logistikdaten!R40C2=""Hellmann""),Datenblatt_Logistikdaten!R[-27]C[9],"""")))))))" & _
        ""

Nun ja – das kann (und sollte) man ja korrigieren!

My wife asked me why I was talking so softly in the house, I told her I was afraid that Mark Zuckerberg would hear me! She laughed, I laughed, Alexa laughed, Siri laughed and Cortana laughed (James Franco)

Merkwürdig. Ich importiere per VBA Daten aus anderen Tabellen in eine Arbeitsmappe. Die Daten der Importtabelle sind als intelligente Tabelle gespeichert, in der aktuellen Tabelle liegt auch eine intelligente Tabelle. Damit sich diese beiden Tabellen nicht überlagern, ist es wohl das Beste die Tabelle zu löschen. Aber wie heißt der Befehl „In Bereich konvertieren“?

Nun – der Makrorekorder hilft:

Sub ZurueckZuDummerTabelle()
'
' ZurueckZuDummerTabelle Makro
'

'
    
End Sub

Nein – der Makrorekorder hilft nicht! Er zeichnet nur den Befehl auf: lösche das Tabellenformat. Aber nicht: lösche die Tabelle. Also muss ich doch auf die Suche gehen. Ich werde schnell fündig: die Methode heißt Unlist. Damit klappt es:

                For j = 1 To xlBlatt.ListObjects.Count
                    xlBlatt.ListObjects(j).TableStyle = ""
                    ' -- lösche die Formtierung
                    xlBlatt.ListObjects(j).Unlist
                    ' -- in Bereich (zurück) konvertieren
                Next j

Warum nicht gleich?

So viele Spiegel in der Wohnung – und keiner funktioniert richtig!

Hallo René

Interessant finde ich, dass man erst googlen muss, um herauszufinden, dass die Inversmatrix in Excel als Funktion MINV heißt und bei VBA als Worksheetfunction MINVERSE (sogar mit E am Schluss, da kommst echt net drauf von allein)…

Hallo Axel,

Zwei Tipps, damit die nicht googln musst, was MINV heißt:

Der Translator von Mourad Louha (excel-translator.de) Oder du verwendest die Formel, schaltest den Makrorekorder ein, editierst die Formel (bei mir: [F2]) und Makrorekorder STOPP. Er „übersetzt“ dann die Funktionen ins Englische.

Übrigens: Schöne Skizze:- da steckt viel Hirnschmalz drin …

Was geht ab? – Schwarzer Edding schon mal nicht!

Ich glaube, da muss Microsoft nochmal ran!

Ich zeichne ein Makro auf: ein Bild wird eingefügt:

ActiveSheet.Pictures.Insert("F:\Eigene Bilder\Erdbeertörtchen.JPG").Select

Ich möchte den Code etwas verändern:

Und stutze, weil das Objekt „Picture“ nicht in der Liste der Objektvariablen angeboten wird. Ich versuche es trotzdem:

Das Makro

Sub BildEinfuegen()
     Dim xlBlatt As Worksheet
     Dim xlBild As Picture
     
     Set xlBlatt = ActiveSheet
     Set xlBild = xlBlatt.Pictures.Insert("F:\Eigene Bilder\Erdbeertörtchen.JPG")

End Sub

läuft hervorragend. Okay – und was heißt: Bilder verschieben und verkleinern? Der Makrorekorder liefert:

ActiveSheet.Shapes.Range(Array("Picture 8")).Select
Selection.ShapeRange.ScaleWidth 0.3169191919, msoFalse, msoScaleFromTopLeft
Selection.ShapeRange.ScaleHeight 0.3169191919, msoFalse, msoScaleFromTopLeft
Selection.ShapeRange.IncrementLeft 252
Selection.ShapeRange.IncrementTop 54.75

Merkwürdig – ich hänge den veränderten Code an mein Makro:

Dim xlBlatt As Worksheet
Dim xlBild As Picture

Set xlBlatt = ActiveSheet
Set xlBild = xlBlatt.Pictures.Insert("F:\Eigene Bilder\Erdbeertörtchen.JPG")

With xlBild
    .Width = .Width * 0.3169191919
    .Height = .Height * 0.3169191919
    .Left = 252
    .Top = 54.75
    .Visible = True
End With

HIER wird das Picture-Objekt erkannt. Und: läuft doch!

Bio-Bauern behaupten, dass gutes Gras gute Milch gibt. Als ob Kühe kiffen …

Schon mal VBA programmiert? Auf ein VBA-Propjekt Schutz (mit Kennwort) gelegt? Kann nicht geöffnet werden!. Okay – kann geknackt werden:

Kann Makro aufzeichnen? Könnte! Möglich ist nicht. Sollte Kennwort anfragen. Fehlermeldung ist die Folge:

Liebe Microsoftis: In Lektion II: Deutsch für US-amerikanische ITler lernen wir, wie man syntaktisch korrekte Sätze mit einem Subjekt erstellt.

Könnte besser klingen!

Ich mag Männer, die Gefühle zeigen. Wenn neben dem Bett eine Taschentuchbox steht, schauen sie sicherlich häufig traurige Liebesfilme.

Hallo Herr Martin,

Ich melde mich dieses mal mit einer generellen Frage an Sie. Im Moment nervt mich nämlich PowerPoint. Es ist schon gemein, dass es da keinen Makrorekorder gibt.
Ich schätze mal, dass auch Sie ab und zu den Makrorekorder in Excel benutzen, wenn Ihnen mal dieser und jener Befehl nicht einfällt.

Nun, in PowerPoint geht das ja leider nicht. Daher meine Frage, wie gehen Sie eigentlich vor oder wo lesen Sie nach, wenn Sie PowerPoint-Kommandos benötigen und gerade nicht wissen, wie diese lauten?

Momentan beschäftige ich mich mit einer automatisierten Berichtserstellung aus Excel heraus. Das klappt auch alles soweit ganz gut, also neue Präsi aus Vorlage erstellen, Daten aus Excel in Diagramme oder Tabellen einfügen oder auch Diagramme von Excel nach PowerPoint zu exportieren. Schwierig wird es nur dann, wenn ich z.B. Formatierungen ausschließlich in PowerPoint durchführen muss. Ich habe z.B. ewig gebraucht um dahinter zu kommen, wie ich in einer PowerPoint-Tabelle eine Zelle farblich hervorhebe (Präsi.Slides(5).Shapes(„Inhaltsplatzhalter 3“).Table.Cell(a, 1).Shape.Fill.ForeColor.RGB = RGB(255, 0, 0)). Oder einen Pfeil einfügen (ActivePresentation.Slides(1).Shapes.AddShape Type:=msoShapeBentUpArrow, Left:=50, Top:=50, Width:=100, Height:=200), mit Animationen fange ich gar nicht erst an.

Haben Sie da einen Tipp oder ein schlaues Nachschlagewerk? Jemand hat mir mal erzählt (ich glaube, es war Andreas Thehos), dass man mit dem Makrorekorder in Word hier so einiges ableiten kann, aber da bin ich irgendwie noch nicht dahinter gekommen…

Ihnen schon einmal vielen Dank und viele Grüße,

Hallo Herr Dauphin,

das Problem des fehlenden Makrorekorders kenne ich – darüberhinaus gibt es noch weitere Fallstricke:

Werfen Sie mal einen Blick auf das Kapitel „PowerPoint“ aus meinen VBA-lernen-Buch – ich habe den Aufbau erklärt.

Und: Manchmal hilft es, wenn man die Objekte „sauber“ deklariert – Intellisense hilft oft mit der Liste der Eigenschaften und Methoden.

Bei Diagrammen und Grafiken „spicke“ ich manchmal bei Excel und verwende dort den Makrorekorder … aber der Teufel steckt im Detail:

Hilft Ihnen das?

Gesucht tot und/oder lebendig: Schrödingers Katze

Heute in der VBA-Schulung in einem chemischen Konzern. Wir üben Makrorekorder: ein benutzerdefiniertes Zahlenformat wird aufgezeichnet:

Eine Teilnehmerin fragte mich, warum Excel „Wasser“ in die Zelle einfügt. Ich habe zwei Mal hinschauen müssen, bis ich entdeckt hatte, dass Sie versehentlich auf die Zelle H20 geklickt hat und dies per Makrorekorder aufgezeichnet hat …

Wenn du aufhörst, über mich Lügen zu erzählen, werde ich aufhören, über dich Wahrheiten zu verbreiten.

Schon wieder bin ich erstaunt. Ein Kunde möchte, dass seine Pivottabelle, die ich mit VBA erzeuge, kursiv formatiert wird. Da ich keine Ahnung habe, wie der Befehl lautet ein Pivottabellenformat für das Stripset zu ändern, greife ich auf den Makrorekorder zurück. Er zeichnet auf:

Sub Kursiv()
ActiveWorkbook.TableStyles(„contoso-Stil“).TableStyleElements(xlColumnStripe1). _
Clear
ActiveWorkbook.TableStyles(„contoso-Stil“).TableStyleElements(xlColumnStripe1). _
Font.FontStyle = „Kursiv“
With ActiveWorkbook.TableStyles(„contoso-Stil“).TableStyleElements( _
xlColumnStripe1).Interior
.ThemeColor = xlThemeColorAccent4
.TintAndShade = 0.799981688894314
End With

[…]

Ich bin verblüfft: der Befehl

.Font.FontStyle = „Kursiv“

sieht nicht sehr sprach- und länderunabhängig aus. Ich teste – es läuft. Ich ändere die Zeile in die mir bekannte Eigenschaft Italic:

ActiveWorkbook.TableStyles(„contoso-Stil“).TableStyleElements(xlColumnStripe1).Font.Italic = True

Und: es läuft noch immer! Dieser Befehl gefällt mir besser. Makrorekorder – warum kannst du das nicht selbst?

Being funny is not everyone’s first choice

Auf nichts ist mehr Verlass!

Für einen Kunde habe ich ein Add-In für Excel erstellt. Am Ende werden daten in einer Pivottabelle zusammengefasst. Der Kunde möchte noch ein bisschen Farbe ins Spiel bringen. Kein Problem, denke ich – in Pivottabellen lustige Formatierungen einschalten kann man mittels der Pivottable-Formate erreichen. Doch wie heißen sie in Excel? Der Makrorekorder hilft. Ich zeichne die Farbe auf:

ActiveWorkbook.TableStyles(„Rene-Stil“).TableStyleElements(xlColumnStripe1). _
Clear
With ActiveWorkbook.TableStyles(„Rene-Stil“).TableStyleElements( _
xlColumnStripe1).Interior
.ThemeColor = xlThemeColorAccent4
.TintAndShade = 0.399914548173467
End With

Wunderbar!

Und Linien? Ich zeichne auf:

With ActiveWorkbook.TableStyles(„Rene-Stil“).TableStyleElements( _
xlColumnStripe1).Borders(xlEdgeTop)
.ColorIndex = xlAutomatic
.TintAndShade = 0
.Weight = xlThin
.LineStyle = xlNone
End With
With ActiveWorkbook.TableStyles(„Rene-Stil“).TableStyleElements( _
xlColumnStripe1).Borders(xlEdgeBottom)
.ColorIndex = xlAutomatic
.TintAndShade = 0
.Weight = xlThin
.LineStyle = xlNone
End With
With ActiveWorkbook.TableStyles(„Rene-Stil“).TableStyleElements( _
xlColumnStripe1).Borders(xlEdgeLeft)
.ColorIndex = xlAutomatic
.TintAndShade = 0
.Weight = xlThin
.LineStyle = xlNone
End With
With ActiveWorkbook.TableStyles(„Rene-Stil“).TableStyleElements( _
xlColumnStripe1).Borders(xlEdgeRight)
.ColorIndex = xlAutomatic
.TintAndShade = 0
.Weight = xlThin
.LineStyle = xlNone
End With

[…]

Ich teste – lasse den Code abspielen. Was passiert? Nichts! Teste erneut, …

Ich habe eine Weile benötigt, bis ich gesehen hat, dass der Makrorekorder eine dünne schwarze Linie mit der Eigenschaft LineStyle = xlNone aufzeichnet hat ?!? Also: raus damit. Code noch „putzen“ – und schon läuft es!

xlDateiNeu.TableStyles.Add „Rene-Stil“

With xlDateiNeu.TableStyles(„Rene-Stil“)
.ShowAsAvailablePivotTableStyle = True
.ShowAsAvailableTableStyle = False
.ShowAsAvailableSlicerStyle = False
.ShowAsAvailableTimelineStyle = False
End With

xlDateiNeu.TableStyles(„Rene-Stil“).TableStyleElements(xlColumnStripe1).StripeSize = 2
With xlDateiNeu.TableStyles(„Rene-Stil“).TableStyleElements(xlColumnStripe1).Interior
.ThemeColor = xlThemeColorAccent4
.TintAndShade = 0.399945066682943
End With
With xlDateiNeu.TableStyles(„Rene-Stil“).TableStyleElements(xlColumnStripe1).Borders(xlEdgeTop)
.ColorIndex = xlAutomatic
.TintAndShade = 0
.Weight = xlThin
‚.LineStyle = xlNone
End With
With xlDateiNeu.TableStyles(„Rene-Stil“).TableStyleElements(xlColumnStripe1).Borders(xlEdgeBottom)
.ColorIndex = xlAutomatic
.TintAndShade = 0
.Weight = xlThin
‚.LineStyle = xlNone
End With
With xlDateiNeu.TableStyles(„Rene-Stil“).TableStyleElements(xlColumnStripe1).Borders(xlEdgeLeft)
.ColorIndex = xlAutomatic
.TintAndShade = 0
.Weight = xlThin
‚.LineStyle = xlNone
End With
With xlDateiNeu.TableStyles(„Rene-Stil“).TableStyleElements(xlColumnStripe1).Borders(xlEdgeRight)
.ColorIndex = xlAutomatic
.TintAndShade = 0
.Weight = xlThin
‚.LineStyle = xlNone
End With

I ¤ non ASCII-characters

Letzte Woche in der Excel-VBA-Schulung. Um die Objekte näher zu bringen, beginne ich mit mit dem Makrorekorder. Wir zeichnen eine Reihe Befehle auf. Beispielsweise:

Füge in die Kopfzeile ein Bild ein:

ActiveSheet.PageSetup.RightHeaderPicture.Filename = _
„F:\Eigene Bilder\Bali\PIC00020.jpg“
Application.PrintCommunication = False
With ActiveSheet.PageSetup
.PrintTitleRows = „“
.PrintTitleColumns = „“
End With
Application.PrintCommunication = True
ActiveSheet.PageSetup.PrintArea = „“
Application.PrintCommunication = False
With ActiveSheet.PageSetup
.LeftHeader = „“
.CenterHeader = „“
.RightHeader = „&G“
.LeftFooter = „“
.CenterFooter = „“
.RightFooter = „“
[…]

Das Ergebnis:

Wir löschen das Bild und führen das Makro erneut aus. Das Ergebnis: nichts! Ein Blick in den Dialog „Seite einrichten“ zeigt jedoch, dass etwas in der Kopfzeile ist. Ein Bild?

Der Grund ist schnell gefunden: Die Zeile:

Application.PrintCommunication = False

„Gibt an, ob die Kommunikation mit dem Drucker aktiviert ist.“ Deshalb wird zwar das Bild eingefügt aber nicht angezeigt. Also: Zeile löschen – und schon funktioniert es. Manchmal (oft!?!) liefert der Makrorekorder eben doch nicht den besten Code …

Übrigens: auf der Microsoft-Seite findet sich folgende Erklärung:

„Legen Sie die PrintCommunication-Eigenschaft auf False fest, um die Ausführung von Code zu beschleunigen, der PageSetup-Eigenschaften festlegt. Legen Sie die PrintCommunication-Eigenschaft auf True fest, nachdem Sie Eigenschaften zum Ausführen eines Commits aller zwischengespeicherten PageSetup-Befehle festgelegt haben.“

Aha!

 

Wer Rechtschreibfehler findet darf sie behalten.

Amüsant: Ich darf eine Zelle „mfg“ nennen, also ihr den Namen „mfg“ geben.

Aber „mfg2“ darf ich sie nicht nennen:

Der Grund ist einleuchtend: da man Namen über das Namensfeld (links neben der Bearbeitungsleiste) vergeben kann, würde ein dort eingegebener Name zur Zelle MFG2 springen. Deshalb dürfen auch nicht die Namen „MF2“ oder „M2“ vergeben werden. Nur „mfg_2“.

Nicht mehr verständlich ist es jedoch, wenn Sie ein Makro mit dem Makrorekorder aufzeichnen, das sie „mfg2“ nennen. DAS ist nicht erlaubt.

Ganz unverständlich wird die Sache jedoch, wenn Sie im Visual Basic-Editor ein Makro erstellen, das den Namen „mfg2“ trägt. DORT ist der Name erlaubt und bereitet keine Probleme ?!?

Es gibt Dinge über die rede ich nicht einmal mit mir selbst.

Amüsante Sache heute in der VBA-Schulung:

Ein Teilnehmer fragte mich, warum sein Markorekorder nicht funktioniert. Tatsächlich: Beim Versuch ein Makro aufzuzeichnen kam eine erstaunliche Fehlermeldung:

20161121makro01

Komisch?!

Komisch?!

Zuerst schaute ich nach, ob noch ein Makro läuft. Nein. Alles war okay – das Stoppen brachte nicht den gewünschten Erfolg. Dann sah ich es: in einem Modul war ein fehlerhaftes Makro – wahrscheinlich hatte der Teilnehmer beim Kopieren das Sub – End Sub vergessen.

Übrigens: Trotz Fehlermeldung konnte das Makro aufgezeichnet werden …

20161121makro03

Rekorder kaputt?

Die häufigste Frage in der letzten VBA-Schulung war: Warum funktioniert mein Makrorekorder nicht:

20160629Makro01

Das kann verschiedene Ursachen haben (und ich glaube, meine Teilnehmer haben alle gefunden):

 

In VBA läuft noch ein Programm: Ausschalten!

20160629Makro02

Der Cursor befindet sich in einer Zelle: Raus!

20160629Makro03

Die Arbeitsmappe wurde freigegeben: Aufheben!

20160629Makro04

Der Änderungsmodus wurde eingeschaltet: Aufheben!

20160629Makro05

Das Projekt wurde mit einem Kennwort geschützt: Aufheben!

20160629Makro06

Modern ist, was man selbst trägt. Unmodern ist, was andere tragen (Oscar Wilde)

Hätten Sie es gewusst? Oder verstanden? Wie lautet die VBA-Eigenschaft (oder -Methode) für klassisches Design einer Pivottabelle?

Klassisches Design

Klassisches Design

Die Antwort: Der Makrorekorder leistet hier gute Dinge:

With ActiveSheet.PivotTables(„xyz“)
.InGridDropZones = True
.RowAxisLayout xlTabularRow
End With

Ich gestehe: Alleine wäre ich nie darauf gekommen.

Wenn zwei das Gleiche tun, ist es noch lange nicht dasselbe

Der Makrorekorder zeichnet manchmal erstaunlich Dinge auf. Vor allem ist unverständlich, warum er für den gleichen Befehl völlig unterschiedlichen Code aufzeichnet. In der letzten VBA-Schulung stellten wir fest, dass Einfügen / PivotTable in Excel 2010 entweder folgendes Makro aufzeichnet:
Sub Pivot01()
Sheets.Add
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
„Datenbank!R1C1:R76C6″, Version:=xlPivotTableVersion14).CreatePivotTable _
TableDestination:=“Tabelle1!R3C1″, TableName:=“PivotTable1“, _
DefaultVersion:=xlPivotTableVersion14
End Sub
Oder folgendes:

Sub Pivot2()
Sheets.Add
ActiveWorkbook.Worksheets(„Tabelle1“).PivotTables(„PivotTable1″).PivotCache. _
CreatePivotTable TableDestination:=“Tabelle2!R3C1“, TableName:= _
„PivotTable2“, DefaultVersion:=xlPivotTableVersion14
End Sub

Je nachdem, ob man auf das obere Symbol oder das untere klickt …

20160626Pivot02

20160626Pivot01

Übrigens: In Excel 2013/2016 gibt es nur noch ein Symbol für Pivottabelle.

Zu viel Code

Kennen Sie das? Wenn Sie einen Befehl – einen einzigen Befehl mit dem Makrorekorder aufzeichnen, zeichnet Excel sehr, sehr viel Code auf. Warum?

Wenn Sie beispielsweise den Befehl aufzeichnen – Schrift ändern, dann erhalten Sie:

With Selection.Font
.Name = „Arial“
.Size = 11
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ThemeColor = xlThemeColorLight1
.TintAndShade = 0
.ThemeFont = xlThemeFontNone
End With

Wenn Sie aufzeichnen „schreibe in die Kopfzeile den Firmennamen“ erhalten Sie über 50 Zeilen Code für einen Befehl (ActiveSheet.PageSetup.RightHeader = „xyz“ hätte genügt):

... zu viel Code ...

… zu viel Code …

Der Grund: Excel zeichnet an vielen Stellen nicht den einen Befehl, sondern sämtliche Befehle des Dialogfeldes auf, also beispielsweise „Zellen formatieren“ oder „Seite einrichten“. Nun sind Sie gefragt, um die nicht nötigen Zeilen zu löschen.

Makrorekorder zeichnet falschen Code auf

Was passiert denn hier? Ich zeichne mit dem Makrorekorder etwas auf, rufe den Befehl auf – und erhalte eine Fehlermeldung.

Die Antwort: Das ist richtig. An einigen (zugegeben, sehr wenigen) Stellen zeichnet Excel falsch auf. Wenn Sie beispielsweise die Datenüberprüfung mit einer Formel aufzeichnen:

Makrorekorder

Makrorekorder

zeichnet Excel folgenden Code auf:

With Selection.Validation
.Delete
.Add Type:=xlValidateDate, AlertStyle:=xlValidAlertStop, Operator:= _
xlLessEqual, Formula1:=“=TODAY(“
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = „“
.ErrorTitle = „“
.InputMessage = „“
.ErrorMessage = „“
.ShowInput = True
.ShowError = True
End With

Erstaunlicherweise fehlt nach dem TODAY die schließende Klammer.

Oder Sie zeichnen die Formel auf:

=rechts(F2;1)<>“ “

also – verbiete am Ende des Textes ein Leerzeichen.

Der Makrorekorder

Der Makrorekorder

Dann zeichnet der Makrorekorder auf:

.Add Type:=xlValidateCustom, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:=“=rechts(F2;1)<>““ „““

Der korrekte Befehl müsste jedoch lauten:

.Add Type:=xlValidateCustom, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:=“=right(F2,1)<>““ „““

Also in der US-amerikanischen Schreibweise. Der Makrorekorder schafft die Übersetzung an dieser Stelle leider nicht.

Der Makrorekorder zeichnet nicht auf

Das ist richtig: Eine Dinge werden nicht aufgezeichnet. Beispielweise die Eingabe der Eigenschaften. Wenn Sie diesen Befehl aufzeichnen, erhalten Sie ein leeres Makro:

Der Makrorekorder zeichnet nicht auf!

Der Makrorekorder zeichnet nicht auf!

Sie müssen dann in der Hilfe, im Objektkatalog, im Internet oder in einem guten Buch nachschlagen wie der zugehörige VBA-Befehl lautet.