2013-02-25 65 views
3

我來自Perl的背景和學習Excel-VBA。在Perl中,我們可以使用Data :: Dumper來獲取數據結構的轉儲。Excel VBA - 如何創建AND轉儲數組複雜結構的散列?

這裏是perl的例子:

use strict; 
use Data::Dumper; 

my $hash={}; 
$hash->{key1} = [ 1, "b", "c" ]; # the value stored against key1 here is an array 
$hash->{key2} = [ 4.56, "g", "2008-12-16 19:10 -08:00" ]; # the value stored against key2 here is an array 
my $hash2={1=>['one','ONE']}; # this is a hash 
$hash->{key3}=$hash2; # the value stored against key3 here is a hash 

print Dumper($hash)."\n"; 

它產生以下的輸出:

$VAR1 = { 
     'key2' => [ 
        '4.56', 
        'g', 
        '2008-12-16 19:10 -08:00' 
        ], 
     'key1' => [ 
        1, 
        'b', 
        'c' 
        ], 
     'key3' => { 
        '1' => [ 
           'one', 
           'ONE' 
          ] 
        } 
     }; 

正如我前面提到的,我是新來的Excel VBA和學習它,所以請大家多多包涵在幫助我達到以下問題的答案:

  1. 是否有類似perl的Data :: Dumper in Ex CEL-VBA?
  2. 如何使用Scripting.Dictionary對象在Excel-VBA中創建與上述結構完全相同的結構(即$ hash)?我如何迭代該結構並檢索存儲在鍵上的值?這種結構是否支持「存在」,「刪除」,「添加」等等的方法?
+0

你可以保持您的問題到一個具體點嗎?這個問題需要多個響應。 – JustinJDavies 2013-02-25 08:19:27

+0

這是一個與「Excel-VBA」相關的問題。我期待「Excel-VBA」本身的答案。 – 2013-02-25 08:47:44

+0

我認爲這裏的主要問題是他來自一個Perl世界,其中'所有'問題都可以在oneliner中解決,但在vba中解決方案可能是10到100個代碼鏈接,並且包含許多問題。 – FtLie 2013-02-25 11:41:34

回答

1

我不知道內置的機制,會做你在問什麼。你將不得不創建一個「keyedArray」類來實現你想要的方法。弄清楚這一點會讓你穩固地掌握VBA的學習曲線。

一個良好的開端是http://www.cpearson.com/excel/classes.aspx

如果不幫助你,在評論中這樣說 - 我可能有一段時間後,把一個簡單的例子在一起。

+0

我早先檢出了該URL,這就是我瞭解Scripting.Dictionary對象的方式。如果您將代碼放在Excel-VBA中以創建我在問題中顯示的散列值,這將非常有幫助。如果你能告訴我如何遍歷該結構並檢索存儲在該鍵上的值,它也會有所幫助。 – 2013-02-25 09:12:36

+0

這不是一個免費的代碼。你有什麼嘗試?你不能指望人們在這個網站上爲你寫代碼。 – JustinJDavies 2013-02-25 09:22:23

+0

如果你想問一個簡單的子問題「我該如何[使用]散列?」或者「我如何迭代這些集合?」在VBA中,您需要自己搜索這些問題的答案,如果您只有**嘗試過並且未能回答您自己的問題**,那麼請在該主題上發佈一個具體問題,詳細說明您嘗試的內容 - 例子你迄今爲止編寫的代碼,以及你認爲不能正常工作的解釋。 – JustinJDavies 2013-02-25 09:25:26

1

您可能有三個方面的需求之一:

  1. 交互式調試 - 再添加一個斷點在調試器,使用VBA添加監視,並展開結構iteractively
  2. 數據獲取到一個文本文件進行一些後期處理 - 查找xml或json導出器
  3. 獲取與您顯示的數據完全相同的值,以導入例如與安全到Perl。 - 那麼你需要自己編寫一個遞歸過程。

後者將是相當困難的,因爲大多數vba結構(除非你自己做),有圓環。 (如children => [...],parent => FIX)。

VBA集合不能給你足夠的支持,所以Dictionary是你需要的。 (記得工具 - >引用「Miscrosoft腳本運行」)

以下不是pefect,但可能會給你一個開始

Option Explicit ' aka use strict 
Option Base 0 ' to be close to perl 

Sub test() 
    Dim c As New Dictionary 
    Dim c2 As New Dictionary 
    Dim a(10) As Variant, b() As Variant 
    a(1) = 1.1 
    a(2) = "array item 1" 

    ReDim b(0) 
    b(0) = 41.9 
    ReDim Preserve b(UBound(b) + 1) ' aka push 
    b(UBound(b)) = 41.95 

    ReDim Preserve b(UBound(b) + 1) 
    b(UBound(b)) = 41.96 

    '#build a structure 
    c.Add item:="val1.2", Key:="key1.2" 
    c.Add item:="val1.1", Key:="key1" 
    c2.Add item:="val2.1", Key:="key2.1" 
    c2.Add item:=42, Key:="key2.2" 
    c2.Add item:=42.1, Key:="key2.3" 
    c2.Add item:=a, Key:="key2.4" 
    c2.Add item:=b, Key:="key2.5" 

    'add c2 to c to make it hierarchical 
    c.Add item:=c2, Key:="key1.3""" 

    Debug.Print vba2perl(c) 

End Sub 

Function vba2perl(item, Optional indent = 0) 
    Dim txt 
    Dim Key, I 

    Select Case TypeName(item) 

    Case "Dictionary" 
     indent = indent + 1 
     txt = txt _ 
      & vbCrLf & Space(indent * 4 - 2) & "{" 
     For Each Key In item 
      txt = txt _ 
       & vbCrLf & Space(indent * 4) & Key & " => " & vba2perl(item(Key), indent) & "," 
     Next Key 
     txt = txt _ 
      & vbCrLf & Space(indent * 4 - 2) & "}" 
    Case "String" 
      txt = item 
      txt = Replace(txt, """", "\""") ' more escaping needed 
      txt = """" & txt & """" 
    Case "Integer" 
      txt = item 
    Case "Double" 
      txt = item 
      txt = Replace(txt, ",", ".") ' if regional, then fix . vs , tbd 
    Case "Empty" 
      txt = "undef" 
    Case "Variant()" 
     indent = indent + 1 
     txt = txt _ 
      & vbCrLf & Space(indent * 4 - 2) & "[" 

     For I = LBound(item) To UBound(item) 
      txt = txt _ 
       & vbCrLf & Space(indent * 4) & vba2perl(item(I)) & "," 
     Next I 
     txt = txt _ 
      & vbCrLf & Space(indent * 4 - 2) & "]" 
    Case Else 
     Debug.Print "No Handler for type: " & TypeName(item) 
    End Select 

    vba2perl = txt 
End Function 
+0

非常感謝!這確實給了我一些方向。你還可以展示如何從字典c中獲得像「數組項1」或「42.1」這樣的單個值嗎?我問這個的原因是因爲在函數vba2perl中,你迭代了整個c,並且我想知道調用單個值的代碼是否也會運行多行。 – 2013-02-25 12:03:43

+0

正如你在 For Each Key中的項目 .... Key&「=>」&item(Key) item(「ley1.2」)會給你這個鍵的值(即使它的外觀就像函數調用一樣) – FtLie 2013-02-25 13:27:56