• ベストアンサー

PHPのようにスマートに配列の配列など記述する方法が

PHPの場合、データ構造ですが以下のようになっています。 $a = array( "test1" => array( array(1,1), array("x", 2) ), "test2" => array( array(3,2), array("y", 1) ), ); これをエクセルVBAの場合、Scripting.Dictionaryを使えば連想配列が 可能ですが、PHPのようにスマートに配列の配列など記述する方法が わかりません。 Dim dic As Scripting.Dictionary set dic = New Scripting.dictionary dic.Add "test1", ???????????????? dic.Add "test2", ???????????????? スマートにデータ構造を実現できる方法が知りたいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。 VBAで、Dictionary が好きな人もいるのですが、私は、スピードが遅いので、あまり好みません。それにExcel VBA は、Excel VBA独特の使い方がありますから、他の言語と比較してもしょうがないと思います。今、何をしようとしているかが分かりません。もし技術的な情報が必要なら、MSのライブラリの検索のほうが早いと思います。 何をもってスマート(賢い)というのかは議論の余地がありますが、ただ、ジャグ配列化させること自体が、手順が多くてよくありません。 通常なら、ワークシートを使えば簡単でよいような気がします。しかし、ワークシートが嫌なら、自分で、通常は、2次元配列で作ってやればよいだけのことだと思います。 Dictionary オブジェクトなら、単に、 dic.Add "test1", Array(Array(1, 2), Array("x", 2)) dic.Add "test2", Array(Array(3, 2), Array("y", 1)) とすればよいのですが、これは、単に、ジャグ配列化させているだけで、それ自体は、配列でできますから、Dictionary オブジェクトの意味がありません。もし、私自身のスマートさから言うと、これが、リテラルに入力することが、もっともスマートさに欠けるように思います。 たとえば、CSVなどのストックにしておいて、それを、配列にして、ジャグ配列にするとか、方法はあるかと思います。 ワークシートなら、2次元配列の ar = Range("A1:E10").Value で、配列化できます。Column(1) で検索することも、Column(2)でも、どの列でも検索が可能です。これが一番、Excelらしい使い方だと思います。 また、Excel VBAなどで、ジャグ配列化されるのは、本来は、リテラルに入力するのはあまり芳しくありませんが、仮にリテラルで代入するとすれば、以下のようになります。本来は、データ自体を配列化させて、名称とデータを、ループで入れていくのがよいかと思います。 つまり、その場合は、データ側(主に、CSV)を配列にするのは、Arrayではなくて、Split になります。 Sub JaggedArrayTest() Dim tmpAr() As Variant Dim myAr() As Variant Dim i As Long Dim j As Long ReDim Preserve myAr(0, 0) '本来は、tmpArはリテラルで作らない tmpAr = Array(Array(1, 2), Array("x", 2)) '本来は、test1 は、リテラルにしない myAr(0, i) = Array("test1", tmpAr) i = 1 ReDim Preserve myAr(0, 1) tmpAr = Array(Array(3, 2), Array("y", 1)) myAr(0, i) = Array("test2", tmpAr) End Sub

Taipei2
質問者

お礼

回答ありがとうございます。 >何をもってスマート(賢い)というのかは議論の余地がありますが、ただ、ジャグ配列化させること自体が、手順が多くてよくありません。 私自身、狭い範囲の学習で言語の勉強をしているので、 深い見識によるご意見は参考になります。 >dic.Add "test1", Array(Array(1, 2), Array("x", 2)) スマートではないようですが、他言語PerlからVBAに移行した新参者の 私の感覚では、データが少量の場合、ソース自体がネイティブ言語では効率が悪くてもすべてのデータが一箇所で済まされるという感覚がスマートと解釈していますので、そう判断しました。 ※多量のデータの場合はCSVとループ・単純配列で処理するのがソースの書き手にとってノーマルなのは、意見が一致します。 VBAでArray(Array(1, 2), Array("x", 2) ができることが知れて自身がつきました。ありがとうございます。 このようにVBAでのデータ構造(私の変な解釈ですが)について柔軟に記述できる方法をもっと知りたいのですが、このあたりに特化したVBA(もしくはVB、さらに.NET)の書籍などご存知の方がいらっしゃいましたら、教えてください。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。Wendy02です。 >このあたりに特化したVBA(もしくはVB、さらに.NET)の書籍などご存知の方がいらっしゃいましたら、教えてください。 その「VB.Net」 では、今回の部分は、大幅に変わりますね。最初から、ジャグ配列の変数にすればよいのですから。VBAから、.NET 方式に切り替える時は、私自身も苦労するのではないかと思いますが、私自身、あまりにも、VBAに関わりすぎてしまいました。 それから、VB6の書籍(人気のあった書籍)を手に入れるのは、かなり厳しいです。 私は、VB系は、一応、全部、技術評論社の「かんたんプログラミング」シリーズにお任せっていうような感じになっています。いまだに、このシリーズの「VB6」は健在のようです。しかし、このシリーズの 「VB.Net」 のVB2005の対応がされていません。(クラス表示の部分がなくなっただけですが。) また、「VB6」 の「かんたんプログラミング」シリーズは、VBAの同シリーズと比べると、その内容の薄いです。VBA側は、大村さんという著者の意気込みがすごいし、なかなかの力作です。 >このようにVBAでのデータ構造(私の変な解釈ですが)について柔軟に記述できる方法をもっと知りたいのですが、 それは、なんともいえません。ジャグ配列は、VBAでは、単に、ワークシートのRange オブジェクトを配列化させた時に出てくるだけです。 今までのスタイルを一旦捨てないといけないような気がします。そのVBAの「かんたんプログラミング」の上位のテクニックというものはありますが、それは、VB6 で学ぶしかありません。しかし、その上位のテクニックが果たして必要かどうかは、ExcelやOfficeのVBA専門にする者だけのようなもので、逆に、VB6を使いこなせたから、VBAは使えると思い込むのは、早計だと思うのです。Excel自体を使いこなすほうが、ずっとよいと思いますし、また、VBAと匹敵するかそれ以上に難しいです。私が、その難しさの原因は、Excelは、どうも、歴史的な仕様を残してきているせいなのだと思っています。 (たぶん、その理由は、パテントの権利関係と自社開発の問題があるのだと思っています。もう少しExcelは、MSネイティブで内容的に統一させ、すっきりとさせてもよいと思います。)それに、いまさら、VB6を追いかけても無駄になってしまいますしね。

すると、全ての回答が全文表示されます。
  • edomin
  • ベストアンサー率32% (327/1003)
回答No.1

Dim dic Set dic = CreateObject(Scripting.Dictionary) dic.Add "test1", "リンゴ" dic.Add "test2", "バナナ" dic.Add "test3", "スイカ" ... こんな感じでしょうか? VBAのHELPにもあります。検索してみましょう。

Taipei2
質問者

補足

回答ありがとうございます。 私の説明が悪かったようです。 >dic.Add "test1", "リンゴ" は理解していますが、array( array(1,1), array("x", 2) ),の 部分をどのように記述するかという質問をしたかったのですが、 VBって1行で書くことは可能でしょうか? 単に文字列や数値なら ????の部分は簡単ですが・・・ この点がわかる方、引き続きお願いします。

すると、全ての回答が全文表示されます。