【发布时间】:2019-05-30 00:24:08
【问题描述】:
424 错误。有人能告诉我为什么范围变量在剪切后消失了吗?
with sheets(1)
Dim des as range
set des = .range("A15")
.range("A1:A3").cut des
msgbox(des.row+5)
end with
【问题讨论】:
424 错误。有人能告诉我为什么范围变量在剪切后消失了吗?
with sheets(1)
Dim des as range
set des = .range("A15")
.range("A1:A3").cut des
msgbox(des.row+5)
end with
【问题讨论】:
看起来.paste 出于@GSerg 的原因正在清除范围变量。
使用此代码是可行的,但如果你在最后打破它,变量会一直存在,直到粘贴发生。
With Sheets(1)
Set des = .Range("A15")
.Range("A1:A3").Cut
des.Cells(1, 1).Select
MsgBox (des.Row + 5)
ActiveSheet.Paste
End With
如果您将消息框移到粘贴之后,它会清除 des,即使它没有像您的那样在剪切中使用。
我会做更多的调查。 des 对象仍然作为 range 存在,但只是未填充。
这个方法也做了 cut 会做的事情
Dim src As Range
Dim des As Range
With Sheets(1)
Set src = .Range("a1:a3")
Set des = .Range("a15")
des.Resize(src.Rows.Count, src.Columns.Count).Value = src.Value
src.Clear
End With
【讨论】:
Range 对象存储对特定单元格的引用,而不是特定地址。当引用的单元格移动时,Range 对象将跟随。例如。如果您存储 Range("B1"),然后在 A 和 B 之间插入一列,您的变量现在将具有 Range("C1"),因为您的 B1 已向右移动。
当被跟踪的单元格不复存在时,Range 实例将变得不可用。
剪切完全替换了实际的单元格,而不是简单地覆盖它们的内容,因此您的Range 正在跟踪的单元格不再存在,而其他一些单元格现在将假定地址为A15。不过那是一个不同的单元格,所以你的 Range 实例已经消失了。
一个值得注意的例外是当您只销毁Range 的一部分时。在这种情况下,Range 接受新单元格并保持其形状。例如。如果您存储Range("A15:A20") 并在A15 上剪切Range("A1:A3"),则结果范围仍为A15:A20。
【讨论】:
A1:A3 存储到另一个变量中,例如source As Range,你会看到在Cut source 移动到A15:A17,但在Copy 之后它停留在A1:A3。