こんばんは
文系 Takaです。
前回、ようやくデータをしっかりと閲覧できる仕組みができました。
しかし、今の状態ではエクセルを更新しても、クエリを操作しなければdataテーブルのデータが更新されない状態です。
そのため、今回はツールで使用するデータを更新する仕組みをフォームに実装していきます。
データを更新するタイミングを考える
はい、それではここで質問です。
あなたがこのツールを使う時に必ずすることはなんだとおもいますか?
はい、そこまで!
正解は、
「フォームを起動する」
です。
ということは、dataテーブルを更新する仕組みを「フォームを起動する」時に動作させれば、確実に最新データを閲覧することができますよね。
では実装してみましょう。
フォーム起動時にdataテーブルを更新する
まずはフォームをデザインビューで開いてください。
開き方を忘れてしまった方は8講に乗せていますので、一度ご覧くださいね。
また、とりあえずここだけ体験したい方は、10講の一番下でAccessとExcelのファイルをダウンロードできるので、そちらのファイルをご利用ください。
VBAを編集するエディタを開く
フォームをデザインビューで開いたら、以下の画像の赤枠で囲んだ部分をクリックしましょう。
この状態でプロパティシートのイベントタブをクリックして表示しましょう。
イベントシートの中に「開く時」という項目があるので、この項目の「…」をクリックしましょう。
ビルダー選択画面が表示されたら、「コードビルダー」を選択します。
これまでリストボックスに書いてきたコードとは別に、
----------------------
Private Sub Form_Open(Cancel As Integer)
End Sub
----------------------
という項目が増えたと思います。
”Form_Open”と書かれている部分に命令文を記述すると、フォームを開く時にその動作をさせることができます。
ここでは、以下の画像の様に「1_削除」クエリと「2_追加」クエリを、フォームを開くたびに自動実行させ、dataテーブルを更新するようにします。
では入力する内容を説明していきます。
フォームを開く時の動作を記述する
・クエリをVBAから実行する
VBA書式
DoCmd.OpenQuery("<実行するクエリ名>")
この命令文の内容は以下の通りです。
DoCmdは結構よく使うので覚えておきましょうね。
DoCmd | DoCmdの後に記述したアクションを実行する |
OpenQuery | 指定したクエリを実行するアクション |
("<実行するクエリ名>") | 実行するクエリ名を"(ダブルクォーテーション)でくくって記入する |
実際に「1_削除」クエリを実行する場合は、
DoCmd.OpenQuery("1_削除")
と入力すればOKです。
では、「1_削除」と「2_追加」を実行するように入力をしてみましょう。
以下の様になるはずです。
----------------------
Private Sub Form_Open(Cancel As Integer)
DoCmd.OpenQuery ("1_削除")
DoCmd.OpenQuery ("2_追加")
End Sub
----------------------
これで、フォームを開いたときに「1_削除」と「2_追加」を
実行できるようになりました…が…
クエリの動作テストで、クエリを実行した時に以下のようなメッセージが表示されていましたよね?
このツールを使う人が皆、Accessを使ったことのある人だったらこんなのがいくら出ても問題ないのですが、そうでない人が使う時に出たらどう思うでしょう…
怖いとおもいませんか?
これがきっかけで「どうしたらよいか」といった問い合わせにつながってしまったり、操作ミスで正しくデータが更新されないなど、さまざまな問題が起こる可能性があります。
ですので、この表示を出さないようにちょっと手を加えていきたいと思います。
クエリ実行時のメッセージを表示させない
・システムメッセージのオンオフを切り替える
DoCmd.SetWarnings False/True
この命令文の内容は以下の通りです。
DoCmd | DoCmdの後に記述したコマンドを実行する |
SetWarnings | システムメッセージの表示有無切り替え |
False/True | False=システムメッセージオフ True=システムメッセージオン |
VBAでクエリを動作させる時には、ちょっとした配慮という感じで入れてあげると良いでしょう。
プログラムを書く時に、使う人への優しさを発揮できる様になると、いろいろなことを覚えられてトラブルも防げると一石二鳥ですよ!
さて、この命令文をVBAで記述する時には、
DoCmd.SetWarnings False
でクエリ実行時のメッセージをオフにし、処理させます。
さらに、クエリの処理が終わった後には
DoCmd.SetWarnings True
で、システムメッセージを表示させる動作に戻します。
表示を再開させるコマンドを実行しておかないと、以後通常動作中にAccessで発生するシステムメッセージが表示されなくなってしまいます…
では、先ほど入力した内容に、システムメッセージのオンオフを追記してみましょう。
せっかくデータを更新してもリストを更新しないと最新の情報が表示されないので、要素1のリストを更新する命令文も入れておきましょう。
----------------------
Private Sub Form_Open(Cancel As Integer)
DoCmd.SetWarnings False 'システムメッセージオフ
DoCmd.OpenQuery ("1_削除") '1_削除クエリ実行
DoCmd.OpenQuery ("2_追加") '2_追加クエリ実行
DoCmd.SetWarnings True 'システムメッセージオン
Me![リスト0].Requery '要素1リストボックス更新
End Sub
----------------------
これで、ユーザがフォームを起動したときに余計なメッセージが表示されなくなり、要素1のリストも最新の状態に更新されます。
さて、これでフォームを開く度に、ツールのデータを更新することができる様になりました。
今回はさらに、使用中に管理者がExcelを更新した場合でも、フォームを再起動せずにデータを差し替えられるボタンをフォーム上に設置しましょう。
dataテーブルを手動更新できるボタンを作る
フォームにボタンを配置するため、デザインタブからボタンコントロールを選択しましょう。
下の画像の赤枠部分がボタンコントロールです。
ボタンコントロールをクリックしフォームの任意の場所に設置すると、「コマンドボタンウィザード」というウィンドウが表示されますが、これはキャンセルしてください。
以下の画像のようにボタンを配置したら、ボタンを選択した状態でプロパティシートを使って設定を進めます。
まず、「書式」タブをクリックしましょう。
表題の項目が「コマンド14」などコントロール名になっていますので、これを書き換えましょう。
このボタンはデータを更新するためのものなので、「更新」などが良いでしょうか。
表題を書き換えると、ボタンの名前も更新されます。
続いて、イベントタブの「クリック時」を編集しましょう。
「クリック時」の「…」ボタンをクリックして、VBAのエディタを表示しましょう。
今回は、コマンド14のクリック時の動作を設定します。
先ほど設置したボタンの名前によって変化するので、コマンド14が見当たらない場合は、あなたが設置したボタンの名前を確認してそこにVBAを入力するようにしてください。
さて、今回このボタンに設定する動作は
「フォームを開いた時」
と同じ動作+設置しているリストを最新データにするための「リストの更新」です。
まずは「Form_Open」部分のクエリ実行コマンドを流用しましょう。
楽できるところは楽をすることが大切です。
以下の「ここから〜ここまで」の範囲をコピーしましょう。
----------------------
Private Sub Form_Open(Cancel As Integer)
'ここから
DoCmd.SetWarnings False 'システムメッセージオフ
DoCmd.OpenQuery ("1_削除") '1_削除クエリ実行
DoCmd.OpenQuery ("2_追加") '2_追加クエリ実行
DoCmd.SetWarnings True 'システムメッセージオン
'ここまでをコピーします
End Sub
----------------------
続いて以下のように、コマンド14(ボタンの動作)に貼り付けます。
----------------------
Private Sub コマンド14_Click()
DoCmd.SetWarnings False
DoCmd.OpenQuery ("1_削除")
DoCmd.OpenQuery ("2_追加")
DoCmd.SetWarnings True
End Sub
----------------------
さらに、要素1~3のリストを更新する命令文を入力します。
この時、誤操作を防ぐ意味でリストの値も「空文字」にしておくと、無駄なトラブルを防げますね。
----------------------
Private Sub コマンド14_Click()
'リストの値を空文字にする
Me![リスト0] = ""
Me![リスト2] = ""
Me![リスト4] = ""
'リストのデータを更新
Me![リスト0].Requery
Me![リスト2].Requery
Me![リスト4].Requery
'データテーブルを更新
DoCmd.SetWarnings False
DoCmd.OpenQuery ("1_削除")
DoCmd.OpenQuery ("2_追加")
DoCmd.SetWarnings True
End Sub
----------------------
最終的に全体の記述内容は以下の通りとなります。
※それぞれのコントロールの名前
(リスト0、リスト2、コマンド14)は皆さんが設置した
リストやボタンなどのコントロール名になります。
※行の中で「'」の後の文字列は、緑色になり、VBE上
では命令文とみなされなくなります。
これを使ってコメントを記載することができます。
緑色のコメントを除いて、入力した内容が上の画像のようになっていたら、エディタを閉じましょう。
お疲れ様でした。
今回はここまでにしましょう。
次回はついに最終講。
フォームに標準で付いている機能のうち、不要なものを外し、ツールを完成状態にします。
それではまたお会いしましょう。