- ベストアンサー
要素数未定の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)にはチリヌルオ どうか良いお知恵をください。 どうぞ宜しくお願い致します。
- みんなの回答 (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)ので、微妙に違うかも… がんばってねぇ~(^^)/~
その他の回答 (1)
- redfox63
- ベストアンサー率71% (1325/1856)
この仕様だと無理があると思いますよ 内容を保持したままにする場合 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 ) で拡張でき以前のデータも消えることがありません
お礼
redfox63様 早速のご回答ありがとうございました。 カンマ切りのcsvファイルの読み込み等でRedimとPreserveを幾度か 使って来てきました。 今回の問題があってヘルプを開いて該当部分を見たのですが、 一番大事な「最後の次元の添え字は変更出来ます」の『最後の添え字』を すっかり見落としてしていました。 Max32次元まであらゆるパターンに対応出来る魔法のステートメントだと 思ってました。 でも今回はクライアントがYousoAを幾らまでするかが全く不明で 予め決めるのは無理そうです。 なので今回はpulsa様のジャグ配列に挑戦してみようと思います。 しかし『最後の添え字』について思い違いの払拭と、早々のご回答に とても感謝いたします。ありがとうございました。
お礼
pulsa様 おはようございます。早々のご回答ありがとうございました。 しかも実はこっそり望んでおりました、サンプルコードまで書いて頂き とても感謝致します。 当方も早速、ジャグ配列のコーディングを行いました。 結果、無事に思う様に各要素が各配列に格納できました。 このジャグ配列とは多段配列とはまた違うんですね! もっぱら多段配列も使ったことないのですが・・・(^^;A redfox63様の回答レスにも書かせて頂きましたが、私の思い込みで ReDim Preserveは全次元を変更出来ると言う雄大なものでした(^^;A 本当に助かりました。ありがとうございました。