2015-10-29 101 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