我有以下代码:
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 的列 A 中的值,然后在第 11 到第 19 行中保留 112 到 120。
发生的事情是第 11 行被清除(由于
Cut
)和 第 5 行 正在被删除。代码执行后的工作表图像:
删除第 5 行的事实似乎与第 5 行是
Cut
的“Sheet2”上的目标行有关。陈述。如果它删除了“Sheet2”上的第 5 行,我可以理解发生了什么 - 即该引用作为 Cut
的一部分被重新指向另一张表。 - 但它会删除“Sheet1”上的第 5 行。谁能解释这种奇怪的行为?
注意:这个问题的灵感来自我尝试写 this answer ,以及我对那个问题的 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”
关于vba - EntireRow.Delete 似乎删除了不正确的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44612942/