我发现Excel VBA的剪切和粘贴存在一个有趣的问题,涉及使用已定义的范围对象。
这里的代码不起作用:
Sub PasteToRangeDoesntWork()
Dim StRng As Range
Dim j, k, x, y As Integer
Set StRng = Range("A3")
x = 0
j = Range(StRng, StRng.End(xlToRight)).Columns.Count
k = WorksheetFunction.Max(Range(StRng, StRng.End(xlDown)))
For y = 1 To k
While StRng.Offset(x, 0) = y
x = x + 1
Wend
If y < k Then
Range(StRng.Offset(x, 0), StRng.End(xlDown).Offset(o, j - 1)).Select
Selection.Cut
Set StRng = StRng.Offset(0, j + 1)
ActiveSheet.Paste Destination:=StRng
x = 0
End If
Next y
End Sub
问题是当粘贴到定义的StRng
时,StRng
对象会消失并成为未定义的对象。
这是一个简单的修复,我在下面做过。
Sub PasteToRangeWorks()
Dim StRng As Range
Dim j, k, x, y As Integer
Set StRng = Range("A3")
x = 0
j = Range(StRng, StRng.End(xlToRight)).Columns.Count
k = WorksheetFunction.Max(Range(StRng, StRng.End(xlDown)))
For y = 1 To k
While StRng.Offset(x, 0) = y
x = x + 1
Wend
If y < k Then
Range(StRng.Offset(x, 0), StRng.End(xlDown).Offset(o, j - 1)).Select
Selection.Cut
Set StRng = StRng.Offset(0, j)
ActiveSheet.Paste Destination:=StRng.Offset(0, 1)
Set StRng = StRng.Offset(0, 1)
x = 0
End If
Next y
End Sub
这样做 - 即不将新单元格直接粘贴到StRng
而不是StRng.offset(0,1)
,StRng
对象仍然定义。
有问题的数据是五列。第一列是一个整数(值从1到7),下一列是文本,后跟一个带日期的列,最后是两列通用格式数据(2个小数点)。
修复并不困难,但我为何第一段代码无效而感到困惑。有没有人有想法?
答案 0 :(得分:0)
如果使用.Paste方法,则将重置所有与粘贴边界一致的定义范围。确切的&#34;为什么?&#34;只有微软才能解释我害怕的事情。
更好的选择是使用Range.Value和Range.Clear成员;这些不会导致这个问题,速度更快,而且不会弄乱剪贴板。但请注意,这只会复制值而不是格式或任何公式。
这个代码可以是这样的:
Dim SourceRng As Range
Set SourceRng = Range(StRng.Offset(x, 0), StRng.End(xlDown).Offset(0, j - 1))
Set StRng = StRng.Offset(0, j + 1)
Dim DestRng As Range
Set DestRng = StRng.Resize(SourceRng.Rows.Count, SourceRng.Columns.Count)
DestRng.Value = SourceRng.Value
Call SourceRng.Clear