
よろしくお願いします。
仕様環境
WinXP アクセス2002
アクセスを使ってとある管理表を作っているのですが、
一番下にある「レコードの移動ボタン」が小さいので、
わかりやすくするため、いろいろ調べ自分で
コマンドボタンとテキストボックスで作りました。
機能は問題なくしているのですが、
レコードを先に進めていき、最後のレコードから
更に次へ進めると、エラーが発生します。
■ エラー名
コマンドまたはアクション'次のレコードへ'は無効です。
次のレコードがないため、エラーが発生するのはわかるのですが、
これをコマンドボタンを”グレーアウト”にしたり、
または「次のレコードはありません」というメッセージが
出るようにしたいのですが、何か方法はあるでしょうか?
同じくレコードを前に進めていっても同じく、
もう進めないところまでいくと、エラーが発生します。
■ エラー名
コマンドまたはアクション'前のレコードへ'は無効です。
アクセス既存のマクロで解決を図りたいのですが模索中です。
よろしくお願いします。
※画像も添付しておきます。

No.2ベストアンサー
- 回答日時:
> コマンドボタンを”グレーアウト”にしたり
レコードの移動毎に、そのフォームでの現在のレコード番号を確認し、
先頭レコード(=1)なら前への移動を不可(>1なら可)に、
末尾レコード(=DCount等で確認)なら次への移動を不可(未満なら可)に、
それぞれ切り替えてやります。
(新規レコードも表示させている場合は、現在レコードが新規かどうかで切替)
切替は、フォームの「レコード移動時」イベント(フォームのプロパティシートで、
『イベント』タブの一番上)にマクロを設定して行うのがよいと思います。
(ボタンの「クリック時」イベント等で対応すると、タブ移動やPageDownキー等で
移動できてしまった場合にエラーが発生する危険性があるため)
マクロの内容としては以下の通り、「値の代入」を2回行うことになります:
(フォーム名が「フォーム1」、ボタン名がそれぞれ「前へ」「次へ」の場合)
a)新規レコードも表示対象している場合:
アクション : 値の代入
・アイテム : [Forms]![フォーム1]![前へ].[Enabled]
・式 : [Forms![フォーム1].[CurrentRecord]>1
アクション : 値の代入
・アイテム : [Forms]![フォーム1]![次へ].[Enabled]
・式 : [Forms]![フォーム1].[NewRecord]=0
※「Enabled」で使用不可を切り替えられます(「-1」なら可、「0」なら不可)。
(ボタンを使用不可にすると、グレー表示になります)
※「CurrentRecord」で、現在のレコード番号が確認できます。
※「NewRecord」は、新規レコードのときに「-1」を、それ以外で「0」になります。
b)新規レコードを表示させていない場合:
アクション : 値の代入
・アイテム : [Forms]![フォーム1]![前へ].[Enabled]
・式 : [Forms]![フォーム1].[CurrentRecord]>1
アクション : 値の代入
・アイテム : [Forms]![フォーム1]![次へ].[Enabled]
・式 : [Forms]![フォーム1].[CurrentRecord]<DCount("*",[Forms]![フォーム1].[RecordSource])
※「DCount(~)」で、フォーム1のレコード総数を確認しています。
なお、フォーム展開後にレコード総数が変わらない(=新規追加なし)なら、
フォーム上に非表示テキストボックスを作成し、フォームを開くときにそこに
レコード総数を記録しておけば、レコード移動のたびにDCountを再計算
する必要がなくなる分、動作を早くできます。
(レコードの追加/削除がある場合も、追加/削除時にだけ再計算して
やれば適用可)
※フォームで、フィルターにより絞り込みを掛けている場合は、DCountの
結果と実際の表示数が異なるため、実際の表示数を超えた場合には
現在と同様のエラーが発生してしまいます。
(この辺りは、マクロのみだと、対処できなくはないですが結構厄介です)
No.3
- 回答日時:
マクロではないのですが、Access2000 で動いていたものになります。
状況によって、ボタンをEnable設定/制御する一例となります。
(連結されたものを表示している場合)
操作する以下のものは非連結
txtdummy:テキストボックス(フォーカス移動用のダミー)
サイズは0.05四方の小さいもの
(他に代用できるものがあれば不要)
txt位置:テキストボックス(レコード位置表示用:入力もあり)
書式:数値
txt数:テキストボックス(レコード件数表示用)
書式:数値 編集ロック:はい
btn前 / btn次:コマンドボタン(1レコード分の前後移動用)
btn最初 / btn最後:コマンドボタン(最初/最後レコードへの移動用)
Private Sub btnEnableSet(前 As Boolean, 次 As Boolean, _
最初 As Boolean, 最後 As Boolean)
Me.txtdummy.SetFocus
Me.btn前.Enabled = 前
Me.btn次.Enabled = 次
Me.btn最初.Enabled = 最初
Me.btn最後.Enabled = 最後
End Sub
Private Sub Form_Current()
Me.txt位置 = Me.CurrentRecord
Me.txt数 = Me.Recordset.RecordCount
If (Me.NewRecord = True) Then
Call btnEnableSet(True, False, True, False)
Else
If (Me.txt位置 = 1) Then
Call btnEnableSet(False, True, False, True)
ElseIf (Me.txt位置 = Me.txt数) Then
Call btnEnableSet(True, True, True, False)
Else
Call btnEnableSet(True, True, True, True)
End If
End If
End Sub
Private Sub txt位置_BeforeUpdate(Cancel As Integer)
If ((Me.txt位置 < 1) Or (Me.txt位置 > Me.txt数 + 1)) Then
Cancel = True
End If
End Sub
Private Sub txt位置_AfterUpdate()
If (Me.txt位置 > Me.txt数) Then
DoCmd.GoToRecord , , acNewRec
Else
DoCmd.GoToRecord , , acGoTo, Me.txt位置
End If
End Sub
Private Sub btn前_Click()
DoCmd.GoToRecord , , acPrevious
End Sub
Private Sub btn次_Click()
If (Me.txt位置 = Me.txt数) Then
DoCmd.GoToRecord , , acNewRec
Else
DoCmd.GoToRecord , , acNext
End If
End Sub
Private Sub btn最初_Click()
DoCmd.GoToRecord , , acFirst
End Sub
Private Sub btn最後_Click()
DoCmd.GoToRecord , , acLast
End Sub
※この方法では、新規レコードの時
txt位置 = txt数 + 1
の表示になるので、txt位置の条件付き書式で
[txt位置] > [txt数] の時に背景色を替えるとか工夫が必要かも?
No.1
- 回答日時:
> アクセス既存のマクロで解決を図りたいのですが模索中です。
ウィザードが生成するコードにちょっと手を入れて。
Private Sub 次へ_Click()
On Error GoTo Err_次へ_Click
DoCmd.GoToRecord , , acNext
Exit_次へ_Click:
Exit Sub
Err_次へ_Click:
If Err.Number = 2105 Then
MsgBox "次のレコードはありません"
Else
MsgBox Err.Description
End If
Resume Exit_次へ_Click
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Accessフォームで全レコードを指定のExcelのセルへ転送し印刷する方法について 2 2022/09/08 18:23
- PHP クエリObjectをforeachで回す時に、次のレコードへ移動せずに次のレコードを取得したい 2 2022/07/28 15:29
- Access(アクセス) docmd.gotorecordを起動するには 5 2022/06/17 15:20
- 電子マネー・電子決済 QUICPayの登録ができない。 4 2023/06/10 10:57
- Access(アクセス) Access IF文でテーブルに存在しない場合の処理について 2 2022/10/10 18:09
- その他(データベース) Accessフォームからパラメーターで表示したレコードを指定のExcelのセルへ転送する方法について 2 2022/08/22 18:04
- Visual Basic(VBA) Excel VBA 複数ブックシートごとにデータを統合する方法について 4 2022/05/20 14:23
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
- Access(アクセス) DoCmd.SearchForRecord が動かない時の解決方法 3 2022/07/22 15:31
- MySQL データベースの複製の仕方(mysql) 2 2023/05/30 18:24
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ACCESS2003 タブコントロール...
-
Access2003 入力フォームの表...
-
アクセス2003で入力フォー...
-
Access2002でクエリで抽出され...
-
フィルタ後のフォームの件数の...
-
レコード削除時に(サブ)フォー...
-
ACCESSでフォームを使って、テ...
-
アクセスでフォームビューがみ...
-
アクセスでフォームの作り方、...
-
ACCESSフォームのリストボック...
-
Access フォームで入力した番...
-
レコードを保存するコード ア...
-
Access フォーム入力で、一度に...
-
Accessで上の行を自動でコピー...
-
アクセス フォームでの行追加
-
ACCESSのクエリで抽出したデー...
-
アクセスのフォームが見れない...
-
Access2003で現在時刻の自動取...
-
ユニオンクエリについて質問です
-
ACCESS / 抽出条件によってレポ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
レコードを保存するコード ア...
-
新規レコード行を非表示にしたい
-
アクセスでフォームビューがみ...
-
レコード削除時に(サブ)フォー...
-
Accessで上の行を自動でコピー...
-
AccessVBA RecordSourceのリセ...
-
アクセスのフォームで立ち上げ...
-
ACCESSフォームのリストボック...
-
アクセスの自動保存解除はでき...
-
アクセス:フォーム入力で、最...
-
Accessで一件の新規レコードの...
-
フィルタ後のフォームの件数の...
-
アクセス データの競合を非表...
-
Access:フォームプロパティ「...
-
Access2010、値を入力したら自...
-
レコードをダブルクリックする...
-
Accessでのデータ消滅に...
-
ACCESSでフォームを使って、テ...
-
Accessでフォーム上に 直前の...
-
アクセスでの警告について教え...
おすすめ情報