• ベストアンサー

要素数未定の2次元配列について

【開発環境】VB6_SP5  OS:WinXP 非常に困っています。どうかご教示お願い致します。 コマンドボタンを押す度に、そのフォームのデータ(Text(n).Text)を 2次元配列に格納したいのですが、コマンドボタンを押す度にReDimを 通過するため、前に格納したデーター「配列名(0,0)等」が消えてしまいます。 Publicで使える様に配列HairetsuA~Cについて、何かよい知恵はありませんか? Option Explicit Public Const YousoMax = 10 Public HairetsuA() As String Public HairetsuB() As String Public HairetsuC() As String Public YousoA as Integer -------------------------------------------------- Private Sub Command1_Click() Dim YousoB As Integer ReDim HairetsuA(YousoA, YousoB) As String ReDim HairetsuB(YousoA, YousoB) As String ReDim HairetsuC(YousoA, YousoB) As String    For YousoB = 0 To YousoMax       If Form1.Text1.Text <> "" Then          ReDim Preserve HairetsuA(YousoA, YousoB) As String          ReDim Preserve HairetsuB(YousoA, YousoB) As String          ReDim Preserve HairetsuC(YousoA, YousoB) As String          HairetsuA(YousoA, YousoB) = Form1.Text1.Text          HairetsuB(YousoA, YousoB) = Form1.Text2.Text          HairetsuC(YousoA, YousoB) = Form1.Text3.Text       Else          Exit For       End If    Next    YousoA = YousoA + 1 End Sub 分かり難い説明ですが、HairetsuAだけを取って言葉で説明しますと コマンドボタンを押す度に HairetsuA(0,0)にはアイウエオ HairetsuA(0,1)にはカキクケコ HairetsuA(0,2)にはサシスセソ    ・    ・    ・ HairetsuA(0,n)にはラリルレロ (コマンドボタンを押す) (HairetsuA(0,0)~HairetsuA(0,n)のデータは維持したままで) HairetsuA(1,0)にはABCDE HairetsuA(1,1)にはFGHIJ HairetsuA(1,2)にはKLMNO    ・    ・    ・ HairetsuA(1,n)にはVWXYZ    ・ (途中幾度かコマンドボタンを押下) (HairetsuA(0,0)~HairetsuA(n-1,n-1)のデータは維持したままで)    ・ HairetsuA(n,n)にはチリヌルオ どうか良いお知恵をください。 どうぞ宜しくお願い致します。

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

  • ベストアンサー
  • pulsa
  • ベストアンサー率57% (34/59)
回答No.2

ちょっとメンドクサイ&難しいですが、ジャグ配列にしてはいかがでしょう HairetsuA(YousoA)(YousoB) ってな感じで使います 説明用にあえてイモく書いている部分があります Option Explicit Const YousoMax = 10 Public HairetsuA Public HairetsuB Public HairetsuC Public YousoA As Integer Private Sub Command1_Click()   Dim YousoB As Integer   Dim bufHairetsuA   Dim bufHairetsuB   Dim bufHairetsuC      If YousoA = 0 Then     ReDim HairetsuA(0)     ReDim HairetsuB(0)     ReDim HairetsuC(0)   Else     ReDim Preserve HairetsuA(YousoA)     ReDim Preserve HairetsuB(YousoA)     ReDim Preserve HairetsuC(YousoA)   End If      ReDim bufHairetsuA(0)   ReDim bufHairetsuB(0)   ReDim bufHairetsuC(0)   For YousoB = 0 To YousoMax     If YousoB > 0 Then '変数がEmptyの時Preserve 出来ない対応       ReDim Preserve bufHairetsuA(YousoB)       ReDim Preserve bufHairetsuB(YousoB)       ReDim Preserve bufHairetsuC(YousoB)     End If     If Form1.Text1.Text <> "" Then        bufHairetsuA(YousoB) = Form1.Text1.Text '格納用配列に追加        bufHairetsuB(YousoB) = Form1.Text2.Text '格納用配列に追加        bufHairetsuC(YousoB) = Form1.Text3.Text '格納用配列に追加     Else        Exit For     End If   Next   HairetsuA(YousoA) = bufHairetsuA  '配列書き出し   HairetsuB(YousoA) = bufHairetsuB  '配列書き出し   HairetsuC(YousoA) = bufHairetsuC  '配列書き出し   YousoA = YousoA + 1 End Sub End Subにブレイクを置いて実行して見て下さい ウォッチウィンドウにHairetsuAなどを入れて見れば大体判るかと思います 簡単に説明すると、配列を配列に叩き込みます コレはVariant型が何でも入る事を利用しています 相当なメモリを消費しますので、思ったより拡張できないかもしれません >HairetsuA(n,n)にはチリヌルオ は HairetsuA(n)(n)にはチリヌルオ となります エクセルVBAでしか試してない(WinXP Excel2003)ので、微妙に違うかも… がんばってねぇ~(^^)/~

Project_D
質問者

お礼

pulsa様 おはようございます。早々のご回答ありがとうございました。 しかも実はこっそり望んでおりました、サンプルコードまで書いて頂き とても感謝致します。 当方も早速、ジャグ配列のコーディングを行いました。 結果、無事に思う様に各要素が各配列に格納できました。 このジャグ配列とは多段配列とはまた違うんですね! もっぱら多段配列も使ったことないのですが・・・(^^;A redfox63様の回答レスにも書かせて頂きましたが、私の思い込みで ReDim Preserveは全次元を変更出来ると言う雄大なものでした(^^;A 本当に助かりました。ありがとうございました。

その他の回答 (1)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

この仕様だと無理があると思いますよ 内容を保持したままにする場合 Preserveを使いますがこの場合は 最後の次元の添え字は変更出来ますが、それ以外を変更しようとするとError9が発生します 今回の場合なら YousoAは固定になり、YousoBはReDimで変更可能です しかし ReDim Preserve HairetsuA( 3, 2 ) を実行してから ReDim Preserve HairetsuA( 3, 1 )を実行してしまうと前回代入した HairetsuA( 3, 2 )の要素は破棄されてしまいます さほど大きくないデータなら 余裕を見て宣言しましょう または、1次元目を10固定にして、2次元目YousoAで拡張していくように変更してみましょう HairetsuA( 0, 0 ) = アイウエオ HairetsuA( 1, 0 ) = カキクケコ HairetsuA( 2, 0 ) = サシスセソ ... 次回は HairetsuA( 0, 1 ) = ABCDE HairetsuA( 1, 1 ) = FGHIJ HairetsuA( 2, 1 ) = KLMNO といった具合にしてやれば 要求を満たせそうですよ これなら ReDim Preserve HairetsuA( 10, YousoA ) で拡張でき以前のデータも消えることがありません

Project_D
質問者

お礼

redfox63様 早速のご回答ありがとうございました。 カンマ切りのcsvファイルの読み込み等でRedimとPreserveを幾度か 使って来てきました。 今回の問題があってヘルプを開いて該当部分を見たのですが、 一番大事な「最後の次元の添え字は変更出来ます」の『最後の添え字』を すっかり見落としてしていました。 Max32次元まであらゆるパターンに対応出来る魔法のステートメントだと 思ってました。 でも今回はクライアントがYousoAを幾らまでするかが全く不明で 予め決めるのは無理そうです。 なので今回はpulsa様のジャグ配列に挑戦してみようと思います。 しかし『最後の添え字』について思い違いの払拭と、早々のご回答に とても感謝いたします。ありがとうございました。

関連するQ&A