みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

要素数未定の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)にはチリヌルオ

どうか良いお知恵をください。
どうぞ宜しくお願い致します。

投稿日時 - 2008-06-09 21:57:36

QNo.4088151

困ってます

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

ちょっとメンドクサイ&難しいですが、ジャグ配列にしてはいかがでしょう
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)ので、微妙に違うかも…
がんばってねぇ~(^^)/~

投稿日時 - 2008-06-10 01:37:58

お礼

pulsa様
おはようございます。早々のご回答ありがとうございました。
しかも実はこっそり望んでおりました、サンプルコードまで書いて頂き
とても感謝致します。

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

投稿日時 - 2008-06-10 08:34:45

ANo.2

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.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 ) で拡張でき以前のデータも消えることがありません

投稿日時 - 2008-06-09 23:17:01

お礼

redfox63様

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

投稿日時 - 2008-06-10 07:52:27

あなたにオススメの質問