プロが教える店舗&オフィスのセキュリティ対策術

次のページにてクラスモジュールを使ったレコードセット
の取得についてかかれています。

http://www.happy2-island.com/access/gogo04/capte …
http://www.happy2-island.com/access/gogo04/capte …
http://www.happy2-island.com/access/gogo04/capte …

ここでは単一レコードが前提になっているようですが、複数
レコードをループしながら値を取得する場合はどうすればいいの
でしょうか?

A 回答 (3件)

接続設定からレコード操作までをクラスにまとめたって感じだけど、VBA でそこまでする必要があるのかなぁと。



その前に質問者は ADODB.Recordset 型のオブジェクト変数を扱ったことがあり、カレント レコードを移動するとかも経験済みか?
と、一応聞いてみる。

Dim objDB As New MDBAccess
つまり objDB は MDBAccess クラスである。
MDBAccess クラスも独自のクラスである。

MDBAccess クラスの説明ページ
http://www.happy2-island.com/access/gogo04/capte …
このページには 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
    • good
    • 0
この回答へのお礼

ありがとうございます。

>接続設定からレコード操作までをクラスにまとめたって感じだけど、VBA でそこまでする必要があるのかなぁと。

どうなんでしょうねぇ。


>その前に質問者は ADODB.Recordset 型のオブジェクト変数を扱ったことがあり、カレント レコードを移動するとかも経験済みか?
と、一応聞いてみる。

これはいつもやってます。


>Do Until objDB.GetRS.EOF
>Debug.Print objDB.GetRS.Fields("hoge").Value
>objDB.GetRS.MoveNext
>Loop

これですね。同じようなのを書いたつもりでしたがそのときは動きませんでした。

参考にさせていただきながら書き直したら、動きました。

また、よろしくお願いします。

お礼日時:2009/11/18 19:05

よくは見てないけど初心者が参考にするには懲りすぎたコードのようです。


フォームに「次に」「前に」というボタンを作って
この流れならGetNext、GetPreviousというメソッドも作らないと使いづらいでしょうね。

RecordSetはOpen(取得できた)ときに複数あれば最初のレコードに位置づけられます。無ければEOF(Rs.EofがTrueになる){Rs:取得したRecordset}
この「位置づけられた」行(レコード)にカーソルがあるという言い方をします。

カーソルの移動はMovenext、MovePrevious、Movelast、MoveFirsrtで行います(MoveNext以外はあまり使わない)

この回答への補足

こんにちは。

標準モジュールではいつもやっているんですが。
やっているといってもExcelからクエリを発行
してSheet上にレコード値を表示するという感じ
です。Access自体はあまり使っていません。

標準モジュール内のコードをクラスを使うことで
シンプルにできないかと考えました。

今回はSQLSERVERへの接続でやっているんですが
一応、レコードはとれています。ただ、前後に動
けないんです。

どうしたものかと思いまして。

補足日時:2009/11/18 00:39
    • good
    • 0

あんたが書いたURLのどこをみればいいの?ようわからん。


自分がどうしたらどうなったとか、こういうコードでできますか?
って書いたらどう?

「レコードセットの取得」は単一レコードになるかも知れない、レコードが無いかもしれない、複数になるかもしれない、それを前提にコードを書くことはない。
あのURLも単一レコードを前提にしてないですよ。

クラスモジュールで書いたものを引用する前に標準モジュールでテストしてみたらどうです?

この回答への補足

すみません・・・
http://www.happy2-island.com/access/gogo04/capte …
のここの部分なんですが・・・

複数レコードあった場合、どうループさせるのかと思いまして。

'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

補足日時:2009/11/17 23:19
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A