Access 2010 でのマクロと式の操作

**概要:**Microsoft Access 2010 には、テーブルに追加するマクロを記述できるデータ マクロという新機能が導入されています。また、マクロ デザイナーも改良されています。これらのオプションについて説明し、関連するコード例を確認します。

適用対象: Access 2010 | Office 2010

Applies to:  Microsoft Access 2010

公開日:  2010 年 11 月

目次

  • 概要

  • マクロ デザイナー

  • データ マクロの作成

  • 式ビルダー

  • マクロと式の作成の容易化

  • その他の技術情報

概要

ほとんどの Microsoft Access 2010 開発者は、マクロの記述を好みません。特別な状況 (AutoKeys および AutoExec マクロの作成など) を除き、アプリケーションの拡張性が重視される世界でマクロは十分な市民権を得ていません。マクロは、Microsoft Access ユーザーが Microsoft Visual Basic for Applications (VBA) プログラミングの領域に飛び込む前の準備をするための手段になっています。マクロの記述で使用されるアクション (DoCmd オブジェクトの派生オブジェクト) は VBA で使用されるメソッドに相当しますが、マクロ デザイナーのインターフェイスは Visual Basic Editor の機能の充実ぶりに比べると貧弱です。

Access 2010 のリリースによって、マクロのデザインと使用法にいくつかの新機能が追加されました。これらは、開発者にとってもユーザーにとっても魅力的なものです。具体的には、マクロ デザイナーの改良、テーブルベースのデータ マクロ、式の作成方法の変更が挙げられます。改良されたマクロ デザイナーは、これまでよりも柔軟で読んで理解しやすいマクロを作成するのに役立ちます。また、マクロをテーブルに追加できるようになり、追加したマクロはそのテーブルに基づいて作成されたすべてのオブジェクトで継承されます。式ビルダーでは、Intellisense によって式の作成が容易になりました。

この記事では、新しいマクロ デザイナーについて説明します。また、マクロ デザイナーを使用してデータ マクロを作成する方法を示します。最後に、式ビルダーのいくつかの変更点を説明します。

マクロ デザイナー

Access 2010 は、コーディングの誤りを減少させると共に複雑なマクロの作成を容易にする新しいマクロ デザイナーを備えています。このデザイナーを使用してそうした効果を得る手段としては、ドロップダウン リスト、Intellisense、既存マクロの再利用、ドラッグ アンド ドロップ機能、コピー/貼り付け操作があります。

開発者は、アクションのスムーズな論理フローを促進する条件ブロックの作成に役立つ改良されたインターフェイスを高く評価するでしょう。また、電子メール、Web ページ、またはブログおよびニュースグループでのマクロの共有も容易です。

以前のバージョンの Microsoft Access でマクロを作成したことがある読者にとって、なじみがあるのは 3 列形式のマクロ ビルダー (図 1 を参照) です。条件文を [条件] 列に、マクロのアクションを [アクション] 列に、指定するパラメーターを [引数] 列に追加するというものでした。

図 1. 以前のバージョンのマクロ ビルダー

検索マクロ作成者のレガシ バージョン

Access 2010 の新しいマクロ ビルダーのレイアウトは、テキスト エディターによく似ています。以前あった 3 つの列は見当たりません。その場所には、プログラマによって使用されるおなじみのトップダウン形式でアクションと条件文が表示されます。引数は、図 2 に示すようにダイアログ ボックス内にインライン表示されます。

図 2. マクロ デザイナー

マクロ デザイナー

新しいアクションや条件文は簡単に追加できます。アクションのドロップダウン リストまたは右クリック メニューから選択するか、マクロ デザイナーの右側にある [アクション カタログ] ウィンドウ (図 3 を参照) から選択するだけです。

図 3. アクション カタログ

アクション ​​カタログ

アクションは、ダブルクリックしたり、マクロ デザイナー上にドラッグ アンド ドロップしたりできます。既定では、[ アクション カタログ] と [新しいアクションの追加] コンボ ボックスに、信頼されていないデータベースで実行されるアクションが表示されます。すべてのアクションを表示するには、リボンの [すべてのアクションを表示] コマンドをクリックします (図 4 を参照)。

図 4. リボンの [すべてのアクションを表示] コマンド

リボンの [すべてのアクション​​を表示] コマンド

コード ブロックの一部またはすべてを折りたたむには、コード ブロックの左側にある展開コントロールをクリックします。また、コード ブロックの折りたたみまたは展開を行うには、リボンの展開/折りたたみグループにある展開または折りたたみのコントロールを使用します。図 5 は、図 2 のマクロを折りたたんだ状態を示しています。

図 5. 折りたたまれたコード ブロック

折りたたまれたコード ブロック

[アクション カタログ] 検索ボックスは、条件を入力してその条件に一致するアイテムを Microsoft Access によってフィルターおよび表示できる検索機能を備えています。[アクション カタログ] の検索ボックスでは、アクション名だけでなく、アクションの説明も検索の対象になります。たとえば、Query で検索を行います。すると、検索結果には、Query が含まれるアクションだけでなく、説明に Query が含まれる ApplyFilter、GoToRecord、ShowAllRecords も表示されます。

また、マクロにコメントを追加するには、[新しいアクションの追加] ボックスに「//」と入力するか、アクション カタログの [コメント] ノードをドラッグします。コメントは、図 2 に示すように緑色のテキストで表示されます。そのため、コメントは見つけやすく、プロシージャ内のセクション分けに使用できます。マクロ コードの配置変更も容易です。コード ブロックを新しい場所にドラッグ アンド ドロップするか、アクション ウィンドウ内のブロックにある緑色の上下の矢印 (図 5 を参照) を使用するだけです。

このマクロ デザイナーには、グループ ブロックと呼ばれる新しいプログラム フロー構造が導入されています。グループ ブロックによって、読みやすさのために展開または折りたたみが 1 つの単位として行われる複数のマクロを同じグループ内に容易に配置できます。

以前のバージョンの Microsoft Access にあったマクロ ビルダーでは、[条件] 列を使用して簡単な条件文を作成できました。Access 2010 のマクロ デザイナーでは、ElseIf および Else 文の追加によって、もっと多様な If 文を作成できます。これらの文を追加するには、[If] ブロックを選択した後、コード ブロックの右下にある [ElseIf] テキストまたは [Else] テキストを選択します。たとえば、[ElseIf] テキストを選択すると、[ElseIf] ダイアログ ボックスが表示されます。さらに、条件ボックスに入力する際には、Microsoft Access の IntelliSense 機能によって識別子、関数、および他のデータベース アイテムが表示されます。

また、マクロ デザイナーと IntelliSense の組み合わせによって、さまざまな支援機能が提供されます。以下にそれらを示します。

  • オートコンプリートは、用語を特定できるだけの文字が入力されると、オブジェクト、関数、またはパラメーターに一致する語のドロップダウン リストを表示します。その場合は、Enter キーまたは Tab キーを押してその候補を受け入れるか、そのまま名前の入力を続けることができます。

  • クイック ヒントは、マクロや式に記述された識別子の正しい構文を表示します。識別子の上にマウス カーソルを置くと、その宣言の情報がダイアログ ボックスに表示されます。

  • ポップ ヒントは、オートコンプリートを使用して値が選択された場合にユーザー インターフェイス コンポーネントに関する追加情報を提供します。

こうした改良のすべてがマクロ デザイナーに対して行われていても、多くの開発者はマクロから VBA コードへの変換を必要とするでしょう。この機能は、リボンの [マクロを Visual Basic に変換] コマンドによって実行できます。

次のセクションでは、マクロ デザイナーを使用してデータ マクロを作成します。

データ マクロの作成

データ マクロは、Access 2010 の新しい機能です。データ マクロを使用すると、レコードやテーブルに (SQL Server のトリガーに似た) ロジックを追加できます。つまり、1 つの場所にロジックを記述すると、同じテーブルに対してデータの追加、更新、または削除を行うすべてのフォームとコードでそのロジックが継承されます。データ マクロにより、次のようなさまざまなシナリオに対応できるようになります。

  • 別のレコードの追加を許可する前のフィールド値のチェック

  • レコードの変更履歴の保持

  • フィールド値が変化した際の電子メールの生成

  • テーブル内のデータの正確さの確認

以前のマクロ (以降では単にマクロと呼びます) は依然として存在しますが、それらの呼び出しはイベント、別のマクロ、レポート イベント、または VBA コードからしか呼び出せません。

データ マクロには、大きく分けて次の 2 種類があります。テーブル内のデータに対して何らかのアクションが発生したときにトリガーされる "イベント" マクロと、それらが名前によって呼び出されたときに実行されるスタンドアロンの "名前付き" マクロです。データ マクロは、データ イベントの追加、更新、または削除の直後や、イベントの削除または変更の直前に実行されるようにプログラミングできます。

データ マクロでは、ReturnVars を使用することでマクロに値を返すことができます。データ マクロ内の ReturnVars は、VBA などのプログラミング言語での関数/メソッド呼び出しによって返される値に類似しています。そのため、データ マクロ内で発生した状況に基づいてマクロを呼び出す際に UI を表示できます。データ マクロでは、図 6 に示すように SetReturnVar コマンドを使用して ReturnVars を指定します。これらの値は、名前付きのデータ マクロ内で設定されます。

図 6. マクロに値を返す SetReturnVar

SetReturnVar はマクロに値を返す

マクロ内で変数を参照するには、次の文にある ReturnVars コマンドを使用します。

    =[ReturnVars]![retrunVar1]

注意

データ マクロのロジックは、ローカルなテーブルでのみ機能し、リンクされたテーブルでは機能しません。ただし、この問題は、ソース テーブルへのデータ マクロの追加によって Access フロントエンドおよび Access バックインを使用すると回避できます。

データ マクロが便利な理由は、一連のフォームに同じマクロを追加せずに済むのでデータベース内の混乱が軽減されることにあります。テーブルに追加したロジックは、そのテーブルに基づいて作成されるすべてのフォームで継承されます。また、データ マクロを使用すると、データの整合性を確認できます。データ マクロを持たないテーブルに関連付けられたフォーム内でイベントがトリガーされるとします。テーブルにアクセスしたりクエリを実行したりできるユーザーは、このフォームをバイパスできる場合があり、その場合はロジックを回避できます。テーブルへのアクセスを制限したりクエリの実行を禁止したりすることもできますが、これらをすべての環境で行うことはできません。ロジックをテーブルに直接追加することで、ユーザーがフォームの外側で変更を行った場合でもアクションがトリガーされます。

表 1 に、データ マクロがサポートするイベントの一覧を示します。

表 1. イベントの一覧

イベント

用途

BeforeChange

次の処理を行う場合:

  • エラー メッセージのトリガーと変更のブロック

  • 新しい値との比較と別のフォームのオープン

BeforeDelete

次の処理を行う場合:

  • エラー メッセージのトリガーと削除の中止

  • アイテム再注文のための注文フォームの表示

AfterUpdate、AfterInsert、AfterDelete

次の処理を行う場合:

  • 電子メールの生成

  • 一連のレコードのループ処理とそれらのステータスの更新

イベント データ マクロを作成するには、最初に左側のナビゲーション ウィンドウで、そのデータ マクロを追加するテーブル名をダブルクリックします。次に、[テーブル] タブの [イベント前] グループまたは [イベント後] グループで、マクロを追加するイベントをクリックします。Microsoft Access によってマクロ ビルダーが表示されます。このイベントに対するマクロを既に作成している場合は、マクロ ビルダーによってそのマクロが開かれます。

名前付きマクロを作成するには、左側のナビゲーション ウィンドウで、そのデータ マクロを追加するテーブル名をダブルクリックします。続いて、[テーブル] タブの [名前付きマクロ] グループで、[名前付きマクロ]、[名前付きマクロを作成する] の順にクリックします。Microsoft Access によってマクロ ビルダーが表示されます。

ここで、次のような例を考えます。インベントリ内の商品の在庫レベルを監視する注文システムがあるとします。このシステムでは、アイテムの在庫数が一定のレベルを下回ると、そのレベルや、商品の発注が必要なことをスタッフに通知する必要があります。そのためには、アイテムのテーブルに対するデータ マクロを作成します。そうすると、そのテーブルに基づいたフォームを作成するだけで、必要なロジックのすべてが既に利用できる状態で提供されます。

データ マクロを作成するために、次のフィールドを持つサンプルのテーブルを [アイテム] という名前で作成します。

表 2. サンプル データ

名前

アイテム

テキスト

数量

数値 (長整数型)

ステータス

テキスト

テーブルを保存し、[アイテム] 列に次のデータを追加します。他の列は空白のままにします。

表 3. テーブルへのデータの追加

コーヒー

ソーダ

紅茶

マクロを追加するには、テーブルを選択し、[テーブル ツール] の [フィールド] タブで [ビュー] ドロップダウン リストをクリックして、[データシート ビュー] をクリックします。データシート ビュー内のテーブルの [テーブル ツール] で、[テーブル] タブをクリックし、[変更前] イベント ボタンをクリックします。After Change イベントではなく、Before Change イベントを使用したのはなぜでしょうか。一般には、Before Change イベントを使用して追加のコードを変更および実行するほうが、テーブルによるレコードの更新を許可したうえで、テーブルに保存されたばかりの同じレコードに対して追加の変更を行うよりも好ましいとされています。総数を集計してそれらの値を他のテーブルに保存する場合は、After Change イベントによるテーブルのトリガーのほうが適しています。たとえば、数量の値が変化しても在庫の総数を維持するとします。こうしたシナリオでは、通常、別のテーブルを変更することになります。

次に、テーブル内で変更を行うたびにトリガーされる If...Then...Else 文を作成します。[アイテム: 変更前] タブで、ドロップダウン リストをクリックし、[If] をクリックします。If 文の条件を追加するには、If 文の後に「アイ」と入力します。IntelliSense 機能を利用して、[アイテム] テーブルを選択します。[アイテム] という識別子の後に続けてピリオドを入力し、[数量] を選択します。[数量] の後に、「50 ~ 100」と入力します。これにより、アイテムの数量が減少して 50 ~ 100 の範囲になると、If 文のその部分がトリガーされるという条件が設定されます。

画面右側のアクション カタログには、特定のイベントに対して利用できるアクションとプログラム フロー演算子の一覧が表示されます。[SetField] をクリックして [If] 文のブロックにドラッグします。[名前] ボックスに、「アイテム.ステータス」と入力します。[] ボックスに、「"レベル: 低"」 と (引用符付きで) 入力します。アイテムの数量が減少して 50 ~ 100 の範囲になると、[ステータス] のテキストが変化します。

[If] 文をもう一度クリックすると、ブロックの右下に [Else の追加] オプションと [Else If の追加] オプションが現れます。[Else If の追加] オプションをクリックし、そのブロックを追加します。条件ボックスに「アイテム.数量 <50」と入力します。アクション カタログ ウィンドウで、[SetField] を [Else If] ブロックにドラッグします。[名前] ボックスに「アイテム.ステータス」と入力し、[] ボックスに「"今すぐ注文 !"」と (引用符付きで) 入力します。アイテムの数量が減少して 50 未満になると、[ステータス] フィールドのテキストが変化します。

[Else If] 文をクリックして [Else の追加] をクリックします。[SetField] を [Else] ブロックにドラッグします。[名前] ボックスに「アイテム.ステータス」と入力し、[] ボックスに空の文字列「""」を入力します。これは、アイテムの数が 100 を超えた場合に [ステータス] フィールドが空白になることを意味します。マクロは、この段階で図 7 のようになっているはずです。

図 7. 完成したデータ マクロ

完成したデータ マクロ

マクロを保存して閉じるために、[アイテム: 変更前] タブをクリックして [閉じる] をクリックします。

このマクロをテストするには、データシート ビュー内のテーブルで、コーヒーの数量を 100 に変更し、レコードの外側をクリックして、[ステータス] フィールドのテキストが [レベル: 低] になるかどうかを確認します。ソーダの数量を 49 に変更すると、その [ステータス] フィールドは [今すぐ注文 !] に変化します。紅茶の数量を 101 に変更しても、その [ステータス] フィールドは 空欄のままです。これらすべてを 図 8 に示しています。

図 8. 数量に応じて変化するステータス フィールド

"状態" フィールドは数量の変更に応じて変更される

名前付きデータ マクロで利用できる別のオプションとして、パラメーターを渡す機能があります。多くの場合、パラメーターはデータベースのパフォーマンス向上のために使用されます。これは、パラメーターによって開発者およびユーザーがマクロの実行前にデータ セットの制限を強いられるためです。その結果、マクロの高速化、データベース サーバーに対する負荷の低下、ネットワーク トラフィックの減少につながります、また、パラメーターを使用すると、変更なしにマクロを再利用できるため、柔軟性が向上します。名前付きデータ マクロにパラメーターを追加するには、そのマクロを追加するテーブルをダブルクリックします。[テーブル] タブの [名前付きマクロ] グループで、[名前付きマクロ] ドロップダウン矢印をクリックし、[名前付きマクロを作成する] をクリックします。マクロ ビルダーの上部 (図 9 を参照) にある [パラメーターの作成] をクリックします。

図 9. マクロ ビルダーの [パラメーターの作成] オプション

マクロ ビルダーの [パラメーターの作成] オプション

データ マクロのデバッグは、他のプログラミング コードに対するものほど機能が充実していません。コードのステップ実行やメッセージ ボックス オプションの使用はできません。ただし、OnError、RaiseError、および LogEvent マクロ アクションについては、アプリケーション ログ テーブルを使用してデータ マクロ エラーの発見に役立てることができます。アプリケーション ログ テーブルは、(USysApplicationLog という) システム テーブルであり、既定ではナビゲーション ウィンドウに表示されません。データ マクロでエラーが発生した場合は、アプリケーション ログ テーブルの情報を確認することで何が起こったかを知ることができます。

アプリケーション ログ テーブルを表示するには、[ファイル] タブをクリックして Backstage ビューを表示します。[情報] タブの [アプリケーション ログ テーブルの表示] をクリックします。[アプリケーション ログ テーブルの表示] ボタンが見当たらない場合は、このデータベースでアプリケーション ログ テーブルがまだ作成されていないことを意味します。LogEvent または RaiseError マクロ アクションによる使用など、イベントがログに記録されると、そのボタンが [情報] タブに表示されます。

式ビルダー

式ビルダーは、式の作成に役立つツールです。式を記述する Microsoft Access 内のほとんどの場所から、式ビルダーを起動できます。テーブル、フィールド、クエリ、フォームやレポートのプロパティ、コントロール、クエリ、マクロはすべて、式によってデータまたはロジックを評価して、アプリケーションの動作を駆動できます。式ビルダーでは、データベース内のフィールドやコントロールの名前だけでなく、式の記述時に利用できる多くの組み込み関数も容易に参照できます。式ビルダーを使用すると、何もない状態から式を作成したり、たとえばページ番号、現在の日付や日時を表示するための事前に作成された式から適切なものを選択したりできます。

Access 2010 では、式ビルダーが大幅に変更されています。改良された式ビルダー (図 10 を参照) を使用すると、以前よりも短い時間で式を記述でき、エラーも少なくなります。

図 10. Access 2010 の式ビルダー

Access 2010 の式ビルダー

この式ビルダーは、新しい機能と簡素化されたユーザー インターフェイスを備えています。構文や利用できる関数またはプロパティをもう覚える必要はありません。新しい式ビルダーには、式の入力時に必要なすべての情報を提供する IntelliSense の機能があります。

また、新しいユーザー インターフェイスでは、特定のコンテキスト内に存在する関数やプロパティのみが表示されるというプログレッシブ ディスクロージャを使用しています。以前のバージョンの Microsoft Access では、式が使用されるコンテキストのそれぞれで単一の一般的な式エバリュエーターを共有していました。そのため、どこで式を使用するかに関係なく、利用できる関数と演算子はほとんどの場合で同じでした。Access 2010 の式ビルダーは状況依存型です。たとえば、FormatDateTime 関数はテーブルのコンテキストでは利用できませんが、他のすべてのコンテキストでは利用できます。また、図 10 に演算子のボタンが示されていないことに注意してください。演算子は式の要素ウィンドウで利用できます。これらすべての変更によって、煩雑さが軽減され、選択肢の操作が容易になり、編集領域が拡大されています。

マクロ デザイナーなど、式を作成する Access 2010 内の場所で図 11 に示すアイコンをクリックすると、式ビルダーが表示されます。

図 11. 式ビルダー アイコン

式ビルダー アイコン

続いて、式を入力すると、図 12 に示すようなフィールド、関数、または式の要素のドロップダウン リストが表示されます。

図 12. 入力中に表示されるオプションのドロップダウン リスト

入力中に、オプションのドロップダウン リストが表示される

Access 2010 のヘルプでは、式ビルダーの使用方法や式そのものに関してさらに多くのヘルプ情報を参照できます。

マクロと式の作成の容易化

Microsoft Access の新規ユーザーにとっても経験豊かな開発者にとっても、新しいマクロ デザイナーがもたらす使いやすさの向上によって、マクロの作成はかつてないほど簡単になりました。Else および Else If 構造の追加は、マクロの柔軟性を大幅に高めます。また、新しいアクション カタログと IntelliSense 機能によって、よく使用されるコマンドやアクションを覚えておく必要がなくなりました。さらに、改良された式ビルダーにより、式の作成はかなり簡単になります。全体としては、これらの改良によって、作成するデータベースの機能をより詳細に管理できるようになっています。

その他の技術情報

この記事で説明したトピックの詳細については、以下のリソースを参照してください。