• ベストアンサー

Access2010、値を入力したら自動保存の方法

Access2010でフォームよりフィールドに値を入力し、保存ボタンを押した時の動作を 自動でできる方法を探しています。つまり値を入力したら即、保存になる動作です。 vbaでbeforeupdateを使えば実現できるのではと思っていますが、上手く行きません。 beforeupdeteにDocmd.RunCommand acCmdSaveRecordを絡ませれようとしてもエラーで 動きませんでした。 上記のことが実現できるvbaの構文を教えて下さい。 よろしくお願いします。

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

  • ベストアンサー
回答No.6

> クエリの後に > フォームを指定し、切り替わらない様にと思ったのですが、このようにエラーが出てしまいます。 勝手に想像でコードを記述してもうまくは動かない場合がほとんどです。 VBAエディタ上で SelectObject をクリックしてF1キーを押すとヘルプが表示されます。 そこに解説と使用例がでていますので、まずはそれを調べましょう。 それを繰り返すうちにだんだんスキルが付いてきて、自分でコードが書けるようになります。 Function SaveRequery()   DoCmd.RunCommand acCmdSaveRecord   Docmd.SelectObject acQuery, "管理一覧表表示"   Docmd.Requery   Docmd.SelectObject acForm, "管理表" End Function > また、クエリーを開いてない場合、開いていないというエラーが出てしまいます。 クエリを開いていない場合は、どうしたいのでしょうか。 何もしないのか、クエリを開いて更新するのか。 何をしないとすると、下記のようにエラー処理を追加するといいでしょう。 Function SaveRequery() On Error Resume Next 'エラーがでても無視して次に進む   DoCmd.RunCommand acCmdSaveRecord   Docmd.SelectObject acQuery, "管理一覧表表示"   If Err <> 0 Then Exit Function '前のコードでエラーがでたら処理を抜ける   Docmd.Requery   Docmd.SelectObject acForm, "管理表" End Function これは簡易的なエラー処理です。 短い処理ですのでこれでも問題ないですが、長い処理の場合は、きちんとしたエラー処理にすべきですので、詳細はヘルプなどで調べておいてください。

sunrise7777
質問者

お礼

ついにやりたかったことが完成しました。 コードの構築の勉強法などのアドバイスも頂き、感謝しています。 ありがとうございました。

その他の回答 (5)

回答No.5

> 例えば、Form内にテキストボックスが5個あるのであれば、5個分下記構文を作る必要があるかどうか。 テキストボックスのどれか一つでも入力したら即、反映させたいならそうなります。 ただし、下記のようにすれば一つにまとめることも可能です。 フォームのモジュールに下記の関数を作成。 Function SaveRequery()   DoCmd.RunCommand acCmdSaveRecord   Docmd.SelectObject acQuery, "クエリ名"   Docmd.Requery End Function 5つのテキストボックスをすべて選択した状態で、「更新後処理」欄に下記のように設定。 =SaveRequery()

sunrise7777
質問者

補足

何度も回答ありがとうございます。 教えて頂いた構文だとクエリーが最前面に出てしまうので、下記の通りクエリの後に フォームを指定し、切り替わらない様にと思ったのですが、このようにエラーが出てしまいます。何か間違っているのでしょうか? また、クエリーを開いてない場合、開いていないというエラーが出てしまいます。 現在、回避策を調べています。 イベント プロパティに指定した式 更新後処理 でエラーが発生したました: 指定した式は、いずれかの引数とデータ型が対応していません。 *マクロ名、ユーザー定義関数名、[イベント プロシージャ]以外の式が指定されています。 *関数、イベント、マクロの評価でエラーが発生しました。 Function SaveRequery() DoCmd.RunCommand acCmdSaveRecord DoCmd.SelectObject acQuery, "管理一覧表表示" , "管理表" DoCmd.Requery End Function

回答No.4

> クエリは直接というより、フォームからクエリ起動のボタンを設置し、クリックして開くようにしています。 そのクエリを開いた状態で、フォームから編集、レコード保存してもすぐに、クエリに反映されないと言うことでしたら、 下記のコードを実行すれば反映します。 Docmd.SelectObject acQuery, "クエリ名" Docmd.Requery

sunrise7777
質問者

お礼

ようやく、やりたいことができました。ありがとうございました。 ちなみにですが、Form内にあるテキストボックスがどれか一つでも変更されると下記構文を実行するようにしたいのですが、やはり、テキストボックスがあるだけ、下記構文を追加してやるしかないのでしょうか? 例えば、Form内にテキストボックスが5個あるのであれば、5個分下記構文を作る必要があるかどうか。 Docmd.SelectObject acQuery, "クエリ名" Docmd.Requery

回答No.3

> 下記のようにしてみたのですが、エラーが出てしまいます。 > DoCmd.RunCommand acCmdSaveRecordの使い方が間違っているのでしょうか? > > Private Sub Form_AfterUpdate(Cancel As Integer) >   DoCmd.RunCommand acCmdSaveRecord > End Sub フォームの更新後処理に割り当ててますが、更新後処理と言うことはその時点ですでにレコード保存されていますので、もう、レコード保存できない(する必要がない)のでエラーになります。 テキストボックスに入力したときにすぐ反映させたいということが希望でしたら、「テキストボックス」の更新後処理に設定してください。 Private Sub テキスト1_AfterUpdate(Cancel As Integer)   DoCmd.RunCommand acCmdSaveRecord End Sub > クエリーで一覧を表示している時に、フォーム側で入力した内容を保存ボタンなどで保存しないとクエリーの一覧が更新されないので、今回の質問をしました。 フォーム側でレコード保存しても、既に開いているクエリには自動では反映されません。 クエリに対して再クエリをする必要があります。 ところで、クエリは直接開いているのですか。それともフォームのレコードソースとしてクエリを設定して、フォームを開いているのですか。

sunrise7777
質問者

補足

クエリは直接というより、フォームからクエリ起動のボタンを設置し、クリックして開くようにしています。この場合は、フォームのレコードソースとしてのクエリということになるんでしょうか。

  • chayamati
  • ベストアンサー率41% (260/624)
回答No.2

ACCESSではレコード単位で保存されます。 入力途中でも別のレコードに移動すると自動的に保存されます。 従ってコーディングの必要ははありません

sunrise7777
質問者

補足

クエリーで一覧を表示している時に、フォーム側で入力した内容を保存ボタンなどで保存しないとクエリーの一覧が更新されないので、今回の質問をしました。

回答No.1

フォームが連結フォーム(レコードソース、コントロールソースの設定されているフォーム)なら、テキストボックスの更新後処理(AfterUpdate)で、 Docmd.RunCommand acCmdSaveRecord でできるはずです。 更新前処理(BeforeUpdate)ではエラーになります。

sunrise7777
質問者

補足

下記のようにしてみたのですが、エラーが出てしまいます。 DoCmd.RunCommand acCmdSaveRecordの使い方が間違っているのでしょうか? Private Sub Form_AfterUpdate(Cancel As Integer)   DoCmd.RunCommand acCmdSaveRecord End Sub

関連するQ&A