我clum同意。 VBA對許多任務來說非常方便,但它不適用於任何任務。就我個人而言,我發現它的處理非常笨拙。
下面的代碼可以完成您使用Collections查找的內容,但不包含類。現在嘗試收藏,一旦你感覺舒服,就考慮學習課程。您也可能希望調查與集合類似的字典,並且可能更適合您當前的要求。
爲了檢驗和證明我的家常便飯,我創建了一個包含一個工作表:
由於我打字,這個我重讀你的問題。我看到我把這些列倒過來,但我決定不修復這些。
子RecordSandI
讀取每一行並調用AddSandI
以適當地存儲該行的內容。然後,它輸出收集Sandwich
的內容給:
Sandwich a has ingredients: 1 2 3
Sandwich b has ingredients: 3 4
Sandwich c has ingredients: 1 5 6
Sandwich d has ingredients: 2
Sandwich
是集合的集合。對於每個子集合,第一個元素是三明治名稱,其餘元素是成分。
正如我先前建議,看看你到底能嘗試任何事情更復雜之前採取這種做法。
Option Explicit
Sub RecordSandI()
Dim InxI As Long
Dim InxS As Long
Dim RowCrnt As Long
Dim Sandwich As New Collection
With Worksheets("SandI")
RowCrnt = 2
Do While .Cells(RowCrnt, 1).Value <> ""
Call AddSandI(Sandwich, .Cells(RowCrnt, 1).Value, .Cells(RowCrnt, 2).Value)
RowCrnt = RowCrnt + 1
Loop
End With
For InxS = 1 To Sandwich.Count
Debug.Print "Sandwich " & Sandwich(InxS)(1) & " has ingredients:";
For InxI = 2 To Sandwich(InxS).Count
Debug.Print " " & Sandwich(InxS)(InxI);
Next
Debug.Print
Next
End Sub
Sub AddSandI(ByRef Sandwich As Collection, ByVal SandwichName As String, ByVal IngredientName As String)
Dim InxI As Long
Dim InxS As Long
Dim SandwichNew As Collection
For InxS = 1 To Sandwich.Count
If Sandwich(InxS)(1) = SandwichName Then
' This sandwich already recorded
For InxI = 2 To Sandwich(InxS).Count
If Sandwich(InxS)(InxI) = IngredientName Then
'Debug.Assert False
' Ingredient already recorded
Exit Sub
End If
Next
' New ingredient
Sandwich(InxS).Add IngredientName
Exit Sub
End If
Next
' New sandwich
Set SandwichNew = New Collection
SandwichNew.Add SandwichName
SandwichNew.Add IngredientName
Sandwich.Add SandwichNew
End Sub
VBA是一個相當原始的語言。你究竟需要怎樣處理這些數據?聽起來更像是一個Access或其他基於SQL查詢的系統的項目。 – clum 2015-04-02 21:15:06
雖然我同意你的看法,但我還必須補充一點,這是一個已經開始並用VBA編寫的大型項目的契機。 (你應該在看到它之前看到它。) 我最終會改寫它更強大的東西,但就目前來看,這是我的工作。 – Jongscx 2015-04-03 13:22:57