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方法或数据成员”。