Accessレコードセットを動的配列に

このQ&Aのポイント
  • Access VBA 2007でテーブルのデータを取得した動的配列から、構造体定義した動的配列に入れる方法を教えてください。
  • テーブルの内容全てを動的配列に入れるための方法を教えてください。
  • コンパイルエラーが発生してしまっているので、問題の解決方法を教えてください。
回答を見る
  • ベストアンサー

Access レコードセットを動的配列に

初めて質問させていただきます。Access勉強中です。 Access VBA 2007 でテーブルのデータを取得した動的配列から、構造体定義した動的配列に入れたいのですが、コンパイルエラーが発生してしまいます。 ネットで調べたのですがわからずじまいで、ここで相談させていただいています。 やりたいことは、テーブルの内容全てを動的配列に入れたい、それだけです。 やり方には固執していませんので、よろしくお願いします。 [コンパイルエラー] パブリック オブジェクト モジュールで定義されたユーザー定義型に限り、変数に割り当てることができ、実行時バインディングの関数に渡すことができます。 [実際のプログラム]Form内のボタン押下時に実行される Private Sub btn_Click() Dim db As DAO.Database Dim rst As DAO.Recordset Dim varRecords As Variant Dim intRecCnt As Integer Set db = CurrentDb() Set rst = db.OpenRecordset(テーブル名称, dbOpenSnapshot) rst.MoveLast: rst.MoveFirst intRecCnt = rst.RecordCount varRecords = rst.GetRows(intRecCnt) Dim COutRec() As Record '行ループ For intRLoop = 0 To UBound(varRecords, 2) ReDim Preserve COutRec(intRLoop) '列方向(フィールド)のループ For intCLoop = 0 To UBound(varRecords, 1) '配列の各データを配列にセット COutRec(intRLoop, intCLoop) = varRecords(intCLoop, intRLoop) Next intCLoop Next intRLoop End Sub [構造体定義]標準モジュール内に定義している Type Record A As String B As String End Type

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

  • ベストアンサー
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.1

rst で扱うのはフィールド2つだけですよね。 であれば、以下でどうでしょうか。 Type Record   A As String   B As String End Type Private Sub btn_Click()   Dim db As DAO.Database   Dim rst As DAO.Recordset   Dim varRecords As Variant   Dim intRecCnt As Long   Dim i As Long   Dim COutRec() As Record   Set db = CurrentDb()   Set rst = db.OpenRecordset(テーブル名称, dbOpenSnapshot)   rst.MoveLast: rst.MoveFirst   intRecCnt = rst.RecordCount   varRecords = rst.GetRows(intRecCnt)   rst.Close   Set rst = Nothing: Set db = Nothing   ReDim COutRec(intRecCnt - 1)   '行ループ   For i = 0 To intRecCnt - 1     COutRec(i).A = varRecords(0, i)     COutRec(i).B = varRecords(1, i)   Next End Sub

1192296jp
質問者

お礼

回答ありがとうございます。 無事にできました。大変助かりました。

関連するQ&A

  • ACCESS レコードセット

    非連結フォーム(frm_B)のOPEN時にADOレコードセットでデータを表示させ、更新ボタンを押すと、追加クエリでそのフォーム上で表示されたデータをテーブル(tbl_B)に新規登録させ、さらにその非連結フォームには別のフォームの内容を表示させるVBAを書きましたが、最後に別のフォームの内容で非連結フォームにデータをセットしたとき?にテーブルのデータも更新されてしまいます。最初にテーブルに追加したデータとは切り離したいのですがどうすればうまくいくのでしょうか。 ・フォームfrm_BをOPEN 'DAOレコードセット Dim dbDAO As DAO.Database Dim rsDAO As DAO.Recordset Dim stSQL As String stSQL = "SELECT No.,規格No.,改訂No. FROM tbl_B " _ & "WHERE 規格No. ='" & Forms![frm_A].[規格No.] & "'" _ & "AND 改訂No. =" & Forms![frm_A].[改訂No.] & "" 'DAOレコードセット Set dbDAO = CurrentDb Set rsDAO = dbDAO.OpenRecordset(stSQL) Set Me.Recordset = rsDAO Me![No.].ControlSource = "No." Me![規格No.].ControlSource = "規格No." Me![改訂No.].ControlSource = "改訂No." 'DAOレコードセットクローズ Set rsDAO = Nothing Set dbDAO = Nothing ・更新ボタンクリック Private Sub cb_kaitei_Click() Dim stDocName As String   '追加クエリ stDocName = "q_B" DoCmd.OpenQuery stDocName, acNormal, acEdit Forms![frm_B].SetFocus Me![No.] = Forms![frm_A].[No.] Me![規格No.] = Forms![frm_A].[規格No.] Me![改訂No.] = Forms![frm_A].[改訂No.] ・ このときにレコードセットで追加したレコードのほうも更新されてしまいます。これを別のレコードと判断させたいのです。よろしくお願いします。

  • 空欄を含む項目のレコードセット

    Access 2003 DAO.Recordsetにてデータを取得しようと思うのですが テーブル項目に空欄がある場合はどのように書けばよろしいのでしょうか? Dim DB As DAO.Database Dim RS As DAO.Recordset Set DB = CurrentDb Set RS = daoDB.OpenRecordset("Aテーブル", dbOpenDynaset) RS.AddNew daoRS!ああ ああ = xx RS!Update ・・・ とするとエラーになります。 項目名"ああ ああ"はどのように書けばいいのでしょうか? よろしくおねがいします。

  • アクセス2000(ADO)のレコード更新について

    1件しかレコードがない[リスト連番T]テーブルのレコードを読みだして、(フィールド)リストNOをプラス1して更新したいです。 DOAが混ざっているのか、下記のようにエラーがでます。プラス1して更新する正しいプログラムを教えて下さい。 Private Sub リスト_Click() Dim DBS As Databasu Dim CNC As New ADODB.Connection Dim RST As New ADODB.Recordset Dim LISTNO As Intejer Set CNC = CurrentProject.Connection RST.Open "リスト連番T", CNC, adOpenKeyset,adLockOptimistic, adCmdTableDirect LISTNO = RST!リストNO RST.Close Set RST = Nothing CNC.Close Set CNC = Nothing Set DBS = CurrentDb Set RST = DBS.OpenRecordset("リスト連番T") With RST -----.Edit で コンパイルエラー-----   メソッドまたはデータメンバーがみつかりません .Edit !リストNO = LISTNO + 1 .Update .Close

  • アクセスVBA 変数での抽出条件の書きかた

    顧客データテーブルからの抽出です。 変数を使った書き方がわかりません。 よろしくお願いします。 テーブルのレコードには [氏名]:鈴木 [telnum]:0123456789 が存在します。 Private Sub テキスト0_BeforeUpdate(Cancel As Integer) Dim db As DAO.Database Dim rs As DAO.Recordset Set db = CurrentDb Set rs = db.OpenRecordset("顧客マスタ", dbOpenDynaset) Dim str As String str = "0123456789" rs.Filter = "[telnum] = ' " & str & " ' " Set rs = rs.OpenRecordset MsgBox (rs!氏名) ’←エラーメッセージ”カレントレコードがありません。”が出ます End Sub

  • レコードセットに新規追加する

    Access2013 VBAで ■テーブルa ・id ・名前 ・id2 とあり このテーブルのレコードセットを以下のように作ります。 dim Rec = dao.Recordset Set Db = CurrentDB set Rec = Db.OpenRecordset("Select * from [テーブルa] where id2 = " & 2, dbOpenDynaset) この時、このテーブルにid2=2のレコードが何もない場合、この生成したRecで、 Rec.AddNew Rec.Fields("名前").value = "名前" Rec.Update と出来ますでしょうか? よろしくお願いします。

  • Access レコードを分割してフォームで表示

    Access 2007です。 下記のような日記テーブルがあり、 その「行動」フィールドの中身を「●」の記号で レコードに分割して、 フォームに表示したいと思っています。 日記テーブル ID 年月日   天気  行動 1 2014/1/10  晴  ●読書。●新聞を読む。●散歩。 2 2014/1/11  曇  ●電車に乗る。●新年会。●庭の手入れ。●カラオケ。 3 2014/1/12  曇  ●昼寝。 4 2014/1/13  雨  ●買い物。●読書。 ・・・・ 結果フォーム(データシートビュー)で表示 年月日    行動 2014/1/10  読書。 2014/1/10  新聞を読む。 2014/1/10  散歩。 2014/1/11  電車に乗る。 2014/1/11  新年会。 2014/1/11  庭の手入れ。 2014/1/11  カラオケ。 2014/1/12  昼寝。 2014/1/13  買い物。 2014/1/13  読書。 もとの日記テーブルのデータは変更しません。 下記のように、VBAのコードの中で、 レコードセットを使えば、上記のようなレコードの分割ができると思うのですが、 うまくいきません。 rs2というレコードセットをどうやって作成すればいいのかわかりません。 (Set rs2 = DB.OpenRecordset ・・・ のような行が必要ではないか、と思うのですが、 そのやり方がわかりません。) やり方を教えていただけたら幸いです。 Dim DB As DAO.Database Set DB = CurrentDb() Dim rs1 As DAO.Recordset Dim rs2 As DAO.Recordset Set rs1 = DB.OpenRecordset("日記テーブル", dbOpenForwardOnly) Dim A As Variant Do Until rs1.EOF A = Split(rs1!行動, "●") For i = 1 to UBound(A) rs2.AddNew rs2!年月日 = rs1!年月日 rs2!行動 = rs1!A(i) rs2.Update Next i rs1.MoveNext Loop DoCmd.OpenForm "結果フォーム" Set Forms!結果フォーム.Recordset = rs2

  • コンボボックスにレコードセットでリストをセットする

    【Access2013/VBA】 ■テーブル構成 【分析テーブル】 ・分析ID(主キー) ・依頼ID(外部キー) ・会社ID 【会社管理テーブル】 ・会社ID(主キー) ・会社名 ■コード   Dim Rst As DAO.Recordset   Dim Db As DAO.Database   Dim SQL As String   Dim lngID As Long   Dim FlgWinLoad As Boolean      Me.FlgWinLoad = modPub.FlgWindowLoading      lngID = modPub.Selected依頼ID      'コンボボックスの設定   SQL = "SELECT DISTINCT [分析テーブル].[会社ID] as [会社ID1], "   SQL = SQL & " [分析テーブル].[依頼ID], "   SQL = SQL & " [会社管理テーブル].[会社ID] AS [会社ID2], "   SQL = SQL & " [分析テーブル].[会社ID] AS [会社ID3], "   SQL = SQL & " [会社管理テーブル].[会社名] "   SQL = SQL & "FROM [分析テーブル] LEFT JOIN [会社管理テーブル] ON "   SQL = SQL & " [分析テーブル].[会社ID] = [会社管理テーブル].[会社ID] "   SQL = SQL & "where [依頼ID]=" & lngID & " "   SQL = SQL & "ORDER BY [分析テーブル].[依頼ID] "   Set Db = CurrentDb   Set Rst = Db.OpenRecordset(SQL, dbOpenDynaset)   If Rst.EOF = True And Rst.EOF = True Then     GoTo errH        End If      Me.cmbo会社ID.ColumnCount = 5   Me.cmbo会社ID.ColumnWidth = "1cm;1cm;1cm;3cm;3cm"   Me.cmbo会社ID.RowSource = "会社ID1;依頼ID;会社ID2;会社ID3;会社名"   Me.cmbo施工会社ID.RowSourceType = "テーブル/クエリ"      Set Me.cmbo施工会社ID.Recordset = Rst.Clone    ■コード の終わり エラーになりませんが、画面でコンボボックスのリストが空になります。 解決方法を教えて頂きたいと思います。 よろしくお願いします。

  • レコード件数が返らない理由がわからない

    テーブル1にはレコードが5件入ってるのですが Private Sub レコード件数() Dim strSQL As String Dim rs As DAO.Recordset strSQL = "SELECT * FROM テーブル1;" Set rs = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset) Debug.Print rs.RecordCount End Sub これをすると1が返るのですがなぜでしょうか? レコードの数が返ると思ってるのですが違うのでしょうか?

  • Access2002 VB で「ユーザ定義型は定義されていません」

    Access2002で ------------------------------- Private Sub 起動パスの確認_Click() Dim db As DAO.Database Dim strPass As String Set db = CurrentDb strPass = db.Name Me.起動パス = strPass db.Close: Set db = Nothing End Sub ------------------------------- を実行すると コンパイルエラー: ユーザ定義型は定義されていません。 と表示されます。 他の方の質問の回答で、 ツール-参照設定 で「Microsoft DAO 3.6・・・」にチェックをつけてください。 とありましたが、ツールの中に「参照設定」が見つかりません。 この場合、どうしたら良いのでしょうか? 初歩的な質問ですみません。 教えてください。

  • DAO エクセルvbaからアクセスのレコードの件数

    DAOで、エクセルvbaからアクセスのレコードの件数を取得したいのですが Dim ac As Object Dim db As DAO.Database Dim rs As DAO.Recordset Set ac = CreateObject("Access.Application") Set db = ac.DBEngine.OpenDatabase("D:\あああ.accdb", False, True) Set rs = db.OpenRecordset("SELECT * FROM Tマスタ WHERE masterkey like '*四*';") i = rs.RecordCount Debug.Print rs("masterkey") rs.Close: Set rs = Nothing db.Close: Set db = Nothing ac.Quit: Set ac = Nothing をすると、抽出するレコードが1000件でも、必ず1が返ります。 masterkeyフィールドは文字列型です。 なぜ実際はたくさんのレコードがあるのに、1が返るのでしょうか?

専門家に質問してみよう