アプリ版:「スタンプのみでお礼する」機能のリリースについて

私の環境はOS:Xp
     ACCESS2000です。

宜しくお願いします。

大変抽象的な質問の仕方で申し訳無いのですが、
テーブルにセットされているレコードを検索したいのですが、「次へ」というボタンを作ってそれを押すと今表示されている内容の次のレコードの内容が表示されるという仕組みのボタンを作りたいのです。
それをAccessVBAで記述したいのですが、どのように記述したら良いか解りません。

もし知っていらっしゃる方がおられましたら、宜しくお願い致します。

A 回答 (4件)

レコードセットを作成した上で、検索・表示されていると思います。



レコードセットをrsとして定義しているとして、
rs.MoveNext を記述して下さい。

この回答への補足

さっそく回答を頂きありがとうございます。

現在は・・・

Private Sub 次へ_Click()

Dim ws As DAO.Workspace
Dim DB As DAO.Database
Dim rs As DAO.Recordset
Dim sql As String

Set ws = DBEngine.Workspaces(0)
Set DB = ws.Databases(0)

sql = "select * from ポイント管理テーブル where 顧客コード = '" & Me.顧客コード & "';"

Set rs = DB.OpenRecordset(sql)

rs.MoveNext

If rs.EOF = True Then
MsgBox ("データがありません。")
Exit Sub
End If

こういった感じで記述しているのですが、これだと「次へ」ボタンを押すたびにSQLでレコードをセットし直してしまうので、2件目のレコードしか表示されません。

こういった場合、どうしたら良いのでしょうか?

宜しくお願いします。

補足日時:2004/12/18 20:51
    • good
    • 0

こんばんは。



レコードセットのオブジェクト変数を、rsとして、

「次へ」ボタンのクリックイベントに、

rs.MoveNext
If rs.EOF Then
rs.MoveLast
End If

と、記述してください。

IF~End Ifを入れないと、
最終レコードの状態で「次へ」ボタンをクリックするとエラーになってしまいます。
    • good
    • 0

おはようございます、No.2です。



「次へ」ボタンのクリック・イベントには、
----------------------------------------
rs.MoveNext
If rs.EOF = True Then
rs.MoveLast
MsgBox ("これ以上データはありません。")
End If
----------------------------------------
コレ↑だけを記述してください。(メッセージは適当に修正してください)

>「次へ」ボタンを押すたびにSQLでレコードをセットし直してしまうので、
>2件目のレコードしか表示されません。

それは「次へ」ボタンのクリック・イベントに
----------------------------------------
sql = "select * from ポイント管理テーブル where 顧客コード = '" & Me.顧客コード & "';"
Set rs = DB.OpenRecordset(sql)
----------------------------------------
↑が記述されているからです。

これではボタンをクリックするたびに、入力されている顧客コードのレコード→次のレコード→入力されている顧客コードのレコード、のくり返しになってしまいます。

「次へ」ボタンのイベントに記述するものではありません。
   ◇
おそらく、オブジェクト変数の適用範囲を間違えていることに問題があるのだと思います。
オブジェクト変数をプロシージャーごとに宣言しておられませんか?
--------------------------------
Dim ws As DAO.Workspace
Dim DB As DAO.Database
Dim rs As DAO.Recordset
---------------------------------
これら↑の変数は、フォームの宣言セクション(General-Declarations)で1回だけ宣言しておけばいいものです。
そこで宣言しておけば、その変数はフォームのすべてのプロシージャーから参照することができます(<モジュールレベル変数>というものです)。
いちいちプロシージャーごとに宣言するものではありません。
(「次へ」ボタンのクリック・イベントだけに使うのなら別ですが・・)

★VBAの参考書をお持ちなら「変数の適用範囲」について書かれているところを、よくお読みください。

--------------------------------
Set ws = DBEngine.Workspaces(0)
Set DB = ws.Databases(0)
--------------------------------
この↑Setを使った変数への代入も、フォームのLoadイベントで行ってください。
そうすればフォームを閉じるまで、代入する必要なく変数を使うことができます。

変数 rs へのレコードセットの代入も同じことです。

フォームを開いたときの初期値として、フォームのLoadイベントで、変数 rs にレコードセットを代入して下さい。

ユーザーが任意の顧客コードを指定できるような作り方をされているのなら、
Loadイベント以外にも、レコードセットを代入する必要があります。
たとえばですが・・データ表示のボタンを別に作り、そのボタンのクリック・イベントに、とか。
   ◇
なんか、だらだらと長くなってしまいましたが、
要は・・
★オブジェクト変数の宣言は、フォームの宣言セクションで1回だけ行う。
(プロシージャーごとに宣言しない)
★オブジェクト変数への代入は、フォームのLoadイベントで行う。
 ・・ということです。

あと・・
No.2に書いたように、
If rs.EOF (= True) Then("= True" は省略可)
のあとには、必ず rs.MoveLast を入れて、強制的に最終レコードに移動させないとエラーになりますよ。

それと・・
No.1の補足に書いておられるようなことは、はじめから最初の質問に書いておくべきだったと思いますが・・。

この回答への補足

何度も何度も補足をして申し訳ありません。

No.3さんの仰る通り、もう少し整理してから書き込むように心がけます。

皆様の回答・アドバイス、大変参考になりました。
本当にありがとうございます。

教えて頂いたコードで、ちゃんと動作するようになりました。

そして最初に述べたのですが、本当に補足説明が多くて申し訳ありません。あともう1つだけこの質問関連でお聞きしたいのですが、

DoCmd.GoToRecord , , acNext

このコードだとテーブルの中に入っているデータ全てを次へ次へと移動していっていると思うのですが、例えば「顧客コード」を指定して、その顧客コードのレコードだけを次へ次へと移動させる場合、どのように記述したら良いのでしょうか?

質問が重ね重ね多くなり申し訳ありませんが、宜しくお願い致します。

補足日時:2004/12/20 13:11
    • good
    • 0

ボタンに「cmdNext」名前の場合、



Private Sub cmdNext_Click()
On Error GoTo Err_cmdNext_Click

DoCmd.GoToRecord , , acNext

Exit_cmdNext_Click:
Exit Sub

Err_cmdNext_Click:
MsgBox Err.Description
Resume Exit_cmdNext_Click

End Sub

以上のようにERR処理を含んだコードです。参考にしてください。
    • good
    • 0

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