我需要在VBA中创建一堆字典;最好的解决方案是将前缀“dict”与字符串变量连接起来(枚举会导致更复杂的问题)。有没有办法将字符串转换为VBA语句?
例如,我创建了一个字典dictABC
。如何使用两段字符串"dict"
和"ABC"
连接来引用它?
(我能想到的唯一方法是使用字符串"dictABC"
和字典dictABC
来创建“元字典”。)
答案 0 :(得分:1)
如果您构建一个字典对象数组并使用另一个字典作为您创建的所有字典的索引,那么您应该得到类似于您所描述的内容。请考虑以下数据,这些数据在Col A中具有三个唯一值。
Col A Col B Col C Col D
Y 196 RNT 4-Jan-2015
Y 127 IYI 12-Feb-2015
X 173 ZVM 24-Jan-2015
Z 124 LRP 16-Jan-2015
Z 176 XTN 27-Jan-2015
Y 137 SUG 30-Jan-2015
X 139 IBG 7-Feb-2015
X 165 DON 11-Feb-2015
Z 153 EUU 16-Feb-2015
将Microsoft Scripting Runtime添加到VBE的工具►引用之后,我们可以在A列中运行,向字典索引添加键条目和索引号,然后重新调整空间字典数组并填充新的字典对象。如果A列中的值已经存在,则dNDX用于确定应该引用数组中的哪个字典对象并添加新的键/项。
Sub mcr_Dict_Over_Dicts()
Dim rw As Long, d As Long, sCOLa As String, ky As Variant
Dim dNDX As New Scripting.Dictionary, dDICTs() As New Scripting.Dictionary
dNDX.CompareMode = TextCompare 'or BinaryCompare
With ActiveSheet
For rw = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
sCOLa = .Cells(rw, 1).Value
If CBool(Len(sCOLa)) Then
If Not dNDX.Exists(sCOLa) Then
'create a new entry in dNDX and a new dictionary in the array
d = dNDX.Count + 1
dNDX.Add Key:=sCOLa, Item:=d
ReDim Preserve dDICTs(1 To d)
dDICTs(d).Add Key:=.Cells(rw, 2).Text, _
Item:=Join(Array(.Cells(rw, 1).Text, .Cells(rw, 2).Text, .Cells(rw, 3).Text, .Cells(rw, 4).Text), ChrW(8203))
Else
'add an entry to an existing dictionary
dDICTs(dNDX.Item(sCOLa)).Add Key:=.Cells(rw, 2).Text, _
Item:=Join(Array(.Cells(rw, 1).Text, .Cells(rw, 2).Text, .Cells(rw, 3).Text, .Cells(rw, 4).Text), ChrW(8203))
End If
End If
Next rw
'return the values to the worksheet reordered in an alternate location
.Cells(1, 6).Resize(1, 4) = .Cells(1, 1).Resize(1, 4).Value
For d = LBound(dDICTs) To UBound(dDICTs)
For Each ky In dDICTs(d)
.Cells(Rows.Count, 6).End(xlUp).Offset(1, 0).Resize(1, 4) _
= Split(dDICTs(d).Item(ky), ChrW(8203))
Next ky
Next d
End With
For d = LBound(dDICTs) To UBound(dDICTs)
dDICTs(d).RemoveAll
Next d
'alternately redim dDICTs
ReDim dDICTs(1)
dNDX.RemoveAll
Set dNDX = Nothing
End Sub
这确实要求会有一些值或值组合(哈希)可以用作数组中每个词典中的唯一键。
请注意,G列和I列中的结果是基于文本的。这是因为它们被串联的字符串拆分。
答案 1 :(得分:1)
我很困惑为什么你会想到并出于某种原因拒绝这个简单明了的解决方案。
但是如果你真的想要去代码生成路线,你就是这样做的。
Function dictAbcd() As Object
Static result As Object
If result Is Nothing Then
Set result = CreateObject("Scripting.Dictionary")
End If
Set dictAbcd = result
End Function
Public Sub Test()
Dim x As Object
Dim dict_index As String
dictAbcd("key") = "value"
dict_index = "Abcd"
Set x = Application.Run("dict" & dict_index)
Debug.Print x("key") ' Prints "value"
End Sub
N.b。这样做是完全荒谬的。
答案 2 :(得分:0)
您可以将字典放入集合中,这样您就可以拥有字符串索引。