• ベストアンサー

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% (254/607)
回答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

  • レコードの保存について

    Access2002,WinXP Proで受注管理システムを開発しているのですが メインフォームにて、「請求書発行ボタン」なるものを作成し ボタンをクリックすると、請求書発行ウィザードが立ち上がるように しています。 (ウィザードといっても、請求書に記載する為の備考入力欄と プレビューボタンがあるダイアログなだけですが) ここで、たとえば備考入力欄に何か入力しプレビューボタンを クリックすると請求書レポートが開き、備考欄には 今しがた入力した備考がちゃんと反映されている。という事を 実現させたいのですが、うまくいきません。 どうやら備考入力欄に入力した備考内容が レコードとして保存されていないという事が原因と思うのですが・・・ ちなみに、プレビューボタンのクリック時のイベントプロシージャには ---- [Forms]![F_売上情報編集]![請求書備考].Value = Me![請求書備考].Value DoCmd.RunCommand acCmdSaveRecord DoCmd.OpenReport "R_請求書(プレビュー)", acViewPreview, , "受注ID = " & [Forms]![F_売上情報編集]![受注ID] & "" DoCmd.Close acForm, "F_請求書発行ウィザード" ---- のように記述していますが、DoCmd.RunCommand acCmdSaveRecordは カレントフォーム?上のレコードしか保存しないのでしょうか。 だとしたら、他フォームのレコードの保存はどのようにして 行うのでしょうか。

  • アクセスサブフォームで保存するとエラーとなる

    以前教えてもらった下記のサブフォームでのデータ保存VBAですが、このままだと添付ファイルのような画面が出てきてメインフォームでの保存が自動で出来ず、いろいろ試してみましたがうまくいきません。 何卒、ご指導宜しくお願い致します。 Private Sub 保存_Click() MsgBox "データを確定保存します" DoCmd.RunCommand acCmdSaveRecord If Not SysCmd(acSysCmdGetObjectState, acForm, "メインフォーム名") = 0 Then 'MsgBox "メインフォームの画面を更新します" With Forms!メインフォーム名 .Refresh End With End If End Sub

  • Access2002 フォーム上にないフィールドに入力するには

    フォーム上にあるボタンを押すと、あるフィールドに数値を入力する VBAを作りましたが、フィールドには入力されませんでした。 色々やってみたらフォーム上にフィールドが無いと入力されないようでした。 これはAccess2002の仕様なのでしょうか。 それともそのための表記があるのでしょうか。 例) 顧客ID = 1 単純にこれだけのことがしたいのですがうまくいきません。 よろしくお願いします。

  • フォームのレコードソースにストアドをしてした場合

    フォームのレコードソースにパラメータ付きのストアドを指定した場合は、 データを追加する場合にはVBAで下記の命令では追加できないのでしょうか? 状況は「acNewRec」は正常に動作しているようです、「acCmdSaveRecord」で 「データの競合」のメッセージが表示されすすまないので、 終了させようとすると、「プロシージャまたは関数'○○○'には パラメータ'○○'が必要ですが、指定されませんでした。」となります. DoCmd.GoToRecord , , acNewRec データの入力処理 DoCmd.RunCommand acCmdSaveRecord 駄目な場合やはり追加用のストアドを作成するのでしょうか?

  • アクセスVBAにて登録ボタン押下時の動作記述

    顧客登録フォームで登録ボタンの押下時、更新前処理にて「はい/いいえ」の選択をしています。 ×ボタンでも更新前処理が実行されるため処理の記述に困っています。 下記が希望動作です。 -----登録ボタン はい  → レコードを保存する  顧客登録フォームを閉じる 顧客照会フォームを開く    いいえ → レコードを保存しない 顧客登録フォームに留まる -----×ボタン はい  → レコードを保存する  顧客登録フォームを閉じる いいえ → レコードを保存しない 顧客登録フォームを閉じる -----現在のソース Private Sub Form_BeforeUpdate(Cancel As Integer)   Ret = MsgBox("登録しますか", vbYesNo)   Select Case Ret     Case vbNo     Me.Undo   End Select End Sub Private Sub 登録_Click()   DoCmd.RunCommand acCmdSaveRecord End Sub どのように記述したらよいのでしょうか。 以上宜しくお願いします。

  • Accessでレコードの保存をVBAで

    Access2000です。 入力するとすぐに集計をしたいのですが、 フォームフッターの集計用テキストボックス (=sum([フィールド名])が設定されている) は、レコードを保存しないと、再計算されないようです。 そこで、入力して、フォーカスを喪失するときに DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70 を実行して、レコードを保存しているのですが、 デバッグのとき、エラーが発生しますし、 (デバッグ中は、VBAエディタが表示されるため) また、メニューの実行のコマンドは物足りないので、 指定したフォームのレコードを保存する方法は、 他にないでしょうか? よろしくお願いいたします。

  • ACCESSで「16389予約済みエラー」と出ます

    AccessとVBA、SQLServerの組み合わせでアプリケーションを作っています。 VBAの中で DoCmd.RunCommand acCmdSaveRecord を実行する行でエラーが発生します。 MsgBoxでErr.NumberとErr.Descriptionを確認すると、 16389 予約済みエラーと表示されます。 この番号とメッセージで調べてはいるのですが、英語のページしかヒットせず、 翻訳してもよくわからず、苦戦しています。 何か情報をお持ちの方は教えてください。

  • Access2007 サブフォームの新規レコードをすぐにフォームに表示させる方法

    サブフォーム上で適当なレコード(IDと商品名)を選択して、そのレコードにある入力ボタンを押すと、フォームのコンボボックス上にその商品名が出るようなフォームがあります。 すでに入力済みのIDと商品名は表示されます。 ところが、サブフォーム上でIDと商品名を新規入力して入力ボタンを押すと、フォームのコンボボックスは空白となり、商品データが表示されません。 しかし、一旦フォームを閉じて開くと、データは表示されています。 IDと商品名を新規入力して、そのままフォームのコンボボックスに反映させたいと思います。 入力ボタンはこのようにやってみました。 Private Sub 入力_Click() DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70 Forms!フォーム!ID = Me.ID End Sub または、 Private Sub 入力_Click() DoCmd.RunCommand acCmdSaveRecord Forms!フォーム!ID = Me.ID End Sub ご教授いただければ幸いです。よろしくお願いいたします。

  • Access すべてのフォームを開く

    おしえてくださいm__m AccessにてWindowを最小化した後に現在開いているフォームを開くVBAを 作成しようとしていますがうまくいきません。 現在はWindowを最小化した後一つのフォームを開くVBAは下記の通り作成しました DoCmd.RunCommand acCmdAppMinimize DoCmd.OpenForm "メインフォーム", acNormal しかしながら現在開いているすべてのフォームをAccess Windowを最小化した後に 開くVBAはどのように記載すればいいでしょうか 皆さまのお知恵をかしてくださいm__m

  • アクセス2007 VBA 並べ替え

    テーブル1のフィールド1にデータを入れ それを元に帳票フォームを作成しました。 フォームヘッダー部分に 昇順ボタンと降順ボタンを作り、 ボタンを押すごとに並び替えを行いたいのですが どのようなVBAコードを書けばいいのかわかりません。 命令分としては、 「フォームに表示されるテーブル1のフィールド1データの 昇順に並べ替える」です。 SQLを使う方法ではなく、 DocmdかacCmdを使う方法が希望です。 アクセスのヘルプの ----------------------------------------- Access 開発者用リファレンス Form."OrderBy/並べ替え" プロパティ ----------------------------------------- を見ると、 ----------------------------------------- 構文 式.OrderBy 式 Form オブジェクトを表す変数です。 ----------------------------------------- と書いてありますがこの式がわからないのでご教授よろしくお願いします。

専門家に質問してみよう