gpt4 book ai didi

vba - 在VBA中创建列表字典

转载 作者:行者123 更新时间:2023-12-03 20:45:42 24 4
gpt4 key购买 nike

我之前在Python中工作过,在那里有了列表字典真的很顺利(即一个键对应一个东西列表)。我正在努力在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_connectionsInstrumentPiping,并且值是第二列中的相应键。我希望数据看起来像这样:

'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有点不同,带有像 redim 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


请注意,此解决方案假定所有设备均已分类!

最佳答案

VBA中的数组或多或少都与其他地方一样,具有不同的特性:


重新定义数组是可能的(尽管不是必需的)。
大多数数组属性(例如,工作簿中的Sheets数组)都是基于1的。尽管,正如@TimWilliams正确指出的那样,用户定义的数组实际上是基于0的。下面的数组定义了一个长度为11的字符串数组(10表示较高的位置)。


除此之外,还有关于符号的特殊性,处理VBA阵列应该没有任何问题。

Dim stringArray(10) As String
stringArray(1) = "first val"
stringArray(2) = "second val"
'etc.


根据您的要求,您可以在VBA中创建字典并在其中包含一个列表(或VBA等效项: Collection),这里有一个示例代码:

Set dict = CreateObject("Scripting.Dictionary")
Set coll = New Collection
coll.Add ("coll1")
coll.Add ("coll2")
coll.Add ("coll3")
If Not dict.Exists("dict1") Then
dict.Add "dict1", coll
End If

Dim curVal As String: curVal = dict("dict1")(3) '-> "coll3"

Set dict = Nothing

关于vba - 在VBA中创建列表字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17656580/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com