こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

GoToRecord で次のレコードを表示したい

<環境>access2007

フォームに連結のコントロールと「次へ」ボタンを配置しています。
「次へ」ボタンは次のレコードを表示する為のボタンです。

ボタンウィザードを使用したところ、以下のような動作をしました。
レコード件数は3件あると過程します。
(1)次へボタンを押下するごとに、1/3、2/3、3/3まで移動。
(2)3/3を表示している状態で、次へボタンを押下すると
 新規のレコードへ移動 4/4が表示される。
(3)(2)の状態で次へボタンを押下すると、「次のレコードが存在しません」

私がやりたいことは、3/3の状態で次へボタンを押下しても、新規のレコードへ移動せず、
「次のレコードが存在しません」とメッセージを出すことです。
そこで以下のようにコーディングしました。
しかし、いまいちって感じなのでいい案がありましたらご教授お願いします。

Private Sub BTN_次へ_Click()

On Error GoTo Err_Click

DoCmd.Echo False
DoCmd.GoToRecord , , acNext, 2
DoCmd.GoToRecord , , acPrevious
DoCmd.Echo True
Exit Sub

Err_Click:
MsgBox Err.Description
DoCmd.Echo True

End Sub

投稿日時 - 2011-08-17 23:07:11

QNo.6949599

すぐに回答ほしいです

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

こんな感じでも良いのでは?
Acc2002でも2010でも動くので2007でも大丈夫かな?

Private Sub 前レコード_Click()
  If Me.CurrentRecord = 1 Then
    MsgBox "先頭です"
  Else
    DoCmd.GoToRecord acDataForm, "フォーム名", acPrevious
  End If
End Sub


Private Sub 次レコード_Click()
If Me.CurrentRecord = Me.RecordsetClone.RecordCount Then
MsgBox "最後です"
Else
DoCmd.GoToRecord acDataForm, "フォーム名", acNext
End If
End Sub

piroin654 さんのBookMark プロパティは覚えておくと
フォームのリクエリなどでレコードが先頭に行ってしまう場合などに
超ベンリです。調べてみてください。

投稿日時 - 2011-08-18 10:42:13

お礼

簡潔でわかりやすいです。
私のコーディングがはずかしいです。
ありがとうございました。

投稿日時 - 2011-08-18 14:01:31

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

No1です。最初の説明が変だったので、
説明を訂正します。

フォームのRecordsetCloneのBookMarkと
フォームのBookMarkを使ってレコードセットが
EOFあるいはBOFに達したか検知して達したならば
それ以上は進まない、という方法をとります。
フォームのレコードの移動は、
フォームのRecordsetCloneのBookMarkと同期
させることにより、フォーム上で移動を
可視化しています。

投稿日時 - 2011-08-18 02:15:47

お礼

フォームのRecordsetCloneのBookMarkというのがあるんですね。
しっかり勉強させていただきます。
ありがとうございました。

投稿日時 - 2011-08-18 14:01:16

ANo.1

この場合はレコードセットのBookMarkと
フォームのRecordsetCloneのBookMarkを
使ってレコードセットがEOFあるいはBOFに
達したか検知して達したならばそれ以上は
進まない、という方法をとります。



DAOを使っているので、コード表のツール、参照設定から
DAOにチェックをいれてください。
Micrososft DAO 3.6 Object Library
のようなものです。チェックをいれたら
↑ボタンで上げられるところまで上げて
ください。


最初の、
Dim bk As Variant
は、表示のようにフォームモジュールの
最初に設定してください。

ついでに前に戻るのも設定しています。



Option Compare Database
Option Explicit
Dim bk As Variant


Private Sub BTN_次へ_Click()
Dim rs As Object

Set rs = Me.RecordsetClone

If rs.RecordCount > 0 Then
rs.Move 1, bk
If Not rs.EOF Then
bk = rs.Bookmark
Me.Bookmark = bk
Else
MsgBox "これより先にレコードはありません"
End If
Else
MsgBox "レコードがありません"
End If
rs.Close: Set rs = Nothing
End Sub


Private Sub BTN_前へ_Click()
Dim rs As Object

Set rs = Me.RecordsetClone

If rs.RecordCount > 0 Then
rs.Move -1, bk
If Not rs.BOF Then
bk = rs.Bookmark
Me.Bookmark = bk
Else
rs.Move 1
MsgBox "これより前にレコードはありません"
bk = rs.Bookmark
End If
Else
MsgBox "レコードがありません"
End If
rs.Close: Set rs = Nothing
End Sub

投稿日時 - 2011-08-18 01:57:08

あなたにオススメの質問