• ベストアンサー

クラスモジュールを使ったレコードセットの取得

次のページにてクラスモジュールを使ったレコードセット の取得についてかかれています。 http://www.happy2-island.com/access/gogo04/capter01400.shtml http://www.happy2-island.com/access/gogo04/capter01500.shtml http://www.happy2-island.com/access/gogo04/capter01600.shtml ここでは単一レコードが前提になっているようですが、複数 レコードをループしながら値を取得する場合はどうすればいいの でしょうか?

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

  • ベストアンサー
回答No.3

接続設定からレコード操作までをクラスにまとめたって感じだけど、VBA でそこまでする必要があるのかなぁと。 その前に質問者は ADODB.Recordset 型のオブジェクト変数を扱ったことがあり、カレント レコードを移動するとかも経験済みか? と、一応聞いてみる。 Dim objDB As New MDBAccess つまり objDB は MDBAccess クラスである。 MDBAccess クラスも独自のクラスである。 MDBAccess クラスの説明ページ http://www.happy2-island.com/access/gogo04/capter01400.shtml このページには ExecSelect() メソッドの説明も書かれている。 説明によれば ExecSelect() メソッドを実行すると、レコードセットを変数 objADORS に格納する、と書いてある。 変数 objADORS についても同じページ内に説明が書いてある。 説明によれば objADORS は単なる ADODB.Recordset である、と。 外部から objADORS にアクセスするには MDBAccess の GetRS プロパティーを使うらしい。 GetRS は単純に objADORS 内で持っている ADODB.Recordset 型の objADORS を返すだけ。 しかし MDBAccess クラスにカレント レコードを移動するメンバーが実装されていないので、GetRS で受け取ったレコードセットの Fields プロパティー等で取得できるのはカレント レコードの情報だけ。 GetRS が ADODB.Recordset を参照渡しでまんま返しているので、GetRS.Fields("name").Value とか使えるわけで、それなら GetRS.MoveNext とかも使えるはず。 Dim objDB As New MDBAccess Dim strSQL As String strSQL = "SELECT * FROM tbl01" If objDB.ExecSelect(strSQL) Then ' ここから Do Until objDB.GetRS.EOF Debug.Print objDB.GetRS.Fields("hoge").Value objDB.GetRS.MoveNext Loop ' ここまで End If とやる。 または、 Dim objDB As New MDBAccess dim strSQL as String strSQL = "SELECT * FROM tbl01" If objDB.ExecSelect(strSQL) Then ' ここから Dim myRS As ADODB.Recordset Set myRS = objDB.GetRS Do Until myRS.EOF Debug.Print myRS.Fields("hoge").Value myRS.MoveNext ' ここまで Loop End If

ap_ex_mem
質問者

お礼

ありがとうございます。 >接続設定からレコード操作までをクラスにまとめたって感じだけど、VBA でそこまでする必要があるのかなぁと。 どうなんでしょうねぇ。 >その前に質問者は ADODB.Recordset 型のオブジェクト変数を扱ったことがあり、カレント レコードを移動するとかも経験済みか? と、一応聞いてみる。 これはいつもやってます。 >Do Until objDB.GetRS.EOF >Debug.Print objDB.GetRS.Fields("hoge").Value >objDB.GetRS.MoveNext >Loop これですね。同じようなのを書いたつもりでしたがそのときは動きませんでした。 参考にさせていただきながら書き直したら、動きました。 また、よろしくお願いします。

その他の回答 (2)

  • rivoisu
  • ベストアンサー率36% (97/264)
回答No.2

よくは見てないけど初心者が参考にするには懲りすぎたコードのようです。 フォームに「次に」「前に」というボタンを作って この流れならGetNext、GetPreviousというメソッドも作らないと使いづらいでしょうね。 RecordSetはOpen(取得できた)ときに複数あれば最初のレコードに位置づけられます。無ければEOF(Rs.EofがTrueになる){Rs:取得したRecordset} この「位置づけられた」行(レコード)にカーソルがあるという言い方をします。 カーソルの移動はMovenext、MovePrevious、Movelast、MoveFirsrtで行います(MoveNext以外はあまり使わない)

ap_ex_mem
質問者

補足

こんにちは。 標準モジュールではいつもやっているんですが。 やっているといってもExcelからクエリを発行 してSheet上にレコード値を表示するという感じ です。Access自体はあまり使っていません。 標準モジュール内のコードをクラスを使うことで シンプルにできないかと考えました。 今回はSQLSERVERへの接続でやっているんですが 一応、レコードはとれています。ただ、前後に動 けないんです。 どうしたものかと思いまして。

  • rivoisu
  • ベストアンサー率36% (97/264)
回答No.1

あんたが書いたURLのどこをみればいいの?ようわからん。 自分がどうしたらどうなったとか、こういうコードでできますか? って書いたらどう? 「レコードセットの取得」は単一レコードになるかも知れない、レコードが無いかもしれない、複数になるかもしれない、それを前提にコードを書くことはない。 あのURLも単一レコードを前提にしてないですよ。 クラスモジュールで書いたものを引用する前に標準モジュールでテストしてみたらどうです?

ap_ex_mem
質問者

補足

すみません・・・ http://www.happy2-island.com/access/gogo04/capter01600.shtml のここの部分なんですが・・・ 複数レコードあった場合、どうループさせるのかと思いまして。 'SQLの組み立て strSQL = "" strSQL = strSQL _ & "SELECT * " _ & " FROM アドレス帳テーブル" _ & " WHERE レコードキー =" _ & Forms("アドレス帳メニュー").一覧.Form("レコードキー").Value 'SELECTの実行と結果判定 If objDB.ExecSelect(strSQL) = True Then 'SELECTが成功したときはフォームのコントロールへ取得した内容をセットする Me.漢字氏名.Value = objDB.GetRS.Fields("漢字氏名").Value Me.カナ氏名.Value = objDB.GetRS.Fields("カナ氏名").Value Me.性別.Value = objDB.GetRS.Fields("性別コード").Value Me.関係.Value = objDB.GetRS.Fields("関係コード").Value Me.生年月日.Value = objDB.GetRS.Fields("生年月日").Value Me.職業.Value = objDB.GetRS.Fields("職業").Value Me.郵便番号.Value = objDB.GetRS.Fields("郵便番号").Value Me.都道府県.Value = objDB.GetRS.Fields("都道府県コード").Value Me.住所.Value = objDB.GetRS.Fields("住所").Value Me.電話番号.Value = objDB.GetRS.Fields("電話番号").Value Me.FAX番号.Value = objDB.GetRS.Fields("FAX番号").Value Me.携帯等電話番号.Value = objDB.GetRS.Fields("携帯等電話番号").Value Me.PCメールアドレス.Value = objDB.GetRS.Fields("PCメールアドレス").Value Me.携帯メールアドレス.Value = objDB.GetRS.Fields("携帯メールアドレス").Value Me.備考.Value = objDB.GetRS.Fields("備考").Value '非表示フィールドです。更新時のレコード特定に使います。 Me.レコードキー.Value = objDB.GetRS.Fields("レコードキー").Value 'SELECTが失敗したとき Else '登録失敗メッセージ MsgBox "DBエラーが発生しました", vbOKOnly + vbExclamation, "呼び出し失敗" 'フォームを閉じる DoCmd.Close acForm, "登録内容変更" End If