プロが教えるわが家の防犯対策術!

【やりたいこと】
下記「検討1」の「これのa1,a2,a3の数字を変数にしてループ処理したい。」です。

【検討した内容】
Sub 検討1()
  Dim a1() As Variant
  Dim a2() As Variant
  Dim a3() As Variant
  Dim i As Long
  
  i = 5
  ReDim a1(i, 2)
  i = 8
  ReDim a2(i, 3)
  i = 6
  ReDim a3(i, 4)
End Sub
→これのa1,a2,a3の数字を変数にしてループ処理したい。


Sub 検討2()
  Dim a() As Variant
  Dim i As Long
  Dim j As Long
  
  ReDim a(8, 4, 3)

End Sub
→この対応でも別途処理を加えればやりたいことが達成されるのだが、あくまでも知りたいのは変数名に変数をとり入れられないかということ。



Sub 検討3()
  Dim a(3) As Variant
  Dim i As Long
  Dim j As Long
  
  For j = 1 To 3
    a(j) = Sheets(j).Cells(1, 1).CurrentRegion
    Debug.Print UBound(a(j), 1)
  Next
End Sub
→この場合はそれぞれのuboundが取れることを確認済み
この方法を使用してやりたいことを無理やり達成は可能であるが、本来の機能でできないものか?


【動作環境】
OS 名:Microsoft Windows 10 Pro
OS バージョン:10.0.16299 N/A ビルド 16299
OS 製造元:Microsoft Corporation
プロセッサ:Intel64 Family 6 Model 42 Stepping 7 GenuineIntel ~2400 Mhz
BIOS バージョン:TOSHIBA Version 2.20 , 2012/06/22
物理メモリの合計:3,988 MB
Excel バージョン:14.0.7192.5000(32ビット) Microsoft Office Standard 2010の一部

以上、よろしくお願いいたします。

質問者からの補足コメント

  • No.3のTacosan様回答のおかげでループ処理が可能になりました。
    ジャグ配列というのを今回初めてしりました。
    ほかの方もご回答ありがとうございました。

    Sub 検討4()
      Dim a(3) As Variant
      Dim b As Variant
      Dim i As Long
      
      
      For i = 1 To 3
        If i = 1 Then
          ReDim b(5, 2)
        ElseIf i = 2 Then
          ReDim b(8, 3)
        Else
          ReDim b(6, 4)
        End If
        
        a(i) = b
      Next
    End Sub

      補足日時:2018/01/26 10:35

A 回答 (4件)

できるかどうかは知らんけど


https://stackoverflow.com/questions/9435608/how- …
とか?
    • good
    • 1
この回答へのお礼

ご回答ありがとうございます。
いま試せる環境にないのですが、理解できました。
この使用方法の発想がありませんでした。
明日試してみたいと思います!

お礼日時:2018/01/25 22:47

変数名に変数をってのがわかりませんけど、何となく『ジャグ配列』とか『配列の配列』と言うものを使われては良いのかな?と言う気がします。


VBであればListクラスにDictionaryクラスを与えてやれば、Listクラスのインデックス毎にDictionaryクラスが存在する事で固定化されない値の保持が出来るんですけど。

VBAでそれをやろうとするなら、.NETのArrayListクラスとVBSのDictionaryオブジェクトの組み合わせになるのかな?
それともArrayListクラスとVariant型を組み合わせるのか?

私の理解が間違っているかもですけどね。
ちょっとPCが逝ってしまいサンプルコード化が困難ですのでごめんなさい。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
No.3の方のリンクにジャグ配列の話がありますね。
明日試してみたいと思います。
ありがとうございます!

お礼日時:2018/01/25 22:48

こんにちは


回答ではありませんが・・・


プログラム言語そのものも人が作っているものです。

例えば配列という概念は、複数の変数に対して同様の処理を行うのに有効ですし、それだけでなく、数学的な行列や多次元との整合も取れるので、大抵の言語に組み込まれている概念といえます。
『あればとても便利』という概念(機能)であれば、その言語に取り入られていると思いますが、ご質問のような機能を持った言語は(多分)ないのではないでしょうか?

・・という事実からして、できないと不便だと感じている人はほとんどいないということと想像できます。
それでも、その言語を利用して、様々な優秀な機能を持ったプログラムが数多く作成されていると言えます。
    • good
    • 0
この回答へのお礼

ご意見ありがとうございます。

お礼日時:2018/01/25 13:24

出来ないと思います。

そのために「検討2」の方法が用意されているわけですから…
ところで、なぜ変数名を変更しないといけないか教えていただけますか?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
検討3を例に回答させていただきます。
a(i)(j,k)という記述が作成できると

For i = 1 to 3
  For j = 1 to Ubound(a(i),1)
  Next
Next i

という記述が可能になります。
例1の数値を借りますと、
Ubound(a(1),1)=5
Ubound(a(2),1)=8
Ubound(a(3),1)=6
となります。

検討2ですと

For i = 1 to 3
  For j = 1 to Ubound(a,1)
  Next
Next i

と書くと、Ubound(a,1)が8で固定されてしまい、
Ubound(a,1)の代わりに別途上限の情報をもった変数を使用するか、空白になったらForを抜けるという処理が必要になります。
やりたいことができると、こういうプラスαの処理が不要になり記述が減ります。

検討3の取得方法ではやりたことができるため、初めからこういうのを作れないかと思い質問させていただきました。


a(i)(j,k)の形でなくても、上記のようにプラスαの処理なくできる記述方法があればぜひご教示くださいませm(_ _)m

お礼日時:2018/01/25 13:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A