EntireRow.Delete scheint falsche Zeilen zu löschen

8

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".

    
YowE3K 18.06.2017, 08:07
quelle

4 Antworten

1

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"

    
jsotola 26.06.2017 16:52
quelle
0

Probieren Sie meinen Code:

%Vor%     
Lovedeep sharma 23.06.2017 09:25
quelle
0

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.

    
curious 01.07.2017 20:17
quelle
0

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%     
T.M. 27.01.2018 19:52
quelle

Tags und Links