剪切&粘贴覆盖范围对象定义

时间:2016-01-27 09:48:18

标签: vba excel-vba copy-paste excel

我发现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个小数点)。

修复并不困难,但我为何第一段代码无效而感到困惑。有没有人有想法?

1 个答案:

答案 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