3

私はPerlのバックグラウンドを持ち、Excel-VBAを学んでいます。perlでは、Data::Dumperを使用してデータ構造のダンプを取得できます。

これが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. Excel-VBAのperlのData::Dumperに似たものはありますか?
  2. Scripting.Dictionaryオブジェクトを使用して、Excel-VBAで上記とまったく同じ構造(つまり$ hash)を作成するにはどうすればよいですか?その構造を繰り返し処理して、キーに対して保存されている値を取得するにはどうすればよいですか?この種の構造は、「exists」、「remove」、「add」などのメソッドをサポートしていますか?
4

2 に答える 2

1

次の3つのニーズのいずれかがあります。

  1. インタラクティブデバッグ-次に、デバッガーにブレークポイントを追加し、vbaで[ウォッチの追加]を使用して、構造を繰り返し展開します
  2. 後処理のためにデータをテキストファイルに取得します-xmlまたはjsonエクスポーターを探してみてください
  3. 表示されているとおりにデータを取得して、たとえばSafeを使用してPerlにインポートします。-次に、再帰プロシージャを自分で作成する必要があります。

ほとんどのvba構造(自分で作成しない限り)には円柱があるため、後者は非常に困難です。(子のように=> [...]、親=> FIX)。

VBAコレクションは十分なサポートを提供しないため、辞書が必要です。([ツール]-> [Miscrosoft ScriptingRuntime]への参照を忘れないでください)

以下は完璧ではありませんが、あなたにスタートを与えるかもしれません

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
于 2013-02-25T10:12:34.770 に答える
1

あなたが求めていることを行う組み込みのメカニズムを認識していません。必要なメソッドを実装する「keyedArray」クラスを作成する必要があります。それを理解することで、VBA の学習曲線を確実に上げることができます。

開始するのに適した場所は、http://www.cpearson.com/excel/classes.aspxです。

それが役に立たない場合は、コメントでそのように言ってください - 後で簡単な例をまとめる時間があるかもしれません.

于 2013-02-25T09:07:47.683 に答える