2015-01-21 14 views
2

Я работаю с действительно сложными данными. Из-за этого я написал эту действительно приятную функцию для печати данных в области отладки - окно imediate, которое вы можете получить с помощью Ctrl + G на VBA, внутри Excel. Мне нужна аналогичная функция для печати этих общих данных (содержащих номера, строки, словари и массивы) на листе.Легкий универсальный печатный словарь для Excel с использованием VBA

'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 

Edit1: Хорошо, думал о том, у меня есть идея, но не может решить некоторые угловые случаи ...

Пример ожидается выход ниже:

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_|__________|_________| 

Ok, Думаю, теперь этот результат решает некоторые угловые случаи. Любые идеи о том, как его реализовать?

Я думаю, что функция может передавать параметры X, Y, которые являются необязательными и возвращать последний Y. При работе с текстом курсор естественно опускается, я не знаю, как это сделать через рекурсию на листе.

Edit 2:

Ok, это псевдокод идея - это почти 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 
+0

Это часть проблемы, я не привык работать с рабочими листами, я понятия не имею, какой результат будет лучше. – Elric

+0

Прохладный, я разделяю код, получаю downvote, WTFH? – Elric

+1

Я проигнорировал, потому что неясно, какой результат вы искали. Поскольку вы теперь поделились, я удалил DV. – Chrismas007

ответ

1

решаемая. Код ниже:

'usage: PritToWS(yourdata) 
' Optional parameters are to be used internally by the function, 
'leave 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 
+0

Я знаю, что это устарело, но у вас также есть код, который перекошен для чтения в dict? Кажется, немного сложно, потому что вы не знаете, из какого количества уровней – dv3

+0

@ dv3 Я не понимаю, что вы имеете в виду при чтении в dict. У меня есть код для печати в виде текста в консоли Excel - да, в Excel есть консоль. – Elric

Смежные вопросы