
【開発環境】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で質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- Excel(エクセル) マクロでテキストファイルを読み込んだ際の最終セルにデータと改行が含まれる問題の改善方法 2 2022/03/25 16:50
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) VBA横データを縦にしたいです 2 2023/08/08 19:38
- Visual Basic(VBA) 稀に1円合いません? Sheet1から金額と個数を貼り付ける下記コードで、金額を切り上げるコードを何 3 2022/09/05 15:11
- Visual Basic(VBA) 別シートのデータを参照して値を入れたい。 まとめデータシートのC列D列の値を商品一覧シートのコードが 7 2022/08/17 13:20
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
[エクセル]連続する指定範囲か...
-
表にフィルターをかけ、絞った...
-
エクセルで、絶対値の平均を算...
-
【VBA】ユーザーフォーム リス...
-
【VBA】配列に数式を仕込む方法...
-
VBAでの100万行以上のデータの...
-
ExcelのINDEXとMATCH関数でスピ...
-
Excel オートフィルタのリスト...
-
C#の配列リストを機械的に複数...
-
エクセルでエラーを無視して一...
-
Dictionaryを使い4つの条件の一...
-
配列の受け渡しについて
-
要素数未定の2次元配列について
-
二次元配列の中の各行の要素を...
-
VBA 配列に格納した値の平均の...
-
[VBA]改行入りのセルの値を配列...
-
配列がとびとびである場合の書き方
-
array関数で格納した配列の型を...
-
数字をコンマで区切った文字列...
-
エクセルマクロについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
[エクセル]連続する指定範囲か...
-
エクセルで、絶対値の平均を算...
-
ExcelのINDEXとMATCH関数でスピ...
-
表にフィルターをかけ、絞った...
-
DataSetから、DataTableを取得...
-
Excelのセルの色指定をVBAから...
-
配列がとびとびである場合の書き方
-
array関数で格納した配列の型を...
-
読み込みで一行おきに配列に格納
-
【VBA】ユーザーフォーム リス...
-
Excel オートフィルタのリスト...
-
.NET - 配列変数を省略可能の引...
-
VBA 配列に格納した値の平均の...
-
iniファイルのキーと値を取得す...
-
Split関数でLong配列に格納する...
-
VB6.0 ファイルの一括読込み
-
[VBA]改行入りのセルの値を配列...
-
配列のSession格納、及び取得方...
-
VBAでの100万行以上のデータの...
-
エクセル 条件を指定した標準...
おすすめ情報