非連結フォームでのデータ追加ではなく、直接テーブルのデータを操作するフォームでの作業で、移動ボタンを設置すると
ココがポイント
最終レコードから更に移動ボタンをクリックするとレコードが追加
になってしまいます。
今回は、新規ボタンを押したときに新規レコードが追加になり、移動ボタンでは新規レコード追加にならない方法をやってみました。
普通にレコード移動ボタンを設置
普通にテーブルをフォームにして、レコード移動ボタンを設置すると、最終レコードから更にボタンを押すと、レコード追加になります。
通常ならそれで問題ないのかもしれませんが、今回は、その機能を使いたくない事情が起きたのです。
その事情はさておき、移動ボタンでレコード追加にならない方法を探しました。
フォームのプロパティから、「追加の許可」を「いいえ」にするだけで、最終レコード移動でのレコード追加ができなくなりました。
新規レコード追加ボタンを押した時に問題
フォームのプロパティで、新規レコード追加を禁止にしているので、VBAにて、新規レコードボタンを設置しましたが、エラーになり追加ができません。
つまり、新規ボタンを押した時だけに、レコード追加させたかったのです。
AllowAdditions = True DoCmd.GoToRecord , , acNewRec 'AllowAdditions = False '再ロックはここでかけてはダメ
新規ボタンをクリックした時に、VBAで、
AllowAdditions = True
の許可コードを入れるだけでフォームのプロパティでロックかけたレコード追加は外せました。
しかし、追加した後に、再ロックをかけると、フォームに未入力チェックをかけたのが仇となり、何度もメッセージをキャンセルしないと作業ができなくなりました。
レコード追加のロックはレコード移動時
フォームに設置したレコード移動はAccessのフォームデザインから設置したボタンなので、マクロコードになっているようです。VBAにするのもめんどくさかったので、マクロコードにレコード追加のロックをかけることで問題は解決しました。
入力チェック機能をレコード追加時に変更
必須項目の未入力を回避するために、レコード移動時に、未入力チェックを仕掛けておきました。
フォームのレコード追加をロックしたことで、色々と不都合が出ましたが、レコード追加時に未入力チェックをすることで解決しました。
Private Sub new_btn_Click() Dim moji As String If up7 = "" Or IsNull(up7) Then MsgBox "電話番号が未入力です。" Exit Sub End If If up6 = "" Or IsNull(up6) Then MsgBox "氏名が未入力です。" Exit Sub End If If up16 = "" Or IsNull(up16) Then MsgBox "配送先名が未入力です。" Exit Sub End If If up24 = "" Or IsNull(up24) Then MsgBox "配送先電話番号が未入力です。" Exit Sub End If moji = DMax("up1", "job_another_order") AllowAdditions = True DoCmd.GoToRecord , , acNewRec up1 = "aod-" & Val(Right(moji, Len(moji) - InStr(moji, "-"))) + 1 up3 = date End Sub
いつもは、非連結フォームで入力していたので、直接テーブルをフォームにした場合の苦労はありませんでしたが、効率を考えるとテーブルをフォームにした方がよい場合があることがあります。
そんな時に、最低限の未入力チェックや制限をかける方法を知っていると便利ですね。
レコードが無い時にエラー回避
レコードが無い時にエラーがでるか、のっぺらぼうになることが分かりました。
フォームを開く時に、レコードを調べてない場合にはレコード追加してから開くようにして回避しました。
Private Sub Form_Load() If DCount("*", "job_another_order") = 0 Then AllowAdditions = True DoCmd.GoToRecord , , acNewRec End If End Sub