2010-10-06 35 views
45

比方說,我有以下代碼時:遍歷的單元格區域中的每個單元賦予了Range對象

Sub TestRangeLoop() 
    Dim rng As Range 
    Set rng = Range("A1:A6") 

    ''//Insert code to loop through rng here 
End Sub 

我希望能夠通過Range對象爲規定的各單元的集合迭代rng。從概念上講,我想做到這一點,像這樣:

For Each rngCell As Range in rng 
    ''//Do something with rngCell 
Next 

我知道我可以通過解析rng.Address和手動構建Range對象解決這個問題,但我希望有,不涉及一個更直接的方式字符串解析。

回答

72
Sub LoopRange() 

    Dim rCell As Range 
    Dim rRng As Range 

    Set rRng = Sheet1.Range("A1:A6") 

    For Each rCell In rRng.Cells 
     Debug.Print rCell.Address, rCell.Value 
    Next rCell 

End Sub 
+1

這個工作完美,但我爲此感到詫異,因爲'Cells'只是一個'Range'對象。事實上,我從'For Each'行的'rRng'中刪除了'.Cells',它仍然有效。 'Range'如何讓它看起來像是'Range'的集合?非常感謝你的幫助! – 2010-10-06 18:25:19

+7

http://www.dailydoseofexcel.com/archives/2004/07/07/the-strange-object/ Cells屬性是此上下文中的默認屬性,所以這就是沒有它的原因。在其他上下文中,Value屬性是默認屬性。所有Range對象都是包含Range對象的集合對象 - 我想是無限的。範圍是一個絕對奇怪的對象,並且每次都打破對象/對象收集範例。但在大多數情況下,它只是起作用。 :) – 2010-10-06 19:46:50

+0

感謝您的額外見解。我希望在大約4年前,當我開始進行VBA編程時,我已經瞭解到「這隻適用於」Range .-)。 – 2010-10-07 01:21:37

11

您可以使用Range.Rows,Range.ColumnsRange.Cells。這些集合中的每一個都包含Range對象。

這裏是你如何可以修改迪克的例子,以便與Rows工作:

Sub LoopRange() 

    Dim rCell As Range 
    Dim rRng As Range 

    Set rRng = Sheet1.Range("A1:A6") 

    For Each rCell In rRng.Rows 
     Debug.Print rCell.Address, rCell.Value 
    Next rCell 

End Sub 

而且Columns

Sub LoopRange() 

    Dim rCell As Range 
    Dim rRng As Range 

    Set rRng = Sheet1.Range("A1:A6") 

    For Each rCol In rRng.Columns 
     For Each rCell In rCol.Rows 
      Debug.Print rCell.Address, rCell.Value 
     Next rCell 
    Next rCol 

End Sub 
+0

你將如何使用這些屬性來創建一個循環。我一直在玩'Range'的屬性,比如你提到的屬性,我似乎無法弄清楚如何使用它們來給我提供我需要的信息。 – 2010-10-06 18:12:53

2

爲了讓迪克的回答一張紙條,這是正確的,但我不會推薦使用For Each循環。 For Each在幕後創建一個臨時引用,指向您無權訪問的場景(爲了處置它,您將需要這些場景)。

有關詳情,請討論以下事項:

How do I properly clean up Excel interop objects?

爲了說明這個問題,請嘗試對於每一個例子,關閉應用程序,並期待在任務管理器。您應該看到Excel的一個實例仍在運行(因爲所有對象都沒有正確處理)。

一個更清潔的方式來處理,這是通過查詢表格ADO:

http://technet.microsoft.com/en-us/library/ee692882.aspx

+0

但我不認爲這些警告適用於這個問題。 Ben正在使用VBA,可能在與他正在使用的Ranges相同的Excel實例中。 – jtolle 2010-10-06 18:25:21

+2

我只是使用VBA。我很欣賞謹慎的說法,但是這個特殊的解決方案是我只需要通過一些單元來生成一些SQL代碼就可以完成我的腳本和移動與我的生活多種多樣。 – 2010-10-06 18:31:26

+3

哎呦;你是對的:-)我認爲你正在使用VB.Net,並完全被我自己的思想誤入歧途。對於那個很抱歉。 – 2010-10-06 18:33:15

0

我復活死在這裏,但因爲範圍可以被定義爲「A:A」,使用每個循環的a結束時都會有一個潛在的無限循環。就我所知,解決方案是使用Do Until循環。

Do Until Selection.Value = "" 
    Rem Do things here... 
Loop 
+2

如果你沒有使用最後填充的單元格(例如'.range(.cells(1,1),.cells(.rows.count,1).end(xlup))'),然後使用[Intersect方法](https://msdn.microsoft.com/en-us/library/office/aa195772(v = office.11​​).aspx)與完整列和工作表的[.UsedRange屬性](https:/ /msdn.microsoft.com/en-us/library/office/ff840732.aspx)(例如'Intersect(.columns(1),.usedrange)')或可能[Range.CurrentRegion屬性](https:// msdn .microsoft.com/en-us/library/office/ff196678.aspx)(例如'.cells(1,1).currentregion.columns(1)')是非常有效的。 – Jeeped 2015-12-09 00:51:41

相關問題