Ich habe den folgenden Code:
%Vor% Ich weise einen Verweis auf eine Zelle in Zeile 11 von "Sheet1" zu. Mit dieser Referenz% Cut
, die zu einer Position auf "Tabelle2" rotiert, und dann verwende ich die Referenz, um die gesamte Zeile aus "Tabelle1" zu löschen.
Meine Erwartung ist, dass Zeile 11 von "Sheet1" gelöscht wird, wobei die Werte in Spalte A von 101 bis 110 in den Zeilen 1 bis 10 und dann von 112 bis 120 in den Zeilen 11 bis 19 belassen werden.
Was passiert, ist, dass Zeile 11 gelöscht wird (wegen Cut
) und Zeile 5 gelöscht wird.
Bild der Blätter, nachdem der Code ausgeführt wurde:
Die Tatsache, dass Zeile 5 gelöscht wurde, scheint mit der Tatsache in Zusammenhang zu stehen, dass Zeile 5 die Zielzeile auf "Sheet2" der Cut
-Anweisung ist. Und wenn es Zeile 5 auf "Sheet2" gelöscht hätte, könnte ich verstehen, was passiert ist - dh, dass die Referenz als Teil von Cut
auf das andere Blatt repointiert wurde - aber es löscht Zeile 5 auf "Sheet1".
Kann jemand dieses seltsame Verhalten erklären?
Hinweis: Diese Frage wurde von meinen Versuchen inspiriert, diese Antwort zu schreiben, und meine vielen Kommentare dazu frage sie ihnen zu sagen "natürlich EntireRow.Delete
wird deine reihe löschen - warum erzählst du mir, dass es nicht funktioniert".
Verwenden Sie "Kopieren" statt "Ausschneiden"
rng.EntireRow.Copy ws2.Range ("A5")
Die Zeile in Blatt1 A11 muss nicht leer sein, wenn Sie es löschen
Hier ist eine einfachere Version, die das unerwünschte Verhalten zeigt
%Vor%Es scheint ein Fehler in Excel zu sein
Da der Schnitt / Einfügen den Schnittbereich effektiv verschiebt, verschiebt Excel den Verweis auf die neue Position
Excel verschiebt den Verweis auf die richtige Zelle, aber es wird nicht auf das richtige Arbeitsblatt verschoben
Die Referenz wird korrekt verschoben, wenn Sie manuell ausschneiden / einfügen
zum Beispiel:
if, Blatt A1 A1 enthält "= B1"
und Sie schneiden die B1-Zelle B1 und fügen sie in die Zelle C3 der Blatt-2 ein
then Blatt1 Zelle A1 enthält "= Blatt2! C3"
Wie bei @ASH erwähnt, wird Debug.Print rng.Address(external:=True)
vor und nach der Operation Cut
das Ergebnis [workbookName.xlsm]Sheet1!$A
bzw. [workbookName.xlsm]Sheet1!$A
ausgeben, weil das Objekt abgeschnitten und in ein spezifiziertes Ziel eingefügt wird und seine Adresse erhält .
Das Bereichsobjekt, das ein Mitglied des Worksheet-Objekts ist, kann sein übergeordnetes Element nicht ändern und verbleibt somit weiterhin als Mitglied von ws1
. Wenn Sie also ws2.rng.EntireRow.Delete
versuchen, wird der Kompilierungsfehler "Methode oder Datenelement nicht gefunden" generiert.
Mögliche Erklärung - aber keine Entschuldigung für dieses nicht offensichtliche Verhalten:
1) Warum nicht auch das Blatt wechseln? -
Die .Cut
-Methode überschreibt nur die Range
-Definition, weil dies der Fall ist
untergeordnet dem Worksheet
-Objekt, das über ws1 = Worksheets("Sheet1")
gesetzt wurde,
Daher erhält das Objekt ws1
nur einen neuen Zielbereich $ A $ 5, bleibt aber das Originalblatt
2) Warum wird der Quellbereich auf das Ziel geändert? - IMO Art von Minimalismus innerhalb der Methode selbst.
3) Was ist zu tun - setzt den ursprünglichen Bereich zurück (siehe Code unten):
%Vor%