AccessVBAで二次元配列を動的に設定する方法

このQ&Aのポイント
  • AccessVBAで、二次元配列を動的に設定する方法について解説します。
  • 以下のコードには、DB上のデータを取得して配列attrに設定する方法が書かれています。
  • しかし、このコードはうまく動作しないようです。ご教授願います。
回答を見る
  • ベストアンサー

AccessVBAで、二次元配列を動的に設定したい

以下のコードにあるattrという配列に、DB上のとあるコードと名前を設定したいと思います。 DB上のデータ量は可変なので、データを取得するごとに動的に配列attrの要素数を動的に増やしたいと思っています。 検索等で色々と調べながら以下のコードを書いてみたのですが、どうもうまく動きません。 ご教授願います。 --------------------------------------------------- Dim attr() As String [loop start] ReDim Preserve attr(i, 0) ReDim Preserve attr(i, 1) attr(i, 0) = コード attr(i, 1) = 名前 [loop end]

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

  • ベストアンサー
  • myRange
  • ベストアンサー率71% (339/472)
回答No.1

   変更できるのは最後の次元だけでは? 詳しくはヘルプ参照のこと。 [loop start]   ReDim Preserve attr(1,▼ i)   attr(0, i) = コード   attr(1, i) =名前 [loop end]    

audrey1800
質問者

お礼

試してみたところ期待通りに動作しました。 ありがとうございました。

関連するQ&A

  • VB6で、一次元配列と二次元配列の相互コピー

    VB6で、一次元配列と二次元配列の相互コピーをしたいです。 (1)元々下記のような宣言をもつ配列がありました。 Public Type TKey no As String id As String code As String atr() As String End Type Public Type tr Key As TKey atr() As String abc As Boolean End Type Public gtr() As tr (2)コピー用に、下記のような二次元配列用宣言をつくりました。 Public Type TKey2 2no As String 2id As String 2code As String a2tr() As String End Type Public Type 2tr Key22 As TKey2 atr22() As String abc22 As Boolean End Type Public g2tr() As 2tr (3)  (1)から(2)にデータを複製したり、 (4)  (2)から(1)にデータを複製したいです。 今は、下記のように面倒くさいことをしています。 dim gtr(maxcnt) ReDim Preserve g2tr(500, maxcnt) ループ g2tr(cnt, i).Key22.2code = gtr(i).Key.code ・・・(3) gtr(i).Key.code = g2tr(j, i).Key22.2code ・・・(4)       今は上記を全ての宣言の配列に実行しています。 なにかもっと効率のよい方法はないでしょうか。 (1)の配列は、1~500くらいはあり、不定です。

  • VBScripの2次元動的配列

    下記VBScripサンプルで2次元動的配列をつかっているのですが redim preserveでエラになります。 (インデックスが有効範囲にありません) 原因をご伝授ください。 環境 IIS 5.0 Windows XP index.asp <%@ LANGUAGE="VBScript" %> <% 'option explicit %> <!-- #include file="test.asp" --> <% Dim Order() Dim dat() call test(Order,dat) response.write("dat=" & dat(1,2)) %> test.asp <%'Option Explicit%> <% function test(Order_info,dat) Dim i redim dat(0,7) for i=0 to 1 <- iが0の時はOK,iが1になるとエラー redim preserve dat(i,7) dat(i,1)="1" dat(i,2)="2" dat(i,3)="3" dat(i,4)="4" dat(i,5)="5" dat(i,6)="6" next End function

  • VBAの動的配列について

    いつもお世話になっております。 エクセルVBAを学習中の者です。 動的配列についてお伺いします。 添付資料を見て頂きたいのですが、 シート名1~4に同一レイアウトの表があります。 これらの表をを2次元配列に格納し、その後、同一レイアウトのシートに一括転記したいと考えています。 転記の事を考えて、条件としては、 シート1から2行目以降のデータを配列『data』に格納、変数『dataCnt』が転記先の行番号と同じになるように考えています。 当初は、配列の定義を『Dim data(100,3) As Variant』と、多めに要素数を定義して、コードを記述していました。 正直、凄く気持ちが悪い感じでした・・・ 最近、動的配列を学習しまして、 シートごとにデータの行数を変数『lastRow』に格納して、配列を再定義して【データ数=要素数】とならないか? と思い、下記のようなコードを書いてみました。 が、『ReDim Preserve~』で実行エラーが発生してしまいます。 原因がなぜかわかりません! そもそも、動的配列はこのような使い方は出来ないのでしょうか? Sub テスト() Dim data() As Variant Dim x As Long Dim i As Long Dim ii As Long Dim lastRow As Long Dim dataCnt As Long dataCnt = 2 For x = 2 To 5 Worksheets(x).Activate lastRow = Cells(Rows.Count, 1).End(xlUp).Row If x = 2 Then ReDim data(2 To lastRow, 3) Else ReDim Preserve data(2 To dataCnt + lastRow - 1, 3) End If For i = 2 To lastRow For ii = 1 To 3 data(dataCnt, ii) = Cells(i, ii) Next ii dataCnt = dataCnt + 1 Next i Next x End Sub どなたかご指導をよろしくお願いいたします。

  • ReDim Preserveできなかった配列をUBOUND……

    VBScriptでプログラムを組んでおります。 初心者なので言葉の使い方が間違っているかもしれませんがご容赦ください。 ASPでDBにアクセスして、このときにReDim Preserveを使って配列(str)を動的に拡張しながらDBから項目を抽出しています。 この動的に作った配列の項目を表示する際にどうしても項目数が必要なので UBound(str)で要素数を抜き出して使用しています。 DBにデータがあれば問題ないのですが、DBにデータがない場合はUBound(str)実行時に -------------------------- Microsoft VBScript 実行時エラー (0x800A0009) インデックスが有効範囲にありません。: 'ubound' -------------------------- と表示されてしまいます。 これを回避するにはDBから1つの項目を抽出する度に+1するような変数を作れば事足りるとは思いますが、 そうすると配列内の項目を表示する関数の引数を増やすことになり、少し納得がいきません。 Dim str() において Redim str(1)をしたかしてないかを見分ける方法を教えてくださいませんか。 ……無ければ「無い」と仰ってくれれば助かります。 では失礼します。 お時間があればご協力宜しくお願いします。

  • 配列の要素数について

    下記の記述の場合、配列の要素数っていくつになりますか? Dim strArray() As String ReDim strArray(0) また下記のように、配列の要素数を具体的に書かずに使った場合不具合はでますか? Dim strArray() As String strArray(0) = "aa" strArray(1) = "bb"

  • 要素数未定の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)にはチリヌルオ どうか良いお知恵をください。 どうぞ宜しくお願い致します。

  • VBAで配列に文字列が入らない?

    以下のように配列を設定し、A(ix)の配列にdo untilでそれぞれに文字列を入れようとしておりますが、うまくいきません。 dountil の一回目では代入ができているようですが、2回目ができずに止まってしまいます。 おかしな点がありましたらご指摘いただけませんでしょうか。 Dim A() As String Dim ix As Long ix = 0 ReDim Preserve A(ix) Dim tate As Long tate = 1 Do Until tate = 8 A(ix) = ws.Cells(tate, 1) tate = tate + 1 ix = ix + 1 Loop Doの初回A(0)に文字列は入りますが、 Doの二回目以降A(1)に文字列を入れる作業ができずに止まってしまいます。 よろしくお願いします。

  • 配列のつなげ方

    配列をつなげて文字列にしたいと思っています。 Dim abc() As String Dim i As String Dim namae As String i=0 ここでDBに接続してループでまわしながらデータを取得してきます。 Do while y > z abc(i) = X i = i+1 loop Xはループがまわる毎に違う値がセットされます。例えば1回目のループでリンゴ、2回目のループでミカンといった具合にです。 つまり、abc(0)=リンゴ、abc(1)=ミカン、abc(2)=メロン といった具合にです。 最終的には namae="リンゴ、ミカン、メロン、・・・・"といった具合にnamaeに代入したいと思っています。namae = abc(0) & "," & abc(1) & ","....と やれば実現できるのはわかります。 Xにはデータがいくつはいっているかわかりません。どうやった式をたてれば、実現できるでしょうか?

  • Visual Studio 2003での2次元可変長配列でエラー

    Visual Studio 2003での2次元可変長配列でエラーが発生します。 エラー内容 'System.NullReferenceException' のハンドルされていない例外が microsoft.visualbasic.dll で発生しました。 追加情報 : オブジェクト参照がオブジェクト インスタンスに設定されていません。 ソースは dim return_array()() For i As Integer = 0 To 5 Step 1 ReDim Preserve return_array(i)(6) Next のような感じです。 ループを使う必要があるのはreturn_array()()が状況に応じてサイズを変更が必要なためです。

  • ReDim PreserveよりもReDimが遅い

    こんにちは、配列がいくつまで取得できるのか計算するマクロを作っている時に変なことに気が付きました。 エクセルでフォームとラベルを1つ用意し、下記のようなプログラムをモジュールに書きます。 実行すると、10万ずつ数字が増えていき、数字が1000~2000万超えたあたりで、メモリ不足ですという 表示がでます。 ここで、ReDim PreserveのPreserveをとって、ReDimだけにすると、数字の増え方が目に見えて遅くなります。 ReDim Preserveとしたときは9.5秒ぐらいですが ReDim の時は 30秒以上かかっています 3台のマシンでテストしましたが、どれも似たような結果になりました 普通に値を保持するredim Preserveの方が遅いと思うのですがなぜこのような結果になるのでしょうか? ご教授お願いいたします。 Public Sub 配列上限取得計算() On Error GoTo ErrEnd Dim i As Long Const kankaku As Long = 100000 ReDim ans(1 To kankaku) As String ans(1) = 1 i = 2 UserForm1.Show vbModeless Do If i Mod kankaku = 0 Then DoEvents UserForm1.Label1 = i 'ここのPreserveをなくすと明らかに遅くなる ReDim Preserve ans(1 To i + kankaku) As String End If ans(i) = i i = i + 1 Loop Erase ans Unload UserForm1 Exit Sub ErrEnd: MsgBox "これ以上の配列を設定できません。" & vbCrLf & "上限は" & i & "です。" & vbCrLf & Err.Description Erase ans Unload UserForm1 End Sub

専門家に質問してみよう