Der Tee ist gut. Schön kräftig. Wie heißt der? – Jack Daniels.

Ein bisschen nervt es schon. Bill Jelen (Mr. Excel) hat bereits darauf hingewiesen.

Wenn man einen Teil einer Formel nicht korrekt markiert, erhält man einen Fehler oder einen Fehlerwert.

Ich wollte in einer Schulung doch nur schnell etwas erklären und zeigen. Und natürlich kam die Frage, wieso ich ein #NAME am Bildschirm stehen habe:

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!

Das Fitnessstudio habe ich bezahlt. Also sollte ich auch hingehen. Andererseits: das Sofa war auch nicht billig.

Wenn ich in VBA eine Zelle oder einen Zellbereich kopieren oder ausschneiden möchte, verwende ich die Methoden Copy, beziehungsweise Cut mit dem optionalen Parameter Destination, also beispielsweise:

ActiveCell.Copy

oder auch

ActiveCell.Copy

ActiveCell.Copy Destination:=ActiveCell.Offset(1, 0)

Wenn ich nun die Methode PasteSpecial (Inhalte einfügen) verwende, muss ich zwei Befehle schreiben:

ActiveCell.Copy
ActiveCell.Offset(1, 0).PasteSpecial Paste:=xlPasteValidation

beispielsweise um die Datenüberprüfung zu kopieren. Danach läuft um die kopierte Zelle eine „Ameisenlinie“:

Das würde nicht weiter stören – sie verschwindet bei den weiteren Befehlen. Aus ästhetischen Gründen und zur Sicherheit (es kann zu Problemen führen, wenn der Kopiermodus noch aktiv ist), schalte ich den Laufrahmen aus. Hierbei hilft

Application.CutCopyMode = False

Das Erstaunliche:

IntelliSense zeigt die Parameter False und True nicht an. Auf der Seite

https://docs.microsoft.com/de-de/office/vba/api/excel.application.cutcopymode

werden sie genannt:

Nichts verursacht soviel Unruhe wie Menschen, die sich erholen wollen!

Eine Kollegin hat mir letzte Woche eine Excelmappe mit einem Makro geschickt. Das Makro kopiert von mehreren Tabellenblättern Bereiche und fügt sie in eine bestehende Präsentation ein.

Die Kollegin hatte ein paar Fragen zum Makro. Da ich die PowerPoint-Präsentation nicht hatte, änderte ich einige wenige Befehle. Beispielsweise „greife auf Folie 1, 2, 3 zu“ wurde geändert in: „füge eine neue Folie ein“. Der Befehl AddSlides war schnell gefunden:

20170129PP01

Allerdings erhielt ich hier einen Fehler. Nochmal nachschauen:

20170129PP02

Doch: Sildes.AddSlide. Korrekt!

20170129PP03

Ebenso die Parameter: an welcher Stelle soll eine neue Folie erzeugt werden? Welches Layout soll verwendet werden? Ebenfalls korrekt!

Mir dämmerte es. Vor gefühlten 100.000 Jahre habe ich mal PowerPoint programmiert. Und dort herausgefunden, dass die Methode nicht AddSlides heißt, sondern Add. Geändert. Tatsächlich: IntelliSense listet nun sogar die korrekten Layout-Konstanten auf.

20170129PP04

Hum – Microsoft hätte wahrlich in den letzten 15 Jahren einen so wichtigen Befehl wie „füge neue Folie ein“ korrigieren können. Oder bin ich der einzige, dem dies aufgefallen ist?

Ich bin im Niveau ganz flexibel

Ich versuche per VBA benutzerdefinierte Eigenschaften an eine Datei zu binden. Nichts leichter als das, denke ich:

20170126Benutzereigenschaften01

Man definiert eine Variable vom Typ CustomDocumentProperties (oder Property) und fügt zu der Sammlung ein weiteres Element mit der Methode Add hinzu. Sie möchte Name und Value. Klingt vernünftig. Ich werde jedoch eines Besseren belehrt:

20170126Benutzereigenschaften02

Typen unverträglich? Okay – dann ohne Objektverweis:

20170126Benutzereigenschaften03

Falsch Anzahl an Argumenten? Aber IntelliSense hat mir doch … Ein Blick in die Hilfe verrät, dass ich die CustomDocumentProperties vom Typ DocumentProperties deklarieren muss. Aha:

20170126Benutzereigenschaften04

Und richtig: Dort wird noch zwingend der Parameter „LinkToContent“ verlangt.

Nächster Test:

20170126Benutzereigenschaften05

??? Etwas probieren und schon habe ich die Lösung: Obwohl die Eigenschaft „Type“ in eckigen Klammern, also optional, angegeben wurde, ist dieser Wert zwingend erforderlich.

Kaum probiert man eine halbe Stunde – schon klappt es auch. Flexibilität braucht man schon – nicht nur im Niveau:

20170126Benutzereigenschaften06