将文本字符串转换为VBA语句/对象

时间:2015-04-13 23:45:47

标签: excel vba excel-vba

我需要在VBA中创建一堆字典;最好的解决方案是将前缀“dict”与字符串变量连接起来(枚举会导致更复杂的问题)。有没有办法将字符串转换为VBA语句?

例如,我创建了一个字典dictABC。如何使用两段字符串"dict""ABC"连接来引用它?

(我能想到的唯一方法是使用字符串"dictABC"和字典dictABC来创建“元字典”。)

3 个答案:

答案 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

这确实要求会有一些值或值组合(哈希)可以用作数组中每个词典中的唯一键。

Dictionary of Array Dictionaries

请注意,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)

您可以将字典放入集合中,这样您就可以拥有字符串索引。