EntireRow.Delete似乎删除不正确的行

我有以下代码:

Sub test() Dim ws1 As Worksheet Dim ws2 As Worksheet Dim r As Long Dim rng As Range Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2") 'Set some dummy data For r = 1 To 20 ws1.Cells(r, "A").Value = r + 100 ws2.Cells(r, "A").Value = r + 200 Next 'Set a reference to Sheet1!A11 Set rng = ws1.Range("A11") 'Copy Sheet1 row 11 to Sheet2 row 5 rng.EntireRow.Cut ws2.Range("A5") 'Delete Sheet1 row 11 rng.EntireRow.Delete End Sub 

我给“Sheet1”的第11行分配一个单元格的引用。 使用该引用,我将该行Cut到“Sheet2”上的一个位置,然后使用该引用从“Sheet1”中删除整行。

我的期望是,“Sheet1”的第11行将被删除,在第1到第10行的101列保留110的值,然后在第11到19行保留112到120的值。

正在发生的事情是第11行正在清除(由于Cut ), 第5行正在被删除。

代码执行后的图片图像: 代码运行后的工作表的图像

被删除的第5行的事实看起来与第5行是Cut语句的“Sheet2”上的目标行有关。 如果它已经删除了“Sheet2”上的第5行,我可以理解发生了什么 – 即该参考被重新指定为另一个表作为Cut一部分 – 但它删除了“Sheet1”上的第5行。

任何人都可以解释这个奇怪的行为?

注意:这个问题的灵感来自我写这个答案的尝试,我对这个问题的OP的许多评论告诉他们“当然EntireRow.Delete会删除你的行 – 你为什么告诉我它不工作”。

使用“复制”而不是“剪切”

rng.EntireRow.Copy ws2.Range(“A5”)

Sheet1 A11中的行在删除时不必为空

这里是一个简单的版本,显示不良行为

 Sub test() Dim rng As Range Set rng = Sheets("Sheet1").Range("A11") rng.Value = "cut and paste me" Sheets("Sheet1").Range("A11").Cut Sheets("Sheet2").Range("A5") ' rng object not used in this line rng.Select ' selects Sheet1 A5 ... it should be Sheet2 A5 End Sub 

它似乎是一个Excel中的错误

由于剪切/粘贴有效地移动了剪切范围,因此excel将引用移动到新的位置

Excel将引用移动到正确的单元格,但无法移动到正确的工作表

如果您手动剪切/粘贴,参考文件将被正确移动

例如:

如果sheet1单元格A1包含“= B1”

并切割Sheet1单元格B1并将其粘贴到Sheet2单元格C3

那么sheet1单元格A1将包含“= sheet2!C3”

试试我的代码:

 Sub test() Dim ws1 As Worksheet Dim ws2 As Worksheet Dim r As Long Dim rng As Range Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2") 'Set some dummy data For r = 1 To 20 ws1.Cells(r, "A").Value = r + 100 ws2.Cells(r, "A").Value = r + 200 Next 'Set a reference to Sheet1!A11 Set rng = ws1.Range("A11") 'Copy Sheet1 row 11 to Sheet2 row 5 rng.EntireRow.Cut ws2.Range("A5") 'Delete Sheet1 row 11 Range("A:A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete End Sub 

如@ASH提到的,在Cut操作之前和之后Debug.Print rng.Address(external:=True)将分别打印结果[workbookName.xlsm]Sheet1!$A$11[workbookName.xlsm]Sheet1!$A$5 ,原因是它将对象剪切并粘贴到指定的目的地并获取其地址。

范围对象是工作表对象的成员,不能更改它的父对象,因此它继续保持为ws1的成员。 因此,尝试ws2.rng.EntireRow.Delete将生成编译错误“未find方法或数据成员”。