2016-04-11 156 views
0

我知道如果使用「範圍對象」垂直移動,例如A1,A2,A3 ...我可以使用範圍代碼(「A」& i),只需更改「i」值。但是,如果要像A1,B1,C1 ...那樣水平移動,那麼使用Range對象可以實現類似的方式嗎?Excel VBA - 如何編程Range對象以水平移動?

回答

0

使用Cells對象。這適用於使用行號和列號,所以Cell(1,1)是A1,Cells(1,2)是B1,Cells(2,2)是B2等。您可以使用Range(Cells(1,1),Cells(2,2))(它是A1:B2)創建一系列單元格。你可以將兩者結合起來,但我通常不會:Range("A1", Cells(2, 2))

如果引用一個範圍對象還可以確保您清楚地瞭解該工作表。如果Sheet1是活動頁面,那麼Range("A1", Worksheets("Sheet2").Cells(2, 2))將引發錯誤,因爲它試圖在Sheet1上的A1和Sheet2上的B2中創建一個範圍。

+0

你知道爲什麼我使用Cells對象,例如鍵入「Cells(1,1)」。並沒有自動完成。即自動顯示屬性,方法等...當我鍵入「範圍(」A1「)。」「?我必須把它像」範圍(單元格(1,1))「。」獲得自動完成? – RealLifePM

+0

對不起,不知道爲什麼沒有自動完成 - 我現在遇到了與'FIND'相同的問題。但是如果我輸入'Cells('然後彈出_Default([RowIndex],[ColumnIndex])消息 –

+0

由於某些原因,Cells的Item屬性不會返回一個Range類型的對象,這就是爲什麼你沒有得到Intellisense – Rory

0

Cells通常是最直接的(也是最簡單的)方式,re:達倫的答案。

儘管可以創建變通方法,以便也可以使用Range方法。有幾種可能性,但最簡單的可能是Range().Offset

表達 .Offset(RowOffset,ColumnOffset)

後者的說法是我們所感興趣的,但要學會整個方法的工作原理是非常有用的。

實例:
Range("A1").Offset(1, 0)等於Range("A2")(一行從A1向下)
Range("A1").Offset(0, 1)等於Range("B1")(一列從A1右側)
Range("C1").Offset(1, 1)等於Range("D2")(一行向下,一個於,從C1
Range("C1").Offset(0, 3)右列等於Range("F1")(三列,以從C1右側)

(你會發現Range().Offset使用就行/列,Cells相同的語法。)

你也可以做一個更迂迴的方式:

Sub arrayTest() 
    Dim letterArray() As String 
    Dim rng As Range 

    ' Declare a bunch of letters here - expand if you need more columns 
    ' Using a 1 as the first letter because remembering Option Base 1 is not something I prefer 
    ' but you may of course do it. In that case, remove the "1:" from the beginning of the string 
    Const letterString As String = "1:a:b:c:d:e:f:g:h:i:j:k:l:m:n:o:p:q:r:s:t:u:v:w:x:y:z" 

    ' Fill an array with our letters 
    letterArray() = Split(letterString, ":") 

    ' Range("A1") 
    Set rng = Range(letterArray(1) & "1") 
    Debug.Print rng.Address 

    ' Range("B2") 
    Set rng = Range(letterArray(2) & "2") 
    Debug.Print rng.Address 

    ' Range("M83") 
    Set rng = Range(letterArray(13) & "83") 
    Debug.Print rng.Address 

    Debug.Print vbCr 
    ' Or we can loop it 
    For i = 1 To UBound(letterArray) 
     Debug.Print Range(letterArray(i) & "1").Address 
    Next i 
End Sub 

$ A $ 1
$省略從環路B $ 2
$ M $ 83

打印出來,因爲它佔用了大量的空間...但運行VBE中的宏並在立即窗口(Ctrl + G)中查看結果。

+0

非常感謝Vegard。 – RealLifePM