
【開発環境】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)にはチリヌルオ
どうか良いお知恵をください。
どうぞ宜しくお願い致します。
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)ので、微妙に違うかも…
がんばってねぇ~(^^)/~
pulsa様
おはようございます。早々のご回答ありがとうございました。
しかも実はこっそり望んでおりました、サンプルコードまで書いて頂き
とても感謝致します。
当方も早速、ジャグ配列のコーディングを行いました。
結果、無事に思う様に各要素が各配列に格納できました。
このジャグ配列とは多段配列とはまた違うんですね!
もっぱら多段配列も使ったことないのですが・・・(^^;A
redfox63様の回答レスにも書かせて頂きましたが、私の思い込みで
ReDim Preserveは全次元を変更出来ると言う雄大なものでした(^^;A
本当に助かりました。ありがとうございました。
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 ) で拡張でき以前のデータも消えることがありません
redfox63様
早速のご回答ありがとうございました。
カンマ切りのcsvファイルの読み込み等でRedimとPreserveを幾度か
使って来てきました。
今回の問題があってヘルプを開いて該当部分を見たのですが、
一番大事な「最後の次元の添え字は変更出来ます」の『最後の添え字』を
すっかり見落としてしていました。
Max32次元まであらゆるパターンに対応出来る魔法のステートメントだと
思ってました。
でも今回はクライアントがYousoAを幾らまでするかが全く不明で
予め決めるのは無理そうです。
なので今回はpulsa様のジャグ配列に挑戦してみようと思います。
しかし『最後の添え字』について思い違いの払拭と、早々のご回答に
とても感謝いたします。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ExcelのINDEXとMATCH関数でスピ...
-
[エクセル]連続する指定範囲か...
-
【VBS】innerTEXTで取得した内...
-
VBA 配列に格納した値の平均の...
-
UNIQUE関数について。
-
構造体を使った時刻表(C)
-
ノーツのデータをVBScriptで取...
-
読み込みで一行おきに配列に格納
-
表にフィルターをかけ、絞った...
-
マップチップの描画について
-
[VBA]改行入りのセルの値を配列...
-
iniファイルのキーと値を取得す...
-
VB6.0 ファイルの一括読込み
-
任意の数値を、時系列に沿って...
-
Split関数でLong配列に格納する...
-
ExcelVBAの配列変数で一括でセ...
-
INDEX(D:D,L3)の意味は?
-
VBA初心者です。結合セルを保持...
-
レガシーASPの、携帯ブラウザか...
-
ExcelVBAを使って、値...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで、絶対値の平均を算...
-
[エクセル]連続する指定範囲か...
-
Excelのセルの色指定をVBAから...
-
ExcelのINDEXとMATCH関数でスピ...
-
表にフィルターをかけ、絞った...
-
array関数で格納した配列の型を...
-
【VBA】ユーザーフォーム リス...
-
配列がとびとびである場合の書き方
-
DataSetから、DataTableを取得...
-
読み込みで一行おきに配列に格納
-
エクセルでエラーを無視して一...
-
VBAでの100万行以上のデータの...
-
.NET - 配列変数を省略可能の引...
-
iniファイルのキーと値を取得す...
-
Excel オートフィルタのリスト...
-
SUMPRODUCT関数を用いた最小値
-
VBA 配列に格納した値の平均の...
-
Datatableへの代入
-
VB6.0 ファイルの一括読込み
-
[VBA]改行入りのセルの値を配列...
おすすめ情報