- 締切済み
AccessVBA 「次へ」ボタン
私の環境はOS:Xp ACCESS2000です。 宜しくお願いします。 大変抽象的な質問の仕方で申し訳無いのですが、 テーブルにセットされているレコードを検索したいのですが、「次へ」というボタンを作ってそれを押すと今表示されている内容の次のレコードの内容が表示されるという仕組みのボタンを作りたいのです。 それをAccessVBAで記述したいのですが、どのように記述したら良いか解りません。 もし知っていらっしゃる方がおられましたら、宜しくお願い致します。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- yu06
- ベストアンサー率30% (4/13)
ボタンに「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処理を含んだコードです。参考にしてください。
- AloneAgain
- ベストアンサー率71% (285/400)
おはようございます、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の補足に書いておられるようなことは、はじめから最初の質問に書いておくべきだったと思いますが・・。
- AloneAgain
- ベストアンサー率71% (285/400)
こんばんは。 レコードセットのオブジェクト変数を、rsとして、 「次へ」ボタンのクリックイベントに、 rs.MoveNext If rs.EOF Then rs.MoveLast End If と、記述してください。 IF~End Ifを入れないと、 最終レコードの状態で「次へ」ボタンをクリックするとエラーになってしまいます。
- bin-chan
- ベストアンサー率33% (1403/4213)
レコードセットを作成した上で、検索・表示されていると思います。 レコードセットを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件目のレコードしか表示されません。 こういった場合、どうしたら良いのでしょうか? 宜しくお願いします。
補足
何度も何度も補足をして申し訳ありません。 No.3さんの仰る通り、もう少し整理してから書き込むように心がけます。 皆様の回答・アドバイス、大変参考になりました。 本当にありがとうございます。 教えて頂いたコードで、ちゃんと動作するようになりました。 そして最初に述べたのですが、本当に補足説明が多くて申し訳ありません。あともう1つだけこの質問関連でお聞きしたいのですが、 DoCmd.GoToRecord , , acNext このコードだとテーブルの中に入っているデータ全てを次へ次へと移動していっていると思うのですが、例えば「顧客コード」を指定して、その顧客コードのレコードだけを次へ次へと移動させる場合、どのように記述したら良いのでしょうか? 質問が重ね重ね多くなり申し訳ありませんが、宜しくお願い致します。