2011-08-28 158 views
2

我正在設置For循環中的範圍。我的代碼工作正常,當我這樣做:For循環中的設置範圍

For Each i in Range("A1":"A5") 
    'Some process code 
Next i 

但我做到這一點時,我沒有得到相同的結果:

For Each i in Range("A1").End(xlDown) 
    'Some Process 
Next i 

的arent兩個代碼相同呢?我應該對第二個進行什麼修改,使其與第一個修改相同,但不會使代碼中的範圍硬編碼?

回答

5

第二個你只能得到範圍內的最後一個單元格,我相信我會從第一個例子A5。相反,你需要做這樣的事情。

我把它構造得像一個小測試,所以你可以看到第一個選項,第二個選項,以及我更喜歡這樣做的一個例子。

Option Explicit 

Sub test() 

    Dim r As Range 
    Dim x As Range 

    ' Make sure there is stuff in Range("A1:A5") 
    Range("A1") = 1 
    Range("A2") = 2 
    Range("A3") = 3 
    Range("A4") = 4 
    Range("A5") = 5 

    ' Your first option 
    For Each x In Range("A1:A5") 
    Debug.Print x.Address & ", " & x 
    Next 

    ' What you need to do to get the full range 
    For Each x In Range("A1", Range("A1").End(xlDown)) 
    Debug.Print x.Address & ", " & x 
    Next 

    ' My preferred method 
    Set r = Range("A1").End(xlDown) 
    For Each x In Range("A1", r) 
    Debug.Print x.Address & ", " & x 
    Next 

End Sub 
+0

我認爲第三種方法是最好的,它的乾淨,並允許更好的代碼閱讀。謝謝。 – Ali

2

最乾淨的方法很可能是將lastRow編號存儲在像這樣的變量中。你可以做串聯在每行:

Dim cell as range 
Dim lastRow As Long 
lastRow = Range("A" & Rows.Count).End(xlUp).row 

For Each cell In Range("A1:A" & lastRow) 

請注意,它使得使用xlUpxlDown之間的差異。

  • xlUp給你在列A中使用最後一個單元(以便啓動在rows.count)
  • XlDown給你最後一個非空白細胞(可以使用範圍(「A1」)。完(xlDown ).Row

你會發現有很多人用「A65536」,而不是rows.count,但65536是不是Excel的某些版本的限制,所以它總是更好地使用rows.count 。