2015-10-29 73 views
0

我已经创建了一个宏用于切换两个单元格之间的内容。虽然它有效,但我认为它可以用更优雅的方式书写。开关单元宏 - 奇怪的行为

考虑如下因素例如:

enter image description here

Supose,在前面的图片选择前两个单元格(“杰克”和“”)。在运行宏之后,切换所选单元格的内容。

工作代码是这样的:

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不一个变量,但是指向变量地址的指针。

我不太明白为什么会发生这种情况。你能解释一下这个行为的原因吗?

谢谢你的时间。

爱德华多。

+0

我觉得既然'Range.Value'是一个'Variant',它被认为是一个值类型,因此在你的第一种情况下它被值传递给'Temp'。 'Range'是一个引用类型,因此在你的第二种情况下(或者换句话说就像你提到的指针)一样被ref传递。阅读[本文](https://msdn.microsoft.com/en-us/library/t63sy5hs.aspx)以获得进一步解释。 – Mike

回答

0

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

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

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