使用 VBA 将简单的通用打印字典打印到 Excel 工作表

Easy generic print Dictionary to Excel Worksheet using VBA

我正在处理非常复杂的数据。因此,我编写了这个非常好的函数来将数据打印到调试区域 - 您可以在 VBA 上使用 Ctrl + G 立即到达 window,在 Excel 内。我需要一个类似的函数来将此通用数据(包含数字、字符串、字典和数组)打印到工作表。

'call using: Call PrintDict(data)
' Where data can be a number, a string, a dictionary or an Array, 
' with any of these inside.

Sub PrintDict(ByVal dicttoprint As Variant, Optional indent As Integer = 0, Optional wasdict As Boolean = False)
    Dim i As Long
    Dim j As Long
    Dim indentStr As String
    indentStr = ""
    i = 0

    Do While i < indent
        indentStr = indentStr + " "
        i = i + 1
    Loop

    Dim key

    If (TypeName(dicttoprint) = "Dictionary") Then
        If (wasdict = True) Then
            Debug.Print vbNewLine;
        End If
        For Each key In dicttoprint.Keys:
            Debug.Print indentStr & key & " ";
            Call PrintDict(dicttoprint.Item(key), indent + 2, True)
        Next
    ElseIf (TypeName(dicttoprint) = "Variant()") Then
        If (wasdict = True) Then
            Debug.Print vbNewLine;
        End If
        For j = LBound(dicttoprint) To UBound(dicttoprint)
            Call PrintDict(dicttoprint(j), indent + 2)
        Next j
    Else
        Debug.Print indentStr & dicttoprint & " "
    End If
End Sub

编辑1: 好的,一直在想,我有一个想法,但无法解决一些极端情况...

下面的示例预期输出:

key1:____|__________|__________|__________|_________|
_________|key1.1:___|_numvalue_|__________|_________|
_________|__________|_numvalue_|__________|_________|
_________|__________|_arr1Indx1|_numvalue_|_________|
_________|__________|_arr1Indx2|_numvalue_|_________|
_________|__________|_arr1Indx3|_numvalue_|_________|
_________|key1.2:___|_numvalue_|__________|_________|
_________|__________|_numvalue_|__________|_________|
key2:____|_numvalue_|__________|__________|_________|
key3:____|__________|__________|__________|_________|
_________|_arr2Indx1|keyA.1:___|_numvalue_|_________|
_________|__________|keyA.2:___|_strvalue_|_________|
_________|_arr2Indx2|_numvalue_|__________|_________|

好的,我想现在这个输出解决了一些极端情况。关于如何实施它有什么想法吗?

我正在考虑让该函数能够传递 X、Y 参数,这些参数是可选的并且 return 最后一个 Y。在处理文本时,光标自然会向下移动,我不会知道如何通过工作表中的递归来做到这一点。

编辑 2:

好的,这是伪代码的想法 - 几乎是 VBA,但我不知道如何让它工作...

Function PrintToWS(ByVal data As Variant, _
    Optional rowi As Integer = 0, _
    Optional coli As Integer = 0) As Integer

    If (TypeName(data) = "Dictionary") Then
        For Each key In data.Keys:
            Cells(rowi, coli).Value = key
            coli = coli + PrintToWS(data.Item(key), rowi+1, coli)
        Next
    ElseIf (TypeName(data) = "Variant()") Then
        For j = LBound(data) To UBound(data)
            coli = coli + PrintToWS(data(j), rowi+1, coli)
        Next j           
    Else
        Cells(rowi, coli).Value = data
        coli = coli + 1
    End If

    PrintToWS = coli
End Function

编辑2:

Added it in a gist here

已解决。代码如下:

'usage: PrintToWS(yourdata)
' Optional parameters are to be used internally by the function, 
'leave optional parameters blank.

Function PrintToWS(ByVal data As Variant, _
    Optional rowi As Integer = 1, _
    Optional coli As Integer = 1, _
    Optional wasdict As Integer = 0) As Integer

    Dim key
    Dim j As Integer

    If (TypeName(data) = "Dictionary") Then
        For Each key In data.Keys:
            Cells(rowi + wasdict, coli).Value = key
            rowi = PrintToWS(data.Item(key), rowi + wasdict, coli + 1, 1)
            wasdict = 0
        Next
    ElseIf (TypeName(data) = "Variant()") Then
        For j = LBound(data) To UBound(data)
            rowi = PrintToWS(data(j), rowi, coli + 1)
        Next j
    Else
        Cells(rowi, coli).Value = data
        rowi = rowi + 1
    End If

    PrintToWS = rowi
End Function