2016-12-19 147 views
1

我有代碼:多維數組或集合

Dim products As Variant 
LastRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row 
products = Array("MS-CHOPMAT-6", "MS-BOARDS-3", "MS-CHOP-LR") 

For x = LastRow To 1 Step -1 

order_quantity = Range("$E$" & x).Value 
item_price = Range("$F$" & x).Value 

' if value not found inside the array using the "MATCH" function 
If IsError(Application.Match(Range("$D$" & x).Value, products, 0)) Then 
Range("$H$" & x).Value = "ERROR - " & order_quantity 
Else ' successful "MATCH" inside the array 
Range("$H$" & x).Value = order_quantity * 3 
End If 

Next 

但不是有簡單的數組,我需要多維數組或「集合」。如何改變這種代碼的集合或多維數組

喜歡的工作:

products = Array(Array("MS-CHOPMAT-6", 11,"w"), Array("MS-BOARDS-3", 12, 4), Array("MS-CHOP-LR", 13, 5)) 
+0

@加里埃文斯答案會做的工作,很容易理解。我會那樣。無論如何,對於一個通用的解決方案(雖然很模糊,恐怕)看看[this](http://stackoverflow.com/a/37777993/1726522)。我已經使用它,它被證明是強大的。 – CMArg

回答

0

這可能會幫助,在數組的數組是不嚴格可能的,你可以做什麼什麼,我已經在做過去是通過創建自己的分隔符來模仿數組中的數組,如下所示。

Public Sub Sample() 
Dim AryTable() As String 
Dim AryRow() As String 
Dim VntCell  As Variant 
Dim LngID  As Long 

'AryTable is root array 
ReDim AryTable(2) 

'Below is the population of the array, using #~# as a delimiter, whatever 
'you feel will not come up will be best 
'In the past to be safe I used #UnliklyDivider# as my delimiter, to make 
'sure it was never confused or come up in 
'real data 
AryTable(0) = "1#~#Field1#~#Field2#~#Field3" 
AryTable(1) = "1#~#Field1#~#Field2#~#Field3#~#Field4#~#Field5" 
AryTable(2) = "1#~#Field1#~#Field2#~#Field3#~##~#Field5" 

'This goes through each row in the array, using each one as an array in its 
'own right 
For LngID = 0 To UBound(AryTable, 1) 
    AryRow = Split(AryTable(LngID), "#~#") 
    For Each VntCell In AryRow 
     Debug.Print LngID & ": " & VntCell 
    Next 
Next 

End Sub 
+1

數組中的數組絕對有可能。只需使用一個變體數組。 –

+0

爲什麼不使用具有兩個維度的數組? –

+0

@ D.O。是的,這是一個好點....我知道在過去,我必須這樣做,因爲第二維的長度可以大幅度縮放,但是我沒有考慮多維度,所以我覺得很愚蠢。 –

0

對此的二維答案如下。有很多方法可以做到這一點,這只是一個例子。二維數組雖然很好,但需要對實現進行一些思考,理想情況下,您希望使用某種形式的遞歸來填充它,下面的示例簡單地以靜態方式設置它們。

Public Sub Sample() 
Dim AryTable() As String 
Dim LngRow  As Long 
Dim LngCol  As Long 

'Below is a two dimensional array, think of it as a 
'table with 3 rows and 5 columns (the base is zero 
'so it is not 2 rows and 4 columns as it may look) 
ReDim AryTable(2, 4) 

'We can then populate (or not) each 'cell' of the array 

'Row 1 
AryTable(0, 0) = "1" 
AryTable(0, 1) = "Field1" 
AryTable(0, 2) = "Field2" 
AryTable(0, 3) = "Field3" 

'Row 2 
AryTable(1, 0) = "2" 
AryTable(1, 1) = "Field1" 
AryTable(1, 2) = "Field2" 
AryTable(1, 3) = "Field3" 
AryTable(1, 4) = "Field4" 

'Row 3 
AryTable(2, 0) = "3" 
AryTable(2, 1) = "Field1" 
AryTable(2, 2) = "Field2" 
AryTable(2, 4) = "Field4" 

'Ubound by the first dimension to go through the rows 
For LngRow = 0 To UBound(AryTable, 1) 

    'Ubound by the second dimension to go through the columns 
    For LngCol = 0 To UBound(AryTable, 2) 
     Debug.Print AryTable(LngRow, 0) & ": " & AryTable(LngRow, LngCol) 
    Next 
Next 

End Sub 

需要注意的是,如果您在開始時未聲明數組的大小,以後可以更改它。

該聲明(以及以後不能更改): -

Dim AryTable(1,2) as string 

這不是聲明(及以後可以更改): -

Dim AryTable() as string 

當喲尚未宣佈大小(所以可以改變它),你必須在使用前調整它的大小。有兩種方法可以做到,重置或保存。

這將清除數組並將其設置爲新的大小,即,即。如果數組之前的大小爲100,並且有數據存在,則下面的數據將刪除所有數據,但將數據擴大。

Redim AryTable(200) 

如果陣列中尺寸以前100有數據它,下面將保留所有數據,並使其更大

Redim Preserve AryTable(200) 

在二維數組,你只能調整第二尺寸。以下是確定: -

Redim AryTable(2,4) 
Redim Preserve AryTable(2,8) 

以下將失敗: -

Redim AryTable(2,4) 
Redim Preserve AryTable(4,8) 

考慮到這一點,如果你想用一個二維數組存儲就像一個表中的數據,使用第一個維度爲列,第二個爲行,列計數很少變化,但可以添加行。

+0

嗨加里。非常感謝你,但問題是如何使用二維數組與我的代碼如果IsError(Application.Match(Range(「... – awariat