Category Archives: VBA-Befehle

Vorhersagen sind immer schwierig — vor allem über die Zukunft.

Wisst ihr wie ich das gemacht habe? Nein – das Bild ist nicht bearbeitet! Heute beim Programmieren habe ich erstaunt festgestellt, dass in einer Zelle anderer Text steht als in der Bearbeitungsleiste.

Nun – ein paar Zeilen Code:

Range(„E1“).Value = „Nervt Excel?“
Application.ScreenUpdating = True
[Hier muss Code stehen, der einige Sekunden benötigt, um ausgeführt zu werden]
Application.ScreenUpdating = False
Range(„E1“).Value = „Excel nervt!“
Die Zeile

Application.ScreenUpdating = True

bewirkt die Anzeige der „Sanduhr“ und bewirkt, dass nur nur die Tabelle aktualisiert wird – nicht jedoch die Bearbeitungsleiste.

Achtung: Code muss zwei Mal ausgeführt werden, damit ich „Excel nervt!“ und „Nervt Excel?“ sehe.

Viele halten mich für arrogant. Woher wollen die das denn wissen? Ich unterhalte mich ja nicht mit denen!

Erinnern Sie sich noch? Windows 7? Die Beispielbilder: Wüste, Tulpe, Qualle, Koala, …

Ein Teilneer der Excel-VBA-Schulung möchte Bilder per VBA in seine Exceldatei einfügen. Die Dateinamen stehen dabei bereits in einer Exceltabelle.

„Kein Problem – schreiben Sie einfach ein paar Dateinamen in eine Tabelle.“ Alle Teilnehmer verwenden den Ordner „Beispielbilder“, kopieren den Pfad, tippen die Dateinamen mit der Endung ab. Ich verwende meinen eigen Ordner, in dem ich ein paar Urlaubsbilder habe.

Wir lassen das Makro laufen:

Dim strDateiname As String
Dim i As Integer
For i = 1 To ActiveSheet.Range(„A1“).CurrentRegion.wors.Count – 1
strDateiname = ActiveSheet.Range(„A1“).Offset(i, 0).Value
ActiveSheet.Pictures.Insert strDateiname
Next

Während es bei mir funktioniert, erhalten die Teilnehmer eine Fehlermeldung. Die Dateinamen sind doch korrekt geschrieben, oder:

Ein Blick in die Eigenschaften – Registerkarte „Sicherheit“ belehrt mich eines Besseren. Die Datei Wüste heißt „desert.jpg“, die Qualle „jellyfish.jpg, „penguins .jpg“, „lighthouse.jpg“, …

Ich gestehe – das ist mir noch nie aufgefallen, dass die Dateien einen Alias tragen, also dass die Beispielbilder eigentlich einen anderen Dateinamen aufweisen.

Immer auf dem Teppich bleiben – und keine großen Sprünge machen, wenn das Daruntergekehrte verborgen bleiben soll.

Heute in der Excel-VBA-Schulung. Wir erstellen ein Beispiel: Zähle solange eine Nummer hoch, bis es eine Datei mit der entsprechenden Nummer nicht mehr gibt. Speichere dann die Datei unter dieser Nummer.

Bei mir funktioniert das Beispiel. Ein Teilnehmer hatte einen Fehler und rief mich. Ich war erstaunt über die Fehlermeldung:

Dateiname oder -nummer falsch

Noch erstaunter war ich, dass die Datei gespeichert war in:

D:\D:\Eigene Dateien\Excel\…

Zwei Mal D:\D:\ …?!?

Zuerst wollte ich Excel wüst beschimpfen, dann schaute ich mir den Code genauer an. Der Teilnehmer hatte die Datei gespeichert in.

„D:\“ & strPfad & strDatei

Erstaunlich: die Datei ist im Explorer nicht auffindbar. Excel (und VBA) behaupte jedoch, dass der FullName lautet:

D:\D:\Eigene Dateien\Excel\…

Was sagen Sie als Unbeteiligter eigentlich zum Thema Intelligenz?

Manchmal sind es nicht die Fehlermeldungen, die mich amüsieren:

sondern die Kommentare dazu:

„Hallo Rene,

ich verstehe etwas nicht … wenn ich diesen Code: […]

dann bekomme eine Fehlermeldung. Es fehlt ein with block und so.

Danke für deine Hilfe.“

Natürlich konnte ich helfen: „an Objektvariablen musst du etwas mit dem Schlüsselwort SET übergeben, also:

Set xlRange = ActiveSheet.UsedRange

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 kann allem widerstehen – außer der Versuchung. [Oscar Wilde]

Was ist denn nun schon wieder los? Ich möchte eigentlich nur mit dem Befehl Copy ein Blatt in eine andere Datei kopieren:

20170126Kopieren02

Die Antwort finden Sie, wenn Sie genau hinschauen. Das zu kopierende Blatt („YTD“) ist xlSheetVeryHidden. Sie müssen die Eigenschaft Visible entweder auf xlSheetVisible oder auf xlSheetHidden stellen. Danach können Sie ihn ja wieder „sehr gut verstecken“.

Die Ursache

Die Ursache

Was sein muss, muss sein. Und was nicht sein muss? Erst recht. – Heimito von Doderer

Geschmunzelt habe ich schon:

Gestern in der VBA-Schulung haben wir uns Eigenschaften und Methoden von Objekten in Excel VBA angesehen. Beispielsweise von ActiveWorkbook: die Eigenschaften Name, Path, FullName, die Methoden Save, Close und eben auch PrintOut. Mit dem Parameter Copies kann man eine Datei mehrmals ausdrucken lassen, erklärte ich. Ein Teilnehmer wollte wissen, was denn passiere, wenn man die Datei beispielsweise 100.000 Mal ausdrucken würde. Da mein Laptop nicht mit einem Drucker verbunden war, habe ich es getestet: Das Ergebnis:

Maximal 32.767 (215-1) Mal darf man ausdrucken

Maximal 32.767 (215-1) Mal darf man ausdrucken

Ist ja auch logisch: mehr darf man auch nicht in Excel:

32.767 genügt doch auch, oder?

32.767 genügt doch auch, oder?

Jemand der etwas nicht möchte, findet Gründe! – Jemand der etwas möchte, findet Wege!

… und ich finde die Ursache …

Heute in der VBA-Schulung. Ein Teilnehmer fragt mich, wo der Fehler in der folgenden Codezeile ist:

ActiveWorkbook.Worksheets(„Filme“).Activate

warum?

warum?

Nein – ActiveWorkbook ist richtig – es war keine andere Datei offen. Jedoch hatte der Teilnehmer das Tabellenblatt „Filme “ benannt – mit einem Leerzeichen Ende …

Böses Leerzeichen!

Böses Leerzeichen!

Nicht zu löschen!

Heute in der VBA-Schulung fragte mich eine Teilnehmerin, warum sie eine UserForm nicht löschen dürfe. Im ersten Moment war ich verblüfft.

Wo bitte ist "entfernen"?

Wo bitte ist „entfernen“?

Dann fiel mein Blick auf die Titelzeile. Aha – der Fehler war schnell gefunden: an einer anderen Stelle lief noch ein Makro, das gerade unterbrochen war:

Ah!

Ah!

What’s in a name? that which we call a rose || By any other name would smell as sweet (Shakespeare: Romeo & Julia)

Hallo Herr Martin,

doch, doch ich bin ganz sicher. Ich habe der Zelle G16 einen Namen („Betreuer“) gegeben. Aber nach einer Weile verschwindet er – er ist weder links oben im Namensfeld noch im Namensmanager zu sehen. Haben Sie eine Ahnung warum?

Namen verschwinden

Namen verschwinden

Wahrscheinlich wird ihre Datei durch Code (VBA oder VS.NET) gesteuert. Und wahrscheinlich hat dort jemand ein Makro geschrieben, das einen Namen „Betreuer“ anlegt – allerdings unsichtbar.

Man kann herausfinden, welche Namen verwendet wurden, beispielsweise so:

Sub Namenstest()
Dim i As Integer
Dim strListe As String
For i = 1 To ActiveWorkbook.Names.Count
strListe = strListe & vbCr & ActiveWorkbook.Names(i).Name & „:“ & ActiveWorkbook.Names(i).Value & “ sichtbar: “ & ActiveWorkbook.Names(i).Visible
Next

MsgBox strListe

End Sub

Mehrere unsichtbare Namen

Mehrere unsichtbare Namen

Denn: Man kann unsichtbare Namen generieren, die mit der Datei gespeichert werden:

ActiveWorkbook.Names.Add Name:=“Betreuer“, RefersTo:=“$G$35:$K$35″, Visible:=False

Natürlich könnte man morgens vor dem dritten Kaffee ein konstruktives Gespräch führen. Theoretisch wäre ja auch Weltfrieden möglich.

Die Idee, endlich in Excel eine gute (!) Funktion zu implementieren, mit deren Hilfe man zwei Dateien vergleichen kann, war dringend nötig. Und so findet sich seit Excel 2013 (wenn Sie die richtige Version gekauft haben) hinter der Registerkarte „Inquire“ eine Schaltfläche „Dateien vergleichen“:

Dateien vergleichen

Dateien vergleichen

Das Ergebnis von zwei „größeren“ Dateien begeistert:

Tabellen vergleichen

Tabellen vergleichen

Jedoch weniger das Design, wenn es darum geht, VBA-Code zu vergleichen. Zugegeben – die Option ist praktisch – das Ergebnis schwer zu interpretieren.

VBA1 und VBA2

VBA1 und VBA2

Wann geht es endlich weiter?

Heute in der VBA-Schulung ist uns folgende amüsante Sache aufgefallen:

In einer Datei – egal ob in der Personal.xlsb oder einer anderen beliebigen Makrodatei wird ein Makros geschrieben:

Sub Hinkelstein()
Application.Workbooks.Open „E:\Eigene Dateien\Comics\Asterix.xlsx“
MsgBox „Wo ist Obelix?“
End Sub

Legt man in den Optionen das Makro auf einen Shortcut – beispielsweise [Strg] + [q] gibt es keine Probleme.

Verwendet man jedoch [Strg] + [Shift] + [A], wird nur die erste Zeile ausgeführt – nach Öffnen der Datei bricht das Makro ab (auch bei längeren Makros). Muss ich das verstehen?

Nach Asterix ist Schluss

Nach Asterix ist Schluss

we are not amused

Wirklich erstaunlich. In einer Excel sind mehrere Tabellenblätter ausgeblendet:

ausgeblendete Tabellenblätter

ausgeblendete Tabellenblätter

Die Codezeile:

ActiveWorkbook.Worksheets(„Tabelle4“).Activate

selektiert das letzte Blatt und liefert keinen Fehler.

Auch folgender Sachverhalt ist amüsant und erstaunlich:

Der Teilnehmer der VBA-Schulung wollte die Anzahl der Zeilen eines Bereiches mit:

MsgBox ActiveSheet.Range(„A1“).CurrentRegion.Rows.Count

ermitteln. Statt dessen vertippte er sich und schrieb:

MsgBox ActiveSheet.Range(„A1“).CurrentRegion.Count

CurrentRegion.Count liefert die Anzahl der Zellen des Bereichs. Ich hätte etwas anderes erwartet:

20160628Currentregion

Sag mir wo die Punkte sind? – wo sind sie geblieben …

Heute in der VBA-Schulung hat ein Teilnehmer etwas Interessante ausprobiert und festgestellt:

Eine InputBox gibt einen String zurück. Wandelt man ihn mit CInt in eine Integerzahl um oder übergibt ihn an eine vom Typ Integer* deklarierte Variable, so wird der eingegebene Wert 1.5 als 15 zurückgegeben. Ich hätte gedacht, dass 1.5 als Datum (01.05.2016) interpretiert wird. Nein! – Auch jeder andere Wert mit einem Punkt bekommt diesen gelöscht: Punkt ist weder Dezimaltrennzeichen, Tausendertrennzeichen noch Datumstrennzeichen. Erstaunlich, nicht?

Punkte verschwinden

Punkte verschwinden

*) Übrigens auch bei allen anderen Zahlenformaten: Byte, Long, Single, Double und Currency

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.

Auch Gänse haben Füße – Gänsefüße

Ich habe drei mal hinschauen müssen, bis ich den Fehler in folgender VBA-Codezeile gesehen habe:

20160531km01

Was mich stutzig gemacht hat, war, dass der Kommentar nicht grün formatiert war. Ein Nachzählen der Gänsefüßchen hat dann ergeben, dass beim benutzerdefinierten Zahlenformat (Kilometer) nur zwei und nicht drei Anführungszeichen nach dem Text stehen. Das Textende wird durch das Ende der Zeile definiert …

Und schon geht es:

20160531km02

Der programmatische Zugriff auf das Visual Basic-Projekt ist nicht sicher.

Ich gestehe – ich mache es nicht sehr oft. Aber manchmal muss es sein. Code per Makro erzeugen. Oder auf vorhandenen Code zugreifen. Ich wollte alle Makros löschen – nein nicht indem ich die xlsm-Datei als xlsx speichere – die Datei war noch im Format xls und sollte es auch bleiben.

Also: erster Test – und schon eine erstaunliche Fehlermeldung:

Eine Zeile Code und schon ein Fehler

Eine Zeile Code und schon ein Fehler

Was bitte heißt das: „der programmatische Zugriff auf das Visual Basic-Projekt ist nicht sicher.“? Kurz überlegt – klar: Ich muss in den Optionen einstellen, dass ich dem Zugriff auf das VBA-Objektmodell vertraue – und schon klappt es …

20160313VBE02

24 VBComponents findet er.

Apple ist und bleibt anders

Gestern hat mich eine Teilnehmerin in der VBA-Schulung darauf aufmerksam gemacht, dass man auf dem Mac unter Excel 2016 nicht so programmieren kann, wie unter Windows. Und tatsächlich – die Suche ergibt beispielsweise (http://peltiertech.com/office-2016-for-mac-is-here/):

Ein Kommentar zu Excel 2016 auf Mac.

Ein Kommentar zu Excel 2016 auf Mac.

Wieso nicht definiert? – Natürlich gibt es das!

Hallo zusammen. Ich habe ein paar Zeilen VBA-Code abgetippt, den ich in einer Zeitschrift gefunden habe. Aber es läuft nicht. Und ich weiß nicht warum. Kann mir einer helfen?

geht nicht!?!

geht nicht!?!

Die Antwort ist simpel: Wenn Sie genau hinschauen, sehen Sie, dass Sie die Funktion DateSerial nicht richtig geschrieben haben. Sie haben die Ziffer „1“ als letztes Zeichen geschrieben und nicht den Buchstaben „l“ („L“). Ein Tipp zum Codeerstellen: Schreiben Sie immer in Kleinbuchstaben. Wenn Sie die Zeile verlassen, werden sämtliche Schlüsselwörter in Groß- und Kleinschreibung konvertiert. Wenn Sie sich vertippt haben, fällt das sofort auf, weil dann der Text nicht geändert wird.

VBA Code und Farben

Hübsche Frage heute in der Excel-VBA-Schulung: Man kann zwar den „Bezeichnertext“ in Extras / Optionen farblich kennzeichnen – aber kann man auch zwei verschiedene Farben für VBA-Objekte (beziehungsweise Methoden und Eigenschaften) einerseits und einen Namen (zum Beispiel Variablen, Prozedurnamen, …) andererseits unterscheiden. Leider nein – es geht nur eine Farbe. Zugegeben – mich hat das noch nie gestört – ich lasse immer die voreingestellte Farbe Schwarz. So etwas wie unten sichtbar würde ich nicht machen.

Lustige (?!?) Farben

Lustige (?!?) Farben

VBA20160125_2

 

Trauriger VBA-Code

Hallo Herr Martin,

ich habe Ende letzten Jahres an einem Ihrer Seminare (Makros für Anwender) teilgenommen. Es war ein super Seminar. Vielen Dank für diese tolle Erfahrung!

Ich habe mich nun an das erste Makro gesetzt. Leider treten hier jedoch einige Fehler auf. Jedoch ist es mir bisher nicht möglich gewesen, diese Fehler durch Internetrecherche zu beheben.

Da Sie bei dem Seminar auch das Angebot geäußert haben, dass man sich bei Fragen auch nach dem Seminar an Sie wenden kann, würde ich hiermit auf dieses Angebot zurück kommen.
Könnten Sie mir hier vielleicht helfen? Mir ist bewusst das es ein langer Code ist, deshalb bitte einfach sagen, wenn Ihnen dass zu viel ist (da es mir nicht möglich ist, hierfür etwas zu bezahlen).

Ich habe bei diesem Code auch bereits jeden einzelnen Schritt mit einer Bemerkung beschrieben. Anbei der Code:

Sub CM()
‚beginnt das Makro

Workbooks.Open Filename:= _
„I:\Daten\PERSONAL\DATEN\Pers_Entwicklung\Dokumentation\sonstige Schulungen\sonstige_Schulungen.XLS“
‚öffnet Datei sonstige_Schulungen.XLS

Workbooks.Open Filename:= _
„I:\Daten\PERSONAL\DATEN\Pers_Entwicklung\Dokumentation\sonstige Schulungen\Makro\sonst._Schulungen_für_Makros.xlsx“
‚öffnet Datei sonst._Schulungen_für_Makros.xlsx

Workbooks(„sonstige_Schulungen.XLS“).Sheets(„alle“).Range(„B7“).AutoFilter Field:=2, Operator:=xlFilterNoFill
‚filtert in Datei sonstige_Schulungen.XLS, Registerblatt „alle“ in B7 alle Zellen nach Zellen ohne Füllung -> blendet alle Zellen, die als LZK, Austritt oder EZ/MU markiert sind, aus

Workbooks(„sonstige_Schulungen.XLS“).Sheets(„alle“).Range((„A1“), ActiveCell.SpecialCells(xlLastCell)).Copy
‚kopiert in Datei sonstige_Schulungen.XLS, Registerblatt „alle“ die Zellen A1 bis zur letzten gefüllten Zelle

Workbooks(„sonst._Schulungen_für_Makros.xlsx“).Sheets(„sonstige Schulungen“).Range(„A1“).PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:=False, Transponse:=True
‚fügt den kopierten Bereich aus Datei sonstige Schulungen.XLS in Datei sonst._Schulungen_für_Makros.xlsx, Registerblatt „sonstige Schulungen“ (Zellen & Spalten vertauscht) in Zelle A1 ein

Workbooks(„sonst._Schulungen_für_Makros.xlsx“).Sheets(„sonstige Schulungen“).Range(„G11“).AutoFilter Field:=7, Criteria1:=Array(„CM1-I“, „CM1-S“, „CM2-I“, „CM2-S“), Operator:=xlFilterValues
‚filtert in Datei sonst._Schulungen_für_Makros.xlsx, Registerblatt „sonstige Schulungen“ in G11 in allen Zellen nach den Zellen mit den genannten „Kürzeln“

Workbooks(„sonst._Schulungen_für_Makros.xlsx“).Sheets(„sonstige Schulungen“).Range(„A1“, ActiveCell.SpecialCells(xlLastCell)).Copy
‚kopiert in Datei sonst._Schulungen_für_Makros.xlsx, Registerblatt „sonstige Schulungen“ die Zellen A1 bis zur letzten gefüllten Zelle

Workbooks(„sonst._Schulungen_für_Makros.xlsx“).Sheets(„CM“).Range(„A1“).PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:=False, Transponse:=True
‚fügt den kopierten Bereich aus sonst._Schulungen_für_Makros.xlsx, Registerblatt „sonstige Schulungen“ in Registerblatt „Kürzel“ (Zellen & Spalten vertauscht
‚-> somit wieder ursprüngliche Form, wie in Datei sonstige_Schulungen.XLS) in Zelle A1 ein

Workbooks(„sonstige_Schulungen.XLS“).Close
’schließt Datei sonstige_Schulungen.XLS

Workbooks(„sonst._Schulungen_für_Makros.xlsx“).Sheets(„sonstige Schulungen“).Range(„G11“).AutoFilter Field:=7
‚löscht in Datei sonst._Schulungen_für_Makros.xlsx, Registerblatt „sonstige Schulungen“, in Zelle G11 den Filter

Workbooks.Open Filename:= _
„I:\Daten\PERSONAL\DATEN\Pers_Entwicklung\Dokumentation\sonstige Schulungen\Abteilungen\ISCH-CM.xlsx“
‚öffnet Datei ISCH-CM.xlsx

‚Beginn für Schulung CM1
[…]

#####

Hallo Frau R. (haben wir nicht du gesagt im letzten Jahr?),

ich habe Ihr Makro mal „angetestet“ – beim Befehl:

‚fügt den kopierten Bereich aus Datei sonstige Schulungen.XLS in Datei sonst._Schulungen_für_Makros.xlsx, Registerblatt „sonstige Schulungen“ (Zellen & Spalten vertauscht) in Zelle A1 ein

muss der Parameter Transpose und nicht TranspoNse heißen. Dann klappt es.
Ansonsten:
1. Wenn Sie ein Problemchen haben, verwenden Sie den Debugger – also: [F8], [F8], [F8], … Dann bleibt er in der Zeile stehen, in der der Fehler auftritt. Ich weiß – die Meldung die hier erscheint, ist nicht aussagekräftig – ich habe auch zwei Mal hinschauen und „rumspielen“ müssen
2. Ich helfe Ihnen gerne – einfach schreiben!

schöne Grüße aus München

Rene Martin

######

Hallo Rene,

leider habe ich beim Verwenden des Debuggers bereits bei diesem Befehl eine Fehlermeldung, aus der ich nicht schlau werde.

Workbooks(„sonstige_Schulungen.XLS“).Sheets(„alle“).Range((„A1“), ActiveCell.SpecialCells(xlLastCell)).Copy
‚kopiert in Datei sonstige_Schulungen.XLS, Registerblatt „alle“ die Zellen A1 bis zur letzten gefüllten Zelle

Hast du hier auch eine Idee, wo der Fehler liegt?

#####

ja, Melanie,
wenn Du „A1“ schreibst, dann sitzt vielleicht der Cursor auf der Zelle eines anderen Blattes (ActiveCell) und nicht auf dem Blatt „alle“. Versuche mal Folgendes:

Workbooks(„sonstige_Schulungen.XLS“).Sheets(„alle“).Range(Workbooks(„sonstige_Schulungen.XLS“).Sheets(„alle“). („A1“), Workbooks(„sonstige_Schulungen.XLS“).Sheets(„alle“).Range(„A1“).SpecialCells(xlLastCell)).Copy

Du weißt, was ich dazu sagen werde – kein schöner Code – aber für den Anfang okay 😉

klappt das?

####

Ja so funktioniert es 🙂

Jedoch kommt jetzt hier die Fehlermeldung „Objekt unterstützt diese Eigenschaft oder Methode nicht“.

Workbooks(„ISCH-CM.xlsx“).Sheets(„CM1“).Columns(„A:B“).Paste
‚fügt die kopierten Spalten aus Datei sonst._Schulungen_für_Makros.xlsx, Registerblatt „CM“ in Datei ISCH-CM.xlsx, Registerblatt „CM1“, in die Spalten A und B ein
Hallo Melanie,

die Methode Paste darf nicht auf die Spalten, also den Bereich angewendet werden.
Wenn Du den Makrorekorder verwendest, dann zeichnet er etwas auf wie:

Selection.Copy
Range(„B10“).Select
ActiveSheet.Paste

Das heißt: der Befehl muss lauten:
Workbooks(„ISCH-CM.xlsx“).Sheets(„CM1“).Columns(„A:B“).Select
Workbooks(„ISCH-CM.xlsx“).Sheets(„CM1“).Paste

oder:
Workbooks(„ISCH-CM.xlsx“).Sheets(„CM1“).Activate
ActiveSheet.Range(“A1”).Select
ActiveSheet.Paste

klappt das?

#####

Hallo Rene,

super jetzt funktioniert es :-)! Vielen Dank!

Liebe Grüße

Leerzeichen oder Klammer?

Ich gebe zu: so ganz konsequent ist das nicht in VBA. Für Methoden gibt es drei Schreibweisen: Nach einer Methode folgt nichts. Nach einer Methode steht ein Parameter, dann muss ein Leerzeichen geschrieben werden. Nach einer Methode steht ein Parameter und die Methode gibt einen Wert (oder ein Objekt) zurück – dann muss eine Klammer geschrieben werden. Dass es sich bei den drei Befehlen um eine Methode handelt, sieht man, wenn man den Namen der Klasse VBA angibt, also VBA.Beep, VBA.MsgBox, …

Drei Methoden

Drei Methoden

So weit so gut. Erstaunlicherweise kann man auch bei Methoden, die nichts zurückgeben eine Klammer schreiben:

Das funktioniert.

Das funktioniert.

Noch erstaunlicher wird es jedoch, wenn eine Methode mehrere Parameter hat – dann ist die Klammer verboten:

Klammer nicht bei mehreren Parametern!

Klammer nicht bei mehreren Parametern!

Noch erstaunlicher ist es, dass einige Methoden kategorisch die Klammer verbieten:

So nicht!

So nicht!

Aber eben nicht alle Methoden.

Zusammenfassung: Meine Empfehlung: Wenn eine Methode einen Wert zurück gibt, schreibe ich IMMER eine Klammer, wenn sie nichts zurück gibt, schreibe ich NIE eine Klammer. DAS funktioniert immer – ohne Ausnahme. Ehrenwort!

Ein kurzer Hilfetext im Objektkatalog in VBA wäre schön

Eigentlich schade, dass Microsoft es in VBA 7.1 – also nach Excel 97 – 2000 – 2002 – 2003 – 2007 – 2010 – 2013 noch nicht geschafft hat einen kurzen Erklärungstext im Objektkatalog von VBA zu liefern, was diese Funktion denn bedeutet.

Leider kein Hilfetext

Leider kein Hilfetext

Man muss die Funktionstaste F1 drücken und gelangt dann zur Onlinehilfe von Microsoft, wo die Funktion erklärt wird.

Die Onlinehilfe

Die Onlinehilfe