VBAでオブジェクトの配列を使用するには?

このQ&Aのポイント
  • Access2000のVBAでオブジェクトの配列を使用する方法を知りたいです。
  • VBAでクラスを作成し、プロシージャの呼び出しの引数に使用していますが、うまく配列を作成して返す方法が分かりません。
  • 呼び出し側でオブジェクトの配列を作成し、その配列をプロシージャに渡して使いたいのですが、エラーが出てしまいます。どのようにすれば実現できるでしょうか?
回答を見る
  • ベストアンサー

VBAでオブジェクトの配列を使用するには?

Access2000のVBAでプログラムをしています。 VBAでクラスを作成し、プロシージャの呼び出しの引数に使用しています。あるプロシージャで、クラスの配列を作成し、呼び出し元へ返したいと思っていますが、うまくいきません。これは、できないものなのでしょうか? ---(呼び出し側) Dim objA as clsA, aryB as variant ' 「aryB as Object」でもダメ procB objA, aryB Dim objTemp as Variant ' 「objTemp as Object」でもダメ For Each objTemp In aryB ' ここでエラー「オブジェクトが必要です」 MsgBox objTemp.AAA Next --- --- (プロシージャ側) Public Sub procB(ByRef objA as clsA, ByRef aryB as Variant) Dim aryRet() as clsB, lngI as long For lngI = 0 To 10 Redim Preserve aryRet(lngI) Dim objTemp as clsB Set objTemp = New clsB Set aryRet(lngI) = objTemp Next aryB = aryRet End Sub やりたいことは、プロシージャ側でオブジェクトの配列を作成し、呼び出し側に渡して、呼び出し側で、「For Each・・・Next」で回したいと思っています。 どのようにしたら実現できるか、知っている方、よろしくお願いします。

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

呼び出し側のFor Each objTemp In aryB の行へブレークポイントを設定しておいて実行し ローカルウィンドウで ローカル変数をウォッチして見ましょう aryBの型が Variant/Object(0to10) のようになっていませんか? 呼び出し側で clsBの配列を準備してprocBに渡しても同じでしょうか dim arClsB() as clsB procB objA, arClsB for each obnj in arClsB next といった具合で … # 当方のAccess2003ではお示しのコードであっさり動いてますが…

msystem
質問者

お礼

お返事遅くなって申し訳ありません。 実際のコードのポイントを抜き出して書いたつもりなのですが、ご指摘の通りAccess2000でもあっさり動いてしまいました。 実際のコードとの違いを検証していたのですが、まだ見つかっていません。 ちなみに、アドバイスどおり呼び出し側で配列にしてから渡してもだめでした・・・ 現実には、配列で返さずにCollectionオブジェクトで返すことで解決しました。 せっかくのアドバイスが無駄になって申し訳ありません。

関連するQ&A

  • 二次元配列のVBA

    二次元配列のVBAの書き方がよくわからないのですが、 私が作ったサンプルプログラムのSub 二次元()において 二次元配列で表すにはどうすればいいのでしょうか? Sub 二次元()では 配列を格納する変数はtmpしか使っていませんが もう一つ配列を格納する用の変数を作ればいいのでしょうか? 数字とアルファベットは別々に取り出したいです。 ----------------------------------------------------- Sub 一次元() Dim myStr As String Dim tmp As Variant Dim i As Long For i = 1 To 5 myStr = myStr & "," & i Next myStr = Mid(myStr, 2) tmp = Split(myStr, ",") For i = LBound(tmp) To UBound(tmp) Debug.Print tmp(i) Next i End Sub Sub 二次元() Dim myStr As String Dim tmp As Variant Dim i As Long For i = 1 To 5 myStr = myStr & "," & i & "と" & Chr(64 + i) Next myStr = Mid(myStr, 2) tmp = Split(myStr, ",") For i = LBound(tmp) To UBound(tmp) Debug.Print tmp(i) Next i End Sub

  • VBAの配列

    VBAの配列の処理でこまっています。 dim test as Variant test = Array( _ Array("Aさん", 65, 70, 45), _ Array("Bさん", 80, 10, 90)) とした成績データがありまして、あとから(定義の段階でなく)、"Cさん", 70, 70, 75をtest変数に追加したい場合、どのようにすればよいのでしょうか? また、これ(test)を戻り値にした場合、正しく左辺値にはいるのでしょうか?オブジェクトの解放などの問題も知りたいです。 function seiseki () as variant ... 上の処理 seiseki = test end function ...  dim cp as Variant cp = seiseki() 'cp変数にコピーされるのでしょうか?

  • VBAで配列のある部分だけをを配列に入れたい

    VBAを勉強をしております。 例えばA1からG20までをある配列に入れているとします。 その配列のある部分(例えばB1からC20)を、別の配列にいれるにはどうすれば良いのでしょうか。 以下の方法で試してみましたが、上手くいきません。 Dim A() As Variant Dim B() As Variant A = Range("A1:G20") B = Range(Cells(A(1,2),Cells(A(20,3)))

  • 配列

    エクセルvbaなのですが Sub test() ' 配列 Dim arr() As Integer= {0, 1, 2, 3, 4, 5} ' 抜き出した要素を格納するための変数 Dim i As Integer ' すべての要素について繰り返す For Each i In arr Console.WriteLine (i) Next End Sub これって何でエラーになるのでしょう? Dim arr() As Integer= {0, 1, 2, 3, 4, 5} でエラーになりますが、なぜだかわかりません。

  • エクセル(VBA)の空白配列の削除について

    エクセルのVBAで配列を使おうと考えています。 データ配列 = Split(データ源, Chr(13)) として、1次元配列に取り込んだところ、chr(10)だけが入力されたデータ配列(?)が出来てしまいました。このデータ配列を詰めたいのですが、何かいい方法が無いでしょうか?教えてください。 元の配列 データ配列(0)  "てすと1" データ配列(1)  chr(10) データ配列(2)  "テスト2" とすれば、 詰めたあと、 データ配列(0)  "てすと1" データ配列(1)  "テスト2" となるようにしたいのです。(配列の最大数が減る必要が必ずしもありません。) for each で回せばいいのでしょうか? Dim 仮 AS Variant for Each 仮 In データ配列    処理をここに書く Next では、上手く行きませんでした。 どなたか?詳しい方がいらっしゃいましたら教えてください。宜しくお願い致します。

  • VBAのdictionaryでAddの使い方

    VBAでつぎのコードを実行すると、a,A1.1の後、a,A2.2と表示します。 dicには、a,A2.2の設定をしていないのになぜこうなるのでしょうか? どなたか教えてください。 Sub sample() Dim dic As Object Dim subDic As Object Set dic = CreateObject("Scripting.Dictionary") Set subDic = CreateObject("Scripting.Dictionary") subDic.Add "A1", 1 dic.Add "a", subDic subDic.Add "A2", 2 '結果表示 Dim key1 As Variant Dim key2 As Variant For Each key1 In dic.keys For Each key2 In dic(key1).keys MsgBox key1 & "," & key2 & ". " & dic(key1)(key2) Next Next End Sub

  • Excel VBA のFor Each ・・・ Next について

    配列に数字(特段数字でなくても)入れたいのですが、以下のように書きました。 Sub test() Dim x As Variant Dim m(1 To 10) As Integer For Each x In m x.Value = 100 Next Stop End Sub Stopでとめてmを確認するとすべて0です。どうしてなのでしょうか。 配列ではなく Sub test() Dim x As Variant For Each x In range("a1:a10") x.Value = 100 Next End Sub とするとA1:A10には100が入ります。 この差がいまいちわからなくて、 もちろんFor ・・・ Nextで簡単に入れられるのは承知しています。 補足ですが また最初はx.valueの.valueをつけていなかったのでセルにも反映されませんでしたが.valueをつけると入りました。

  • VBA 乱数と配列

    VBA 乱数と配列 配列(0)~配列(5)の一次元配列の中に、1から6までの数字を重複しないように入れたいのですが、 上手くいきません。 ご指導の程、お願いします。 Sub rndsys() Dim 配列(5) As Integer Dim サイコロ As Integer Dim カウントA As Integer Dim カウントB As Integer Dim フラグ As Integer For カウントA = 0 To 5 Do サイコロ = Int(Rnd(1) * 6) + 1 For カウントB = 0 To 5 If 配列(カウントB) = サイコロ Then フラグ = フラグ + 1 End If Next カウントB Loop Until フラグ > 0 配列(カウントA) = サイコロ Next カウントA MsgBox 配列(0) & vbCrLf & 配列(1) & vbCrLf & 配列(2) & vbCrLf & 配列(3) & vbCrLf & 配列(4) & vbCrLf & 配列(5) End Sub

  • 【VBA】配列の部分コピー

    VBAにて、配列の範囲を指定して別の配列にコピーしたいと思っています。 現在は以下のようにFor文を使用して1つ1つ代入しているのですが、 もっと効率の良い方法はありますか? 処理速度を重視しています。 Dim srcArray As Variant: srcArray = Range("A1:A100") ' コピー元の配列 Dim dstArray As Variant ' コピー先の配列 Dim startIndex As Integer ' コピーする範囲の開始インデックス Dim endIndex As Integer ' コピーする範囲の終了インデックス startIndex = 6 endIndex = 16 ReDim dstArray(endIndex - startIndex) For si = startIndex To endIndex   dstArray(si - startIndex) = srcArray(si, 1) Next si

  • vbaで配列に値を格納する場合

    vbaで配列に値を格納する場合 変数の宣言はどちらを使った方が良いのでしょうか? Sub Sample1() Dim i As Long Dim myStr As String Dim tmp() As String myStr = "a,i,u,e,o" tmp = Split(myStr, ",") End Sub か Sub Sample1() Dim i As Long Dim myStr As String Dim tmp As Variant myStr = "a,i,u,e,o" tmp = Split(myStr, ",") End Sub でも問題なく動くのですが、 Variant型での宣言はあまりしない方が良いですか? あと Dim tmp() As String ならエラーにならないのですが Dim tmp As String だとエラーになってしまう理由がよくわからないので教えて頂けますか?

専門家に質問してみよう