2014-10-01 60 views
0

短版的問題的遍歷`Cells`:在`Range`

這裏的代碼

Dim rng As Range 
Set rng = Selection 
Set rng = rng.Columns(1) 
For Each cl In rng 
    cl.Select ' <-- Break #2 

讓我這個在即時窗口中,如果選擇範圍A1:B37

? rng.address(External:=True) 
[Book2]Sheet1!$A$1:$A$37 

? cl.Address(External:=True) 
[Book2]Sheet1!$A$1:$A$37 

任何人都可以幫助我理解爲什麼cl -> A1:A37而不是cl -> A1請注意,我想象重寫代碼以獲得預期結果。但我想知道這個問題是什麼,並且可能會學到一些新的東西。這就是問題所在。


龍版的問題(如原貼)

我有一個子程序,從而選定(矩形)的工作範圍rng。這裏的相關代碼如下所示。它根據rng的列號ncols分支。

ncols=1,它循環遍歷每個單元clrng,選擇cl並執行一些動作。 當開始選擇A1:A37,該工程確定,如通過在即時窗口輸出在歇進入循環後,右#1(見下面的代碼)

? rng.address(External:=True) 
[Book2]Sheet1!$A$1:$A$37 

? cl.Address(External:=True) 
[Book2]Sheet1!$A$1 

ncols<>1,我想循環遍歷每個單元cl,第一列rng,與以前一樣。 現在,當開始選擇A1:B37,這是不行的,因爲在歇#2

? rng.address(External:=True) 
[Book2]Sheet1!$A$1:$A$37 

? cl.Address(External:=True) 
[Book2]Sheet1!$A$1:$A$37 

任何人都可以幫助我理解爲什麼在這裏cl -> A1:A37代替cl -> A1顯示在即時窗口輸出(如Break#1)? 請注意,我想象重寫代碼以獲得預期結果。但我想知道這個問題是什麼,並且可能會學到一些新的東西。這就是問題所在。

Dim rng As Range 
Set rng = Selection 
Dim ncols As Long 
ncols = rng.Columns.Count 
Dim cl As Range 
' 1- If only one column is selected, ... 
If (ncols = 1) Then 
    For Each cl In rng 
    cl.Select ' <-- Break #1 
    ... 
    Next cl 
' 2- If more than one column is selected, ... 
Else 
    Set rng = rng.Columns(1) 
    For Each cl In rng 
    cl.Select ' <-- Break #2 
    Dim rng2 As Range 
    Set rng2 = Range(cl, cl.Offset(0, ncols - 1)) 
    rng2.Select 
    ... 
    Next cl 
End If 

回答

1

我還沒有機會來測試你的代碼還沒有,但你可以簡單地從缺乏顯式的痛苦:clRange,所以是一個Column和和Area以及任何其他形式的範圍型對象。您可以使用範圍迭代器,如clFor each cl in Rng.Rows...in rng.Columns...rng.Cells等。

換句話說,儘管你可能會希望cl是一個細胞範圍內,除非你把它明確,這樣可能並非如此:

For each cl in rng.Cells 

或者,因爲你定義它作爲單柱,這將是等效的:

For Each cl in rng.Rows 

(在技術上,cl表示範圍在於rng ,但由於它是單列範圍,所以每個「行」也是單個單元格)。

你的代碼實際上可以是相當精簡:

Sub f() 

    Dim rng As Range 
    Dim cl As Range 
    Dim rng2 As Range 

    Set rng = Range(Selection.Address).Resize(, 1) 
    ncols = Range(Selection.Address).Columns.Count 

    For Each cl In rng.Cells 
     cl.Select ' <-- Break #2 

     If nCols > 1 Then 
      Set rng2 = Range(cl, cl.Offset(0, ncols - 1)) 
      rng2.Select 
      '... 
     End If 
    Next cl 

End Sub 
+0

當場(像往常一樣)。我不知道有''範圍''的''''''''。實際上,對* Range.Cells屬性*的Excel幫助令我感到困惑:「返回一個Range對象,它表示指定範圍內的單元格。」在我看來,它應該返回與調用者相同的對象... – 2014-10-01 17:14:36

+0

如何通過測試(即,不檢查代碼)從「rng.Cells」中識別對象「rng」? – 2014-10-01 17:16:11

+0

沒有必要忽略'rng'和'rng.Cells'之間的區別,但通過包含'.Cells',您明確指出了您要實現的迭代類型。這兩個對象應該是相同的,因爲'rng'和'rng.Cells'都代表整個區域。但是通過說'對於rng.Cells中的每個分支,你指定了*你想要怎麼迭代。 – 2014-10-01 17:17:54