アプリ版:「スタンプのみでお礼する」機能のリリースについて

Access2010でフォームよりフィールドに値を入力し、保存ボタンを押した時の動作を
自動でできる方法を探しています。つまり値を入力したら即、保存になる動作です。

vbaでbeforeupdateを使えば実現できるのではと思っていますが、上手く行きません。

beforeupdeteにDocmd.RunCommand acCmdSaveRecordを絡ませれようとしてもエラーで
動きませんでした。


上記のことが実現できるvbaの構文を教えて下さい。


よろしくお願いします。

A 回答 (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

これは簡易的なエラー処理です。
短い処理ですのでこれでも問題ないですが、長い処理の場合は、きちんとしたエラー処理にすべきですので、詳細はヘルプなどで調べておいてください。
    • good
    • 0
この回答へのお礼

ついにやりたかったことが完成しました。

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

お礼日時:2012/11/13 10:36

> 例えば、Form内にテキストボックスが5個あるのであれば、5個分下記構文を作る必要があるかどうか。



テキストボックスのどれか一つでも入力したら即、反映させたいならそうなります。

ただし、下記のようにすれば一つにまとめることも可能です。

フォームのモジュールに下記の関数を作成。

Function SaveRequery()

  DoCmd.RunCommand acCmdSaveRecord
  Docmd.SelectObject acQuery, "クエリ名"
  Docmd.Requery

End Function

5つのテキストボックスをすべて選択した状態で、「更新後処理」欄に下記のように設定。

=SaveRequery()

この回答への補足

何度も回答ありがとうございます。

教えて頂いた構文だとクエリーが最前面に出てしまうので、下記の通りクエリの後に
フォームを指定し、切り替わらない様にと思ったのですが、このようにエラーが出てしまいます。何か間違っているのでしょうか? また、クエリーを開いてない場合、開いていないというエラーが出てしまいます。
現在、回避策を調べています。


イベント プロパティに指定した式 更新後処理 でエラーが発生したました: 指定した式は、いずれかの引数とデータ型が対応していません。
*マクロ名、ユーザー定義関数名、[イベント プロシージャ]以外の式が指定されています。
*関数、イベント、マクロの評価でエラーが発生しました。


Function SaveRequery()

DoCmd.RunCommand acCmdSaveRecord
DoCmd.SelectObject acQuery, "管理一覧表表示" , "管理表"
DoCmd.Requery

End Function

補足日時:2012/11/12 16:25
    • good
    • 0

> クエリは直接というより、フォームからクエリ起動のボタンを設置し、クリックして開くようにしています。



そのクエリを開いた状態で、フォームから編集、レコード保存してもすぐに、クエリに反映されないと言うことでしたら、
下記のコードを実行すれば反映します。

Docmd.SelectObject acQuery, "クエリ名"
Docmd.Requery
    • good
    • 0
この回答へのお礼

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


Docmd.SelectObject acQuery, "クエリ名"
Docmd.Requery

お礼日時:2012/11/06 15:41

> 下記のようにしてみたのですが、エラーが出てしまいます。


> 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


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

フォーム側でレコード保存しても、既に開いているクエリには自動では反映されません。
クエリに対して再クエリをする必要があります。

ところで、クエリは直接開いているのですか。それともフォームのレコードソースとしてクエリを設定して、フォームを開いているのですか。

この回答への補足

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

補足日時:2012/11/06 14:00
    • good
    • 0

ACCESSではレコード単位で保存されます。


入力途中でも別のレコードに移動すると自動的に保存されます。

従ってコーディングの必要ははありません

この回答への補足

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

補足日時:2012/11/01 16:48
    • good
    • 0

フォームが連結フォーム(レコードソース、コントロールソースの設定されているフォーム)なら、テキストボックスの更新後処理(AfterUpdate)で、



Docmd.RunCommand acCmdSaveRecord

でできるはずです。
更新前処理(BeforeUpdate)ではエラーになります。

この回答への補足

下記のようにしてみたのですが、エラーが出てしまいます。
DoCmd.RunCommand acCmdSaveRecordの使い方が間違っているのでしょうか?

Private Sub Form_AfterUpdate(Cancel As Integer)
  DoCmd.RunCommand acCmdSaveRecord
End Sub

補足日時:2012/11/02 13:41
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A