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

解決済みの質問

access 自作の移動ボタンのエラーについて。

よろしくお願いします。
仕様環境
WinXP アクセス2002

アクセスを使ってとある管理表を作っているのですが、
一番下にある「レコードの移動ボタン」が小さいので、
わかりやすくするため、いろいろ調べ自分で
コマンドボタンとテキストボックスで作りました。
機能は問題なくしているのですが、
レコードを先に進めていき、最後のレコードから
更に次へ進めると、エラーが発生します。

■ エラー名
コマンドまたはアクション'次のレコードへ'は無効です。

次のレコードがないため、エラーが発生するのはわかるのですが、
これをコマンドボタンを”グレーアウト”にしたり、
または「次のレコードはありません」というメッセージが
出るようにしたいのですが、何か方法はあるでしょうか?

同じくレコードを前に進めていっても同じく、
もう進めないところまでいくと、エラーが発生します。

■ エラー名
コマンドまたはアクション'前のレコードへ'は無効です。

アクセス既存のマクロで解決を図りたいのですが模索中です。
よろしくお願いします。

※画像も添付しておきます。

投稿日時 - 2009-02-16 23:00:14

QNo.4723927

困ってます

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

> コマンドボタンを”グレーアウト”にしたり

レコードの移動毎に、そのフォームでの現在のレコード番号を確認し、
  先頭レコード(=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の
   結果と実際の表示数が異なるため、実際の表示数を超えた場合には
   現在と同様のエラーが発生してしまいます。
   (この辺りは、マクロのみだと、対処できなくはないですが結構厄介です)

投稿日時 - 2009-02-17 18:03:47

お礼

返信が遅くなって申し訳ありません。
回答ありがとうございます。
いろいろ試してみます。

投稿日時 - 2009-02-23 14:52:42

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

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

回答(3)

ANo.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数] の時に背景色を替えるとか工夫が必要かも?

投稿日時 - 2009-02-17 18:42:36

お礼

返信が遅くなって申し訳ありません。
回答ありがとうございます。
いろいろ試してみます。

投稿日時 - 2009-02-23 14:51:50

ANo.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

投稿日時 - 2009-02-17 11:57:49

お礼

返信が遅くなって申し訳ありません。
回答ありがとうございます。
いろいろ試してみます。

投稿日時 - 2009-02-23 14:52:15

あなたにオススメの質問