2014-04-17 48 views
-1

編輯:我的問題似乎確實是重複的,請刪除。如何填充具有動態範圍的陣列

好的,這是一個抽象的問題,我不寫任何特定的代碼,所以我沒有發佈。但我曾多次想過。

如果我正在用數值填充數組(使用整數作爲示例),使用for loop, 和Excel列中的每一行都被設置爲我數組中的一個單獨值,如何編寫我的VBA代碼以便循環結束在我的Excel列中包含數據的最後一個值?

此外,只是爲了讓它更棘手,可以說包含我的整數值的列也是一個表,它具有動態長度,因爲它每天刷新一次,並且行總數可以上/下。

所以總而言之,我想將循環長度設置爲我列中的總行數(在任何給定時間)。我可以使用ActiveSheet對象的某個函數嗎?(這裏是正確的術語嗎?)?也許ActiveSheet.Length.Column("A)

如果您不介意,請提供一些正確語法的僞代碼。

+0

'For row = 1 To ActiveSheet.UsedRange.Rows.Count' maybe? – Phylogenesis

+3

檢查此鏈接:[如何確定上次使用的行/列](http://stackoverflow.com/questions/11169445/error-finding-last-used-cell-in-vba/11169920#11169920) –

+0

我標記我的自己的問題主持人的關注,它實際上是重複的,雖然這個問題確實提供了兩個很好的選擇。 – FluffyKittens

回答

1

這是我通常這樣做的方式。

Dim row As Long 
For row = 1 To Sheet1.Range("A1").CurrentRegion.Rows.Count 

    Sheet1.Cells(row, 2).Value = row 

Next row 

範圍的CurrentRegion包括與具有值的單元格相鄰的所有單元格。所以,如果添加更多的行值,CurrentRegion將自動包含這些單元格。 但是,要小心,如果在兩個區域之間存在空白,空白單元格的行或列,則不會包含它們。

例如,這是一個區域:

1 
2 5 
3 2 
    7 
4 

這是兩個單獨的區域:

1 
2 5 
3 2 

4 

順便說一下,同樣可以爲列完成使用CurrentRegion.Columns.Count

+0

嗯。這是一個很好的答案,可以通過使用某種嵌套的If語句來計劃出現隨機出現的單個間隔,該語句會查看系列中的下一個單元格(在空單元格之後)以查看該單元格是否爲null也是?只是想,並不是要混淆這個話題。 – FluffyKittens

+0

其實,如果你看@simoco引用的帖子,我認爲它涵蓋了這種情況。 – LimaNightHawk

+0

我強烈建議不要迭代指定值或讀數的範圍。它可以比單個操作中的讀取/寫入數值慢許多個數量級(差異隨着細胞數而增加)。相反,使用效率更高的'myArray = ALargeRangeOfCells.Value',相反'ALargeRangeOfCells.Value = myArray'。因此,您在數組上運行循環以填寫正確的信息,然後將數組值一次性轉儲到表單中。 –

0

我一般避免使用ActiveSheet將變量定義爲工作表並設置您正在處理的內容要好得多。

Dim ws as Worksheet 
Dim var1 as variant 
Set ws = Sheets("Sheet1") 
var1 = ws.Range("A1").Value 

如果您正在尋找一個鬆散定義的範圍。去simoco的建議。

如果您有查詢範圍,請從ODBC提供程序中說出。桌子的長度是提供給你的。通過類似ws.ListObjects("myTable").ListRows.Count或者你可以做

myArray = ws.ListObjects("myTable").ListColumns("myColumn").Range 

我沒有測試範圍爲陣行,但我已經在其他地方看到它。

+0

這也是一個很好的答案。 – FluffyKittens

+1

如果通過「範圍到數組行」您的意思是將範圍的值賦值給數組,那麼它很好。然而,在循環等中使用它之前,測試生成的'myArray'實際上是一個數組是非常重要的。如果Range實際上是單個單元格,那麼myArray只是一個標量值。我通常使用'如果Range.Count> 1那麼:[你的數組賦值]:否則... [Redim myArray(1 to 1,1 to 1):myArray = Range.Value]:End If',這樣你可以假設myArray將永遠是一個數組,無論細胞數量如何。 –

+0

良好的調用,我通常將這與UDT用於整個數據集,我不做直接分配,並且必須迭代通過其中進行深度測試。 – Bmo