2012-01-04 103 views
3

我不知道如何解釋這個問題,但我遇到了一個問題,我需要將一組表單中的名稱加載到單獨的數組中。Excel宏加載陣列

例如,Sheet 1Column A具有10名被裝入array1Sheet 2Column A必須被加載到array2 14名。

我知道這可能是硬編碼到一個宏來加載它們,但名稱列表不是可以縮短的,而且很多代碼很害羞。

我的想法告訴我這樣做的方式如下。

Dim tarray1 As Variant 
Dim tarray2 As Variant 
Dim tarray3 As Variant 

For f = 1 To 3 

    Sheets("Region " & f).Select 
    With ActiveSheet 
     lastrow = .Cells(.Rows.Count, "A").End(xlUp).Row 
     tarray& f = ActiveSheet.Range("A2:A" & lastrow) 
    End With 


Next 

實際片在問題有10個單獨的片材具有在打算從區域1到10。所以會有10個獨立tarrays讀取的名稱。這是爲了報告目的而完成的,並將在表單中來回傳遞。

但是tarray & f顯然是無效的,並且會引發編譯錯誤。

任何人都可以想辦法解決這個問題嗎?

希望有人能幫忙。

回答

5

下面的例程向您展示瞭如何使用我認爲是您需要的技術的鋸齒陣列變體。

我已經從工作表的前十行加載不同數量的單元格到TArray。我使用Debug.Print來顯示如何訪問元素。

Sub Test() 

    Dim InxCol As Integer 
    Dim InxRow As Integer 
    Dim InxTA As Integer 
    Dim TArray() As Variant 

    ReDim TArray(1 To 10) 

    With Sheets("xxxxx") 

    For InxTA = 1 To 10 
    ' There must be at least two cells in each range if the result is to be an 
    ' array. The access code relies on TArray being a true array of arrays. 
    ' If this is not possible, you can test for TArray(N) being an array 
    ' or a variable using VarType 
    TArray(InxTA) = .Range(.Cells(InxTA, 1), .Cells(InxTA, 12 - InxTA)).Value 
    Next 

    End With 

    For InxTA = 1 To 10 
    For InxRow = LBound(TArray(InxTA), 1) To UBound(TArray(InxTA), 1) 
     For InxCol = LBound(TArray(InxTA), 2) To UBound(TArray(InxTA), 2) 
     Debug.Print TArray(InxTA)(InxRow, InxCol) & " "; 
     Next 
    Next 
    Debug.Print 
    Next 

End Sub 

新材料

我已經決定了,所以我的答案是完整的補充解釋。

您可以將變體設置爲任何內容,然後將其設置爲其他內容。以下可能是愚蠢的,但它的工作原理:

Dim V As Variant 

V = 5 
Debug.Print V 
V = "Today" 
Debug.Print V 
V = Array(1, 2, 3) 
Debug.Print V(0) & " " & V(1) & " " & V(2) 

考慮:Range(xxx).Value

如果xxx是單細胞,它返回一個變量。在所有其他情況下,它返回一個二維數組。第一個維度是針對行的,第二個維度是針對列的。這是正常做法的反面,但它匹配Cells(R, C).Value

我已經聲明:

Dim TArray() As Variant 
Redim TArray(1 to 10) 

所以在tarray是變體

的陣列然後我設置TArray(N) = Range(xxx).Value

如果xxx是單細胞,在tarray(N)將是一個單值。

但是,如果xxx是兩個或更多個單元格,則TArray(N)是二維陣列。要訪問TArray中的單個單元格,我必須指定TArray的元素,然後指定範圍的行和列。因此:

TArray(Element)(Row, Column) 

TArray的每個元素可以具有與每個其他元素不同的大小。一個可以是一個單一的變量,另一個單一的行範圍,另一個單一的列範圍和另一個矩形。

這很難讓你頭一下。不 - 刪除「首先」。玩這個功能。按照我所做的操作,從一個工作表中加載行,列和矩形。

2

所有功勞歸於@Tony Dallimore Array or Array的想法。這只是作爲對他答案的補充。

要加載所有片數據到一個數組使用

Dim TArray() as Variant 
Dim sh as Worksheet 

ReDim TArray(1 To ActiveWorkbook.Worksheets.Count) 

For each sh in ActiveWorkbook.Worksheets 
    TArray(sh.Index) = sh.UsedRange ' or to get just Column A: sh.UsedRange.Columns(1) 
Next 

或者加載片的一個子集名稱匹配的圖案

i = 1 
For each sh in ActiveWorkbook.Worksheets 
    If sh.Name Like "Region *" Then 
     TArray(i) = sh.UsedRange ' or to get just Column A: sh.UsedRange.Columns(1) 
     i = i + 1 
    End If 
Next 

同樣,信用託尼:如果OP感到傾斜接受此,請接受託尼的回答,而不是

+0

有用的除了我的答案。我的正常做法是用解釋過重OP。我認爲這是我第一次說:「這是一種技巧,按你的意願使用它。」 – 2012-01-06 11:41:17