切换单元格宏 - 奇怪的行为

时间:2015-10-29 21:30:49

标签: excel-vba vba excel

我创建了一个宏,用于在两个单元格之间切换内容。虽然它有效,但我认为它可以用更优雅的方式编写。

考虑下面的例子:

enter image description here

在上一张图片中,您可以选择前两个单元格(" Jack""")。运行宏后,将切换所选单元格的内容。

工作代码是:

Sub SwitchCells()

    Dim R As Range
    Set R = Range(Selection.Address)

    Dim Temp As String

    If R.Count = 2 Then
        Temp = R(1).Value
        R(1) = R(2)
        R(2) = Temp
    End If

End Sub

虽然有效,但我希望临时变量也是一个Range对象(而不是前一个例子中的String),这样宏就可以在对象之间切换位置。我想做这样的事情

Sub SwitchCells()

    Dim R As Range
    Set R = Range(Selection.Address)

    Dim Temp As Range

    If R.Count = 2 Then
        Set Temp = R(1)
        R(1) = R(2)
        R(2) = Temp
    End If

End Sub

宏的第二个版本中的问题是当R(1)获得R(2)的值时,临时变量Temp

也是如此

似乎Temp不是变量,而是指向变量地址的指针。

我不太明白exaclty为什么会这样。你可以解释或指出这种行为的原因吗?

感谢您的时间。

爱德华。

1 个答案:

答案 0 :(得分:0)

Range是一种对象类型。宏的第二个版本中的Temp之类的变量将保存对您设置的对象的引用 - 在这种情况下为R(1)。它不会创建该对象的新副本,因此对R(1)的任何更改都将反映在Temp中。

解决此问题的常规方法是创建一个新对象并将相关值复制到该对象上。遗憾的是,Range对象无法直接创建,只作为Worksheet对象的一部分存在:

Dim r As Range
' This line won't compile because we can't create a new Range
Set r = New Range
' This line will trigger a runtime error
Set r = CreateObject("Excel.Range")

对于位于同一列并且彼此相邻的两个单元格的特定情况,有一个简单的解决方法:

R(2).Cut
R(1).Insert Shift:=xlDown