Excel - VBA - Kopieren von Range

C

Cheetah1337

Gast
Servus,

Irgendwie stehe ich auf der Leitung.
Folgender Fall:

Ich erhalte im Zuge einer Whileschleife alle Ergebnisse für einen zuvor eingegebenen Suchbegriff. (ich nutze quasi die normale Suchfunktion von Excel im Code und breche ab, wenn die "nächste Zelle" mit meinem Suchwert von der Adresse her der des ersten Treffers entspricht.
So weit so gut.

Nun habe ich pro Treffer eine Referenz, von der ich mir Spalten-Index und Zeilen-Index zwischenspeichere um dann damit verschiedene Zellinhalte in dieser Zeile zu Referenzieren und mir quasi eine Übersicht zusammenzukopieren in einem gesonderten "Suchformular".

Kurz einmal eine sehr vereinfachte Version der Tabelle (Rot wären die Suchbegriffe).

1634905497747.png


Ich habe nun sowohl das Datum, als auch die Verbundene Zelle mit der Beschreibung als "Value" einwandfrei kopieren und können und so eine schöne Zusammenfassung in chronologischer Reihenfolge erhalten.
Aber bei der Erweiterung um die beteiligten Mitarbeitern spießt es sich irgendwie. Irgendwas verstehe ich da wohl an der Syntax falsch ...

Im Wesentlichen wäre mein Code für diese Operation folgender:

Code:
Worksheets("Kalender").Range(Cells(Zeile + 1, Spalte), Cells(Zeile + 1, Spalte + 5)).Copy
Cells(Lastrow, 4).Paste

(Zeile, Spalte und Lastrow sind Integervariablen, die auch genau das enthalten, was sie enthalten sollen)

Ich befinde mich im Ziel-Sheet, daher sollte ich die wie bei den anderen Kopiervorgängen nicht extra aufrufen müssen in Zeile 2. (Cells bezieht sich ja immer auf die aktuelle Tabelle, soweit ich weiß?)

Wenn ich NUR die Range zB in einer MsgBox ausgeben lasse zeigt er mir GENAU die Range-Adressierung an die ich erwarte.
Aber sobald ich dann das Makro ausführe crasht er und kommt nicht über diese Zeile hinweg.

Ergebnis sollte dann so aussehen:

1634906146337.png


Formatierung kommt dann noch, aber jo zuerst soll es mal funktionieren hat aber auch keine wirkliche Priorität. (Soll einfach einen schnellen Überblick geben für Projekte die nicht binnen zweier Tage oder mit langer Unterbrechung abgewickelt werden können und jaa es gibt Tools für sowas und neeein meine Firma weigert sich, daher will ich mir das Leben so einfach wie möglich machen.)

Ich nehme an ich habe einfach irgendwas von der Syntax her missverstanden und vermute mal, dass es ziiemlich offensichtlich ist aber ich einfach voll auf der Leitung stehe ... ^^''

Hoffe man kann mir helfen.

LG Cheetah
 
Du kannst es Mal mit "[...].copy Destination:=worksheet.cell(x, y)" versuchen.
Mit der copy - Funktion hatte ich auch schon oft Ärger, daher würde ich sie Parameter dort immer so explizit wie möglich angeben...
 
Hmm mal probieren.
Was mir noch aufgefallen ist: Er schreibt mir die "Copy"-Funktion immer in UPPER Case also "COPY" ... also er korrigiert die Funktion/Methode darauf, egal was ich schreibe. Normal sind diese doch immer UC beim ersten Zeichen und dann LC?
Ergänzung ()

Code:
Worksheets("KALENDER 2021").Range(Cells(Zeile + 1, Spalte), Cells(Zeile + 1, Spalte + 5)).COPY Destination:=Worksheets("SEARCH").Range("D" & Lastrow)

Also das hätte ich jetzt stehen aber er gibt mir einen Error ... "Laufzeitfehler 1004, Anwendungs- oder Objektdefinierter Fehler."
Ergänzung ()

Also ich habe es jetzt mit einer klassischen Range-Definition probiert also "A1" zB und das flutscht ohne irgendein Problem.
Jetzt ist die Frage, was ist an Range(Cells(Zeile + 1, Spalte), Cells(Zeile + 1, Spalte + 5)) so verkehrt?
Ergänzung ()

Code:
With Worksheets("KALENDER 2021")
   
.Range(.Cells(Zeile + 1, Spalte), .Cells(Zeile + 1, Spalte + 5)).COPY Destination:=Worksheets("SEARCH").Range("D" & Lastrow)
   
End With

Damit bekomme ich mal keine Fehlermeldungen, aber jo ... verstehen tu ichs noch nicht wirklich. ^^
Also den Code jetzt an sich schon, nur wieso das vorherige nicht wollte ...
 
Zuletzt bearbeitet von einem Moderator:
Cheetah1337 schrieb:
verstehen tu ichs noch nicht wirklich.
Zauberwort: Referenzieren.

Und da ich gegen COPY, was die Zwischenablage beeinflusst, hier eine Lösung wie ich bevorzugt einsetze:

Code:
Worksheets("Blatt4").Range(Worksheets("Blatt4").Cells(1, 12), _
 Worksheets("Blatt4").Cells(21, 12)) = _
Worksheets("Blatt5").Range(Worksheets("Blatt5").Cells(1, 4), _
 Worksheets("Blatt5").Cells(21, 4)).Value
Was innerhalb der selben Mappe funktioniert.

Zwischen offenen Mappen sieht das ungefähr so aus:
Code:
Set WS1 = "C:\A\WS1.XLS"
Set WS2 = "C:\A\WS2.XLS"
 WS1.Worksheets(1).Range(WS1.Worksheets(1).Cells(1, 78), WS1.Worksheets(1).Cells(1 + AnzZeilen - 1, 78 + AnzSpalten - 1)).Value = _
 WS2.Worksheets(1).Range(WS2.Worksheets(1).Cells(1, 1), WS2.Worksheets(1).Cells(AnzZeilen, AnzSpalten)).Value

In jedem Falle wird jede Angabe korrekt referenziert. Ohne Referenz kann schon der Wechsel zwischen Blättern schieflaufen. Cells(4,33) ist eben immer auf dem aktiven Blatt.

CN8
 
@cumulonimbus8
Dass .Cells implizit ist und sich eben nur auf das aktive Blatt bezieht wusste ich an sich, jedoch dachte ich wenn ich es unter dem richtigen Worksheet laufen lasse ändert sich das. Worksheet("XXX").Range(Cells ...

Deine Version funktioniert auf jeden Fall, aber mein Versuch war halt das Ganze relativ schlank und übersichtlich zu programmieren.
Aber ja mir ist schon öfter untergekommen, dass bei Excel-VBA "brute force" besser funktioniert respektive einfach sicherer ist. ^^

Danke jedenfalls für den Input. :)

LG Cheetah
 
Cheetah1337 schrieb:
Dass .Cells implizit
8-ung Falle! Pass um Himmels willen auf den Punkt vor dem Cells auf. Da kommt dann gar noch ein WITH quer und es geht völlig durcheinander.
(Ich kenne mich; da bemühe ich With, vergesse im Gegeteil den Punkt und habe dann eine Punkt-Landung mit Unfall…)

CN8
 
  • Gefällt mir
Reaktionen: Cheetah1337
Majestro1337 schrieb:
... daher würde ich sie Parameter dort immer so explizit wie möglich angeben...
Das meinte ich übrigens damit - kurz und schlank geht es, wenn man das workbook und worksheet als konstante setzt -
Ich fange auch jeden Code mit set wb = workbooks(Thisworkbook.name) und ws = wb.sheets(x) an.
So ist es dann nur noch ws.range(ws.cells(x,y), ws.cells(x2, y2)), was fast genauso schlank ist aber nicht von irgendwelchen versteckten variablen abhängt...
 
  • Gefällt mir
Reaktionen: Cheetah1337
Zurück
Oben