2013-02-25 51 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