Accessのマクロでノーコードアプリを作る
RPAでノーコードと言われてる時代ですが、実のところ大昔からAccessでノーコードな機能は実現されていたりします。しかし、DBという仕組みについてこられず挫折し、結局Excelに戻ってRPAという非生産的なパターンがあるのも事実です(但し、ExcelはPower Queryでノーコードの最適化が実現出来ます)
そこであえて、今どきこのAccessのマクロ機能をちょっとだけ掘ってみて、ノーコードでアプリを作ってみようと思います。Accessについては過去記事がいくつかありますが、まずは以下のエントリーから取り組んでみると良いかと思います。
今回利用するファイル等
- Accessでノーコードアプリを作る - Microsoft Accessファイル
AccessファイルなのでAccessが必要ですが、実行するだけであるならば、Access Runtimeでも動作します。作成者だけAccessを使い、配布する場合は相手にはAccess Runtimeを使ってもらうのがコスト的にも良いでしょう。
また、このマクロもバックグラウンドはVBAそのものなので、初めての起動時にブロックされることがあるので解除が必要です。
Accessのマクロの概要
マクロと聞くと、Excelのあのマクロ(操作を記録してVBAのコードとして残す機能)を思い浮かべる人が多いのですが、Accessに搭載されてるマクロは全くの別物です。よって、VBAのコードとして残すものでも無いですし、どちらかというとFileMakerのスクリプトという機能に近い存在です。レゴブロックのように、用意されてる命令のブロックを繋げて、1つの処理を実現するのが、Accessのマクロ機能です。
マクロとして作っておいて、フォームのボタンに割り当てるといった事が基本になると思いますが、ダイアログを表示して処理を分岐といったものをいくつか用意しておいて呼び出して上げます。画面はリボンメニューの「作成」→「マクロ」を開くと、「マクロデザイン」というタブが表示されるので、ここで作り込んでいくことになります。
図:マクロ編集画面
Accessマクロを色々試してみる
用意されてるマクロのステップのうち、非常によく使うものだけをピックアップしてみました。これらを組み合わせて1つの処理を作り、自動化を行うことになります。
マクロの基本
シンプルなマクロを作る
まずはメッセージを出すだけのマクロを作ってみます(アクションカタログから検索して追加も出来ます)。マクロ作成画面にて
- プルダウンをクリックして、「メッセージボックス」を選択する
- ステップが追加されたので、メッセージやメッセージの種類、タイトルを記入する
- 閉じてマクロを保存する(今回は夕飯という名前で保存しました)
- 再編集する場合は、左サイドバーの対象のマクロを右クリック→デザインビューで可能になります。
図:まずは滅茶シンプルなマクロから
フォームに割り当てる
前項で作ったマクロをフォームのボタンに割り当てるといった場合は以下の手順で構築します。
- フォームを作成し、ボタンを配置する
- コマンドボタンウィザードが起動するので、「その他」を選び「マクロの実行」を選択する
- 次へをクリックしたら、作っておいたマクロの一覧が出るので選択する
- 次へをクリックしたら、アイコンか文字列を指定して完了をクリックする
フォームを保存して、フォームビューに切り替えて、ボタンをクリックするとマクロが実行されて、メッセージが表示されるはずです。このマクロの指定は、右サイドバーのプロパティシートの「クリック時」イベントに埋め込みマクロとして登録されています。他のイベントに登録したい場合(例えばフォーカス取得時などのイベント)などは、このプロパティシートから登録すると良いでしょう。
図:コマンドボタンウィザード
図:埋め込みマクロとして登録されている
リボンに自作マクロを登録
自分が作成したマクロをいちいちAccessの左サイドバーから探し出して実行するというのが、結構時間を食うであったり面倒なことがあります。なので非常によく使うマクロを自分が独自に用意したリボンのタブに登録した状態にしておけば、いつでもワンタッチで実行出来ます。特にアプリを作り込んでいくとこの需要が生まれます。
独自にリボンタブを用意して登録する手順は以下の通りです。
- ファイル→オプションを開き、リボンのユーザ設定を開く
- コマンドの選択でマクロを指定する
- 自分が作っておいたマクロが出てくるので選んでおく
- 右側のパネルの下にある「新しいタブ」をクリックして、名前の変更でタブの名前を指定する
- 4.のグループ名も名前の変更で適当なグループ名をつけておく
- 3.で選んだマクロを真ん中にある「追加」のボタンでグループに追加する
- OKをクリックすると新しいリボンタブが追加され、自分のマクロが表示される
同じ要領でクイックアクセスツールバーに登録する事も可能です。
図:リボンに自作マクロを追加できる
右クリックメニューにマクロを登録
Accessの右クリックメニューにマクロを実行するメニューを追加する方法です。リボンよりも直接的に作業をする場合、こちらのほうがスムーズに実行が出来るので、ある程度アプリの内容が充実してきたら装備してみると良いかもしれません。
作り方は以下の通り。今回は表示した内容再描画するもの(Refreshする)を右クリックで装備してみたいと思います。
- マクロの編集画面を開く
- サブマクロのステップを追加する。名前には「&閉じる」と入れます。
- 新しいアクションの追加にウィンドウを閉じるステップを追加し、一覧表を閉じるよう指定する
- 保存する(クローズと命名した)
- 複数サブマクロを登録することでメニューをいくつも登録可能です。
引き続き、上記で作ったマクロをメニューに追加するマクロを作成します。
- マクロの編集画面を開く
- メニューの追加ステップを見つけて追加。
- メニュー名にフォームコマンドと命名して、メニューマクロ名には前述で作った「クローズ」を追加する
- 更新コマンドという名称で保存する
これでメニューの準備が出来たので、以下の手順でフォームにメニューを追加します。
- 予め作っておいたフォームをデザインビューで開く
- プロパティシートを開き、その他タブの中にある「ショートカットメニュー」が「はい」になってるのを確認する
- おなじく「ショートカットメニューバー」の項目で、直接「更新コマンド」と入力する
- 別のプロパティを触ってから閉じる
これで、そのフォームに対して右クリックメニューが登録されて、右クリックするとその内容が出てくる(但し既存の右クリックメニューは出てこなくなるので要注意)
図:右クリックもノーコードで作れる
クエリを開く
予め作成しておいた各種クエリ(Select, Insert, Update, Deleteなど)を実行します。ダブルクリックする事で対象のクエリが実行されるようになるので、全体の1ステップとして利用する機会は非常に多いものになります。
当然利用するためには予めクエリとその元になるテーブルが必要となり、InsertやUpdateなどの場合は他のテーブルも必要になります。
開く場合に、読み取り専用にしたり、編集モードにしたり、色々と指定は可能です。InsertやUpdate, Deleteの場合は実行時に確認のダイアログが出ますので自動化をしてる場合には要注意。この確認メッセージを非表示にしたい場合は、以下の場所のチェックをオフにする必要があります。
- メニューからファイル→オプションを開く
- クライアントの設定の中にある編集→確認項目を見つける
- アクションクエリにチェックが入ってるので、これを外す
VBAの場合は、DoCmd.SetWarnings Falseで非表示になります。
図:クエリを開くステップ
図:確認ダイアログの設定箇所
メニューコマンドの実行
Accessに標準的に用意されてる機能を呼び出す為のもので、とりわけこの中でよく使うものとしたら
- 保存済みのエクスポート操作
- フィルター関係の処理
- Excelファイルのインポート/リンク
単純に呼び出してるだけなので、特に細かい指定が出来るわけじゃないのですが、いちいちリボンから対象の処理を見つけて人間が実行するより、予め使うであろう機能をセットしておけば、スムーズな処理に繋げることが可能です。
プロシージャの実行
VBAにて標準モジュールを追加し、自前で関数やコードを用意してる場合、対象のボタンに対して処理を直接記述するのではなく、その関数を呼び出して処理をする場合に使います。ので、これはノーコードで利用するものではなく、利便性向上のために使うステップです。
事前にVBAの処理を用意が必要です。自分自身はフォームの各項目に直接的にコードを書く事が多いのと、関数呼び出しもプロパティシートに直接イベントとして記述する事が多いので、あまり使うことはありませんが、大きな連続した処理をいろいろな場面で使う場合にマクロとして用意しておいて実行する事があります。
書式設定を保持したままエクスポート
前述の方法でPDF出力をする場合、いちいちクエリを開いて人間が介在して処理がする必要がありますが、こちらのステップの場合、直接的にPDF出力を全自動化することが可能。また、PDFだけでなく処理をしたテーブルやクエリの内容をExcel形式等でエクスポートすることも可能になります。
- マクロ作成画面を開く
- 書式設定を保持したままエクスポートのステップを追加する
- 開くクエリやテーブルを指定、出力ファイル形式を選択する(PDFやExcelなど)
- 出力ファイルに対して、出力先のフルパスをファイル名まで含めて指定する
- 自動起動はいいえのままでOK
これで実行すると、4.の場所にエクスポートがされて完了します。
図:細かく出力指定をする事が可能
フォームを開く
AccessはExcelとは異なり、通常あまりテーブル/クエリのまま作業をすることは少ないです。入力用や抽出用のユーザインターフェースとしてフォームを用意して、そこにボタンやサブフォームとクエリを表示して、作業をするように作り込むのが通常の使い方です。
それらのフォームを開くコマンドも用意しておくと非常に楽です。以下の手順でフォームを開くようにします。同時にフィルタもすることが出来ますが、その場合通常は表形式でフォームを作っておく必要があります。
- マクロ編集画面を開く
- フォームを開くステップを追加する
- フォーム名、ビューの形式、抽出条件を指定したい場合はWhere条件、データモードを指定します。
- 保存する
実行すると、フォームが開きます。条件式を指定してる場合は、予めフィルタした結果が表示されるようになります。
図:フィルターを指定する事も可能
図:フォームを開くことが出来た
合せ技
Accessのマクロは痒い所に手が届くようなステップがあまり用意されていないので、自動化や自由度を得る為にはVBAは欠かせません。しかし、いくつかのマクロのステップを組み合わせる事で実現可能なこともあります。
フィルターの実行
テーブルやクエリを開いて、条件指定をしてフィルタする事が可能です。クエリやテーブルを開く→フィルタの実行というステップにて、条件を指定する事で、自動的にフィルタした結果を表示する事が可能になります。
- マクロ作成画面を開く
- テーブルを開くステップを追加し、ビューは「データシートビュー」として指定する
- フィルターの実行ステップを追加する
- フィルタ名は適当に付けて、以下のようなWhere条件式には列名と値をもって式を追加する
1[商品タイプ]=0
商品タイプが0のものだけを抽出する - 複数の条件を付けたい場合は、andやorをつけて以下のように記述する
1[商品タイプ]=0 And [価格]>=600 - 保存して閉じる
図:Where条件で抽出条件を記述する
テーブルやクエリを印刷する
クエリを開く→印刷を実行→プレビューを閉じるという1連のステップですが、「印刷プレビューを閉じる」というステップは存在しないので、以下のように構築します。
- マクロ作成画面を開く
- クエリを開くステップを追加し、ビューは「印刷プレビュー」として指定する
- オブジェクトの印刷ステップを追加する
- 印刷の実行やPDF出力の場合は保存場所の指定などは人力で行う必要がある。
- 4.の処理が完了したら、ウィンドウを閉じるステップを追加し、クエリを指定して印刷プレビューを閉じる。
わざわざ、レポートを用意せずにフィルタした結果をダイレクトに印刷して、閉じるまでの処理ですが、PDFなどの場合は保存する場所やファイル名はマクロからは指定が出来ないので、人間の作業が途中で必要です。
図:印刷して閉じるという流れを作る
条件分岐
IFによる条件分岐などを判定し、条件に合致してる場合にマクロを実行するといったケースで利用します。以下の事例はフォーム上のチェックボックスがオン/オフの時に判定して実行する事例になります。
- フォーム上にチェックボックスを1個追加する。この時、右サイドバーのプロパティシートの「名前」の欄の文字列を控えておく(チェック2といったような名前がついてる)
- この時、チェックボックスの既定値に「True」などを入れておきましょう。
- マクロ作成画面を開いて、アクションカタログから「IF」を選択してステップを追加する
- IFの項目内に以下のような条件分を記述する
1IF [チェック2] = true - 新しいアクションの追加にて、マクロの実行を選び、予め作っておいたマクロを指定する
- Trueじゃない場合の処理は、Elseの追加やElse IFの追加をクリックしてさらに判定を追加してあげる
- マクロを保存して閉じる
- フォーム上にボタンを配置して、IF判定のマクロを割り当てる
これでクリックすると、チェックボックス2がチェックされてる時にボタンをクリックすると、マクロが実行されるようになります。
図:IFでチェックボックスの状態を判定
特殊なマクロ
Accessのマクロには特殊なマクロが2つ用意されています。AutoexecとAutokeysの2つがそれで、前者が起動時に自動的に実行されるマクロで、後者がファンクションキーに割り当てるマクロになります。
Autoexec
マクロの名前をAutoexecにするだけで、自動的に起動時に実行されるようになるマクロです。色々な初期化であったり、起動したら自動的に処理をしたいような内容を記述する事で、ユーザの初回の手間を省いたりするのが目的で利用します。
代表的な使い方は、起動した時にナビゲーションウィンドウを非表示にしたりといった制御に使うことが多いと思います。自分の場合はVBAコードを書いてるので、その関数を呼び出して起動時の初期化でよく利用しています。
タスクスケジューラ等と組み合わせて、自動的に指定時刻にAccessのファイルを開いて、Autoexecで自動的に処理なんて仕組みに使うのも作業自動化に有効です。
Autokeys
キーボードのショートカットキーの組み合わせで自動的にマクロを実行するようにする為のマクロがAutokeysです。故にもう一つ実行部隊のマクロを用意する必要があります。ここで規定したショートカットキーが優先となるため、標準のショートカットキーと同じ場合、そちらは無効化されるので注意。
以下の手順で作成します。今回はF1キーで夕飯マクロを実行するようにします。
- マクロ作成画面で、プルダウンから「サブマクロ」を追加する
- サブマクロの名称に「{F1}」と入力
- 同じセクション内にある新しいアクションの追加から、「マクロの実行」を追加する
- マクロ名にはすでに作ってあるマクロを指定する
- 保存して一旦ファイルを閉じる
- ファイルを開き直すと自動的にAutoKeysが実行されて、F1キーを押すとマクロが実行されるようになる
この2.の構文は公式サイトのドキュメントに記載されているので、キーの組み合わせなどを構築する事も可能です。
図:F1キーでマクロが実行できる
Access処理の自動化
タスクスケジューラを使って定期実行
定期的に自動的に特定のAccessファイルを起動して処理をしたい場合、タスクスケジューラを使って起動させる事が可能です。前述のAutoexecマクロと組み合わせて、処理の最後にAccessの終了といったステップを追加しておけば、タスクスケジューラの時限設定次第で様々なパターンで、Accessで処理をやらせる事が可能になっています。
- タスクスケジューラを起動する
- 右サイドバーから「タスクの作成」をクリックする
- 名前を適当に入れて、トリガータブをクリックする
- 新規ボタンをクリックする
- このトリガー画面で、毎日や毎時などの時限設定をセットします。
- セットしたらもとの画面に戻り、操作タブを開く
- 新規ボタンをクリックする
- 操作はプログラムの開始で、この参照ボタンをクリックして、access.exeを探して指定する(通常は、"C:\Program Files\Microsoft Office\root\Office16\MSACCESS.EXE"にある)
- 引数に開きたいaccdbファイルのフルパスを入れる(例:"C:\Users\ユーザ名\Desktop\Database4.accdb")
- OKをクリックして閉じる
これで指定のトリガーに合致した時刻に自動的にAccessファイルが起動するようになります。
図:トリガー設定画面
図:タスクスケジューラに登録された様子
VBSを使ってマクロを実行
別のプログラムからAccessのファイルを起動して、中に入ってるマクロを実行したいというケースがあります。Accessを操作する場合COMを経由する必要がありますが、VBScriptの場合それが可能になるので、他のプログラムから呼び出したい場合、VBSを叩くことで実現が可能です。
以下のようなコードを記述することで呼び出しが可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Dim accessman Set accessman = CreateObject(“Access.Application”) ’Accessのファイルを起動する accessman.visible = true accessman.OpenCurrentDatabase “C:\Users\ユーザー名\Desktop\マクロ実行用.accdb” WScript.Sleep 7000 ’マクロ実行 accessman.Application.Run "夕飯" WScript.Sleep 7000 ’Accessファイル閉じる accessman.Quit '終了処理 set AcApp = Nothing |
これで、アクセスを起動し、ファイルを開き、中にある「夕飯」マクロが実行されます。
コマンドラインスイッチ
Accessは起動時にコマンドプロンプトから実行する場合、コマンドラインスイッチと呼ばれるものを使って、制御する事が可能になっています。主に自動化で使うスイッチとしたら「/xスイッチ」「/cmdスイッチ」の2種類になります。前述のタスクスケジューラやVBSと組み合わせて使う事で、起動時に自動的にマクロを実行させるといった事が可能になります。
※他にもいくつか制御用のコマンドラインスイッチが用意されています(読み取り専用で開かせる等など)
/xスイッチ
こちらは単純で、コマンドラインからファイルを開く場合に、以下のようにスイッチとマクロ名を繋げる事で、起動時に自動的に対象のマクロを実行させる事ができるようになります。
1 |
c:¥users¥username¥desktop¥test.accdb /x マクロ名 |
これを実際にコマンドプロンプトから実行する場合には、以下のような形になる。
1 |
"C:\Program Files\Microsoft Office\root\Office16\MSACCESS.EXE" "C:\Users\hiroyuki\Desktop\Database4.accdb" /x 夕飯 |
Autoexecに頼らず、動的にマクロが実行出来るので、状況や用途に応じて処理を分けて同じファイルを実行したい場合に有効です。
/cmdスイッチ
これは、Autoexecマクロに対して引数を渡して実行させる事が出来るようにするスイッチで、実際に使う場合には標準モジュールにて予めVBAで関数を用意しておく必要があります。以下の手順で作成します。
- 以下のような関数をVBAで用意しておく
1234Public Function autofuncman()'引数を受け取ってメッセージを表示MsgBox (Command)End Function
Commandが引数の入ってくる場所になります。(実際にはこれはCommand関数と呼ぶもので、引数の変数ではない) - Autoexecマクロを作成し、プロシージャの実行でステップを追加、プロシージャ名は上記の関数名(autofuncman)として保存する
- 一旦保存して閉じる
- コマンドプロンプトを開き以下のようなコマンドを実行する(/cmdスイッチを利用する)
1"C:\Program Files\Microsoft Office\root\Office16\MSACCESS.EXE" "C:\Users\hiroyuki\Desktop\Database4.accdb" /cmd "鶯パンマン" - 引数のメッセージが表示されるようになる
図:Autoexecマクロと連動して動かす
マクロをVisual Basicに変換
マクロの機能は簡単にノーコードで作れると言っても出来る事が限られています。VBAであるならばありとあらゆる事が可能となるため、VBAを身に着けたいといった場合は最初からVBAで構築したほうが自由度が全然違います。しかし、既存のマクロで作ってしまってるものは、もう一度コードを書くことなく、ボタン1つでVisual Basicのコードに変換が可能です。
- マクロの編集画面を開く
- 左上のリボンにある「マクロをVisual Basicに変換」をクリックする
- エラー処理やコメントなどの可否をチェックして、変換ボタンをクリック
- 標準モジュールとして追加されて、例えば以下のようなコードが生成される
123456789101112131415161718192021222324Option Compare Database'------------------------------------------------------------' 条件判定''------------------------------------------------------------Function 条件判定()On Error GoTo 条件判定_ErrWith CodeContextObjectIf (.[チェック2] = True) ThenDoCmd.RunMacro "夕飯", , ""End IfEnd With条件判定_Exit:Exit Function条件判定_Err:MsgBox Error$Resume 条件判定_ExitEnd Function - 条件判定()という関数を既存のボタンのクリック時イベントに書き換える
図:Visual Basicにコード変換が可能
関連リンク
- スクリプトの作成と編集 - FileMaker Pro
- データベースを開いたときに実行されるマクロを作成する
- キーボード ショートカットを使用して Access マクロを実行する
- Access 2010 の AutoKeys マクロの作り方
- Command 関数
- Access 2013 コマンドライン スイッチを使って帳票を自動印刷する方法~起動後のマクロ実行
- Ms Accessの起動スイッチと天才的としかいいようのない裏技
- アクション クエリのメッセージを非表示にするには
- Access のイベント駆動型データマクロとUSysApplicationLogとログデータ
- マクロを使用してカスタム メニューおよびショートカット メニューを作成する