以前、Python で作業したことがありますが、リストの辞書を持つのは非常にスムーズです (つまり、1 つのキーが要素のリストに対応します)。vbaで同じことを達成するのに苦労しています。Excel シートに次のデータがあるとします。
Flanged_connections 6
Flanged_connections 8
Flanged_connections 10
Instrument Pressure
Instrument Temperature
Instrument Bridle
Instrument Others
Piping 1
Piping 2
Piping 3
Flanged_connections
ここで、データを読み取って、キーがでInstrument
ありPiping
、値が 2 番目の列の対応する値である辞書に格納します。データを次のようにしたい:
'key' 'values':
'Flanged_connections' '[6 8 10]'
'Instrument' '["Pressure" "Temperature" "Bridle" "Others"]'
'Piping' '[1 2 3]'
dict.Item("Piping")
結果としてリストを使用してリストを取得でき[1 2 3]
ます。だから私は次のようなことを考え始めました:
For Each row In inputRange.Rows
If Not equipmentDictionary.Exists(row.Cells(equipmentCol).Text) Then
equipmentDictionary.Add row.Cells(equipmentCol).Text, <INSERT NEW LIST>
Else
equipmentDictionary.Add row.Cells(equipmentCol).Text, <ADD TO EXISTING LIST>
End If
Next
これを行うのは少し面倒に思えます。これに対するより良いアプローチはありますか?vbaで配列を使用して検索しようとしましたが、java、c++、pythonとは少し違うようで、stuft likeredim preserve
などがあります。これは、vba で配列を操作する唯一の方法ですか?
私の解決策:
@varocarbas のコメントに基づいて、コレクションの辞書を作成しました。これは、最も効率的ではないかもしれませんが、何が起こっているのかを理解するための最も簡単な方法です。他の解決策もおそらくうまくいくでしょう(私はテストしていません)。これは私の提案する解決策であり、正しい出力を提供します。
'/--------------------------------------\'
'| Sets up the dictionary for equipment |'
'\--------------------------------------/'
inputRowMin = 1
inputRowMax = 173
inputColMin = 1
inputColMax = 2
equipmentCol = 1
dimensionCol = 2
Set equipmentDictionary = CreateObject("Scripting.Dictionary")
Set inputSheet = Application.Sheets(inputSheetName)
Set inputRange = Range(Cells(inputRowMin, inputColMin), Cells(inputRowMax, inputColMax))
Set equipmentCollection = New Collection
For i = 1 To inputRange.Height
thisEquipment = inputRange(i, equipmentCol).Text
nextEquipment = inputRange(i + 1, equipmentCol).Text
thisDimension = inputRange(i, dimensionCol).Text
'The Strings are equal - add thisEquipment to collection and continue
If (StrComp(thisEquipment, nextEquipment, vbTextCompare) = 0) Then
equipmentCollection.Add thisDimension
'The Strings are not equal - add thisEquipment to collection and the collection to the dictionary
Else
equipmentCollection.Add thisDimension
equipmentDictionary.Add thisEquipment, equipmentCollection
Set equipmentCollection = New Collection
End If
Next
'Check input
Dim tmpCollection As Collection
For Each key In equipmentDictionary.Keys
Debug.Print "--------------" & key & "---------------"
Set tmpCollection = equipmentDictionary.Item(key)
For i = 1 To tmpCollection.Count
Debug.Print tmpCollection.Item(i)
Next
Next
このソリューションは、すべての機器がソートされていることを前提としていることに注意してください!