メイン コンテンツへスキップ
サポート
Microsoft アカウントでサインイン
サインインまたはアカウントを作成してください。
こんにちは、
別のアカウントを選択してください。
複数のアカウントがあります
サインインに使用するアカウントを選択してください。

ここでのコンテンツは、Northwind 2.0 Developer Edition と Starter Edition に適用される場合があります。 

VBA (Visual Basic for Applications) は、すべての Office 製品で使用されるプログラミング言語です。 VBA を学習すると、Access だけでなく、すべての Office 製品を操作できます。
"ハウツー" を検索するときは、必ず Access の具体的な例を探し、検索に Microsoft Access を含めます。 多くの場合、他の Office 製品のソリューションは機能しますが、保証はありません。 Microsoft Access は成熟した製品です。それはそこに多くの例があることを意味します。これはあなたに最適です! 

また、Access プログラミングに関する古い書籍を見てみることもできます。 古い本の多くは、元のコストのほんの一部で古い本のサイトでまだ利用可能です。 Microsoft Web サイトを確認して、引き続きサポートされている Access のバージョンを確認し、それらのバージョンに対応します。

Office のサポート リソースの終了 - Office の展開 |Microsoft Learn  

Microsoft の Access ドキュメントへのリンクを次に示します。

Microsoft Access ファイルは Office ファイルです。 Office ファイルは、"信頼できる場所" にあるか、"コンテンツ" が有効になっている必要があります。 これらの項目は、作成したアイテムまたは信頼できるソースから取得されているため、"安全" と見なされます。 Office ファイルを開くたびに、[信頼できる場所] が表示されるかどうかを確認します。 ここから、これを信頼済み/有効と見なします。 注: 新しいバージョンのアプリケーションがリリースされ、信頼されていない場所から開かれると、コンテンツを有効にするプロセスが繰り返されます。

信頼できる場所の詳細を確認します。 

マクロ、関数、およびサブは、ビジネス ロジックを Access データベースに実装する方法です。 開始する前に 、スコープと可視性 を理解しておくことが重要です。


フォーム上のコントロール (ボタン、テキスト ボックス、ラベルなど) のイベント (コントロールのクリックなど) は、レコードの追加、削除、フォームの開き方など、他のプロセスをトリガーします。 これらのプロセスは、マクロまたは VBA を使用して実装できます。 Northwind Starter Edition では、ほとんどのマクロと、マクロが必要な機能を実行できない VBA が使用されます。 Northwind Developer Edition では、主に VBA が使用されます。 

一部のコントロールの種類には、マクロを自動的に作成するためのウィザードが組み込まれています。 たとえば、フォームにコマンド ボタンを追加すると、ボタンのいくつかの機能を提供するウィザードが開きます。 コンボ ボックスを追加すると、フォーム上の特定のレコードを検索するように構成できるウィザードが開きます。 

ナビゲーション ウィンドウは、すべてのデータベース オブジェクトを表示およびアクセスするメインな方法であり、既定では [アクセス] ウィンドウの左側に表示されます。 
Northwind ナビゲーション ウィンドウがカスタマイズされました。 Northwind Starter 2.0 というカスタム カテゴリを作成しました。 これにより、機能領域別にオブジェクトを整理できます。

場合によっては、変数を作成したオブジェクトがスコープ外になった後に変数が存在する必要があります。 上記の 「スコープと可視性」を 参照してください。 これを行うには、パブリック変数、TempVars、およびローカル テーブルに値を格納する 3 つの主要な方法があります。 多くの開発者は、これらの組み合わせを使用します。 それぞれに長所と短所があります。  それぞれの詳細については、以下を参照してください。 

VBA モジュールのパブリック変数: 

TempVars: 

ローカル テーブルに値を格納する

  • 現在のセッションにはパブリック変数と TempVars が存在し、アプリケーションが閉じられるとスコープ外になります。 しかし、セッション間でユーザー固有の変数を保持する場合はどうなりますか? これらの種類の値は、ローカル テーブルに格納できます。 Northwind 2.0 では、そのような変数が SystemSettings と呼ばれるテーブルに保存されます。 テーブルの値は ShowWelcome です。 この値は、ログインするたびにようこそ画面を表示するかどうかを Access に通知します。

開発者は多くの場合、あるフォームから別のフォーム、またはフォームからレポートにパラメーターを渡す必要があります。 これらのパラメーターは、呼び出された関数が自身を構成するために使用する重要な情報を伝えます。 2 番目のフォームまたはレポートで最初のフォームから情報を取得するには、いくつかの方法があります。 これらの方法をいくつか次に示します。 

  1. 2 つ目のフォームは、最初のフォームを "振り返る" ことができます。表示可能なコントロールまたは非表示のコントロールで、いくつかの値を取得できます。  例:
    lngCustomerID = Forms!FirstForm!cboCustomerID 

  2. 最初のフォームでは、値をグローバル変数または TempVars に保存できます。 例:
    g_lngUserID = Me.cboUserID 
    TempVars.Add "UserID", Me.cboUserID 

Northwind Developer Edition やプロフェッショナルライフでよく使用されるメソッドは、DoCmd.OpenForm または OpenReport の OpenArgs 引数を使用しています。 例:

DoCmd.OpenForm "frmCompanyDetail", OpenArgs:=StringFormat("CompanyID={0} &CompanyTypeID={1}", Me.VendorID, ctVendor)

ここでは、次の 2 つの手法を組み合わせています。(1) VendorID と VendorType を渡すために OpenArgs を使用する方法と(2) StringFormat() 関数を使用して作成する方法 (例: この文字列)。 

CompanyID=5&CompanyTypeID=2 

この文字列は、ブラウザーで使用されるクエリ文字列によく似ています。 これには、アンパサンド文字で区切られた 1 つ以上の "名前/値のペア" が含まれています。 

name1=value1&name2=value2


このような文字列の利点は、各値に名前があるということです。 これを、OpenArgs のみを "5,2" に設定する、より簡単な方法と比較します。  このような場合、各値が何を意味するのかを調べるには努力が必要です。 各値に名前を付けると、クエリ文字列が "自己記述" になります。これは、適切なプログラミング手法です。

DoCmd.OpenForm の受信側では、通常、Form_Open または Form_Load イベントに含まれており、OpenArgs 文字列をそのコンポーネントに解析します。

Northwind では、 StringToDictionary 関数を使用してこれを行うことができます。 クエリ文字列のような関数を受け取り、それをそのコンポーネントに解析します。 これらのコンポーネントは Scripting.Dictionary オブジェクトに格納されます。 これを行うには、 ツール >参照 を使用し、 参照を Microsoft Scripting Runtime (scrrun.dll) に設定する必要があることに注意してください。

Dictionary オブジェクトの機能と利点は次のとおりです。  

  • 要素の順序は重要ではありません

  • コレクションの要素を追加および削除するための単純な関数

  • コレクションをループする関数を使用して、その中に何があるかを知ることができます

  • Exists 関数を使用すると、特定の要素が使用可能かどうかをテストできます

Northwind 全体でディクショナリ オブジェクトの使用が表示されます。 たとえば、frmGenericDialogForm_Load イベントです。

Access でコントロール ウィザードを使用して作成されたマクロには、エラー処理が含まれることがよくあります。コントロール ウィザードで作成された VBA は、汎用 の MsgBox Err.Description に制限される場合があります。

Northwind 2.0 では、VBA コードを使用するときにより適切に実行する方法について説明します。 グローバル エラー ハンドラーと呼ばれるものを実装しました。 プロシージャで発生するエラーは、グローバル レベルで関数を呼び出してエラーを表示します。 ここでの大きな利点は、エラー処理が一貫していることです。 また、メッセージを変更する必要がある場合 (たとえば、エラー番号を追加で表示したり、エラーをファイルにログに記録したりするには)、1 つの場所でのみ実行する必要があります。 

clsErrorHandler は、エラー処理コードを実装するクラス モジュールです。 クラス モジュールは、すべてのメインとヘルパー関数を 1 つのユニットにまとめ、コードをカプセル化します。

AutoExec マクロは、modStartup で Startup 関数を呼び出します。 Starter Edition では、関数によって clsErrorHandler のインスタンスが作成され、アプリケーション全体で使用できるグローバル変数として保存されます。 Dev Edition では、静的クラスが使用されます。クラス モジュールの上部にあるコメントを参照してください。

実際、プロシージャのエラー処理コードは非常に一貫性があるため、各プロシージャに適切なエラー ハンドラーを用意した特定の VBA コードを使用して、5 分以内にすべてのコードを作成できました。 (テンプレートに含まれていないコード)。 Northwind 2.0 Starter と Developer の両方のテンプレート エディションには、最初にこのエラー処理アプローチが組み込まれています。 
'

エラー処理の改善

Northwind Developer Edition のバージョン 2.2 以降では、Access コミュニティからのフィードバックにより、エラー ハンドラーが改善されました。 スターター エディションは変更されません。 

本質的に、以前のバージョン (2.0 - 2023 年 4 月にリリース) のエラー ハンドラーは次のとおりです。

Public Sub HandleError(…)
    MsgBox Err.Description
End Sub


バージョン 2.2 では、次にアップグレードされます。

Public Sub HandleError (…, Optional ByVal IsEventProcedure As Boolean = False)
    If Not IsEventProcedure Then
        Err.Raise lngError, strErrSource
    End If
    MsgBox Err.Description
End Sub


この変更が行われた理由を理解するために、最初にコードを実行する理由を理解しましょう。

  • AutoExec マクロは、最初のフォームを開く前にいくつかの初期化を実行するスタートアップ プロシージャを呼び出します。

  • ユーザーは、フォームを開いたりボタンをクリックしたりするなど、アプリケーションと対話し、 Form_LoadcmdPrintInvoice_Clickなどのイベント プロシージャが発生します。
    '

イベント プロシージャに加えて、アプリケーションにはサブルーチンと関数が含まれています。主にモジュール内にあり、そのコードはイベント プロシージャから呼び出されます。 これらは"標準" プロシージャと呼ばれます。

Northwind のバージョン 2.0 では、標準プロシージャはメッセージで独自のエラーを処理しますが、エラーが発生したことを呼び出し元のイベント プロシージャに何らかの形で通知しません。 イベント プロシージャに、呼び出されたプロシージャによって処理された前のエラーに関係なく実行する必要がある後続のコードがある場合、これは不適切な場合があります。 確かに、サブルーチンを成功または失敗を返す関数に置き換え、それに応じてイベント プロシージャをコーディングできますが、必ずしもオプションではありません。

Northwind バージョン 2.2 では、標準プロシージャはエラー メッセージを処理するのではなく、Err.Raise を使用して呼び出し元のイベント プロシージャに報告します。 呼び出し元のイベント プロシージャは、発生したエラーを表示し、 Exit_Handlerで再開します。 これは、呼び出し元のプロシージャが正常に終了できるため、より優れています。

Northwind バージョン 2.2 コードを使用するには、呼び出し元がイベント プロシージャであることを示す 3 番目の引数を、イベント プロシージャが HandleError に渡す必要があります。 Northwind Dev Edition が更新されました。

さらに強力なエラー ハンドラー モジュールでは、"スタック" (配列) 上の "プッシュとポップ" プロシージャがサポートされます。 最初の要素は常にイベント プロシージャであるため、余分な引数は必要ありません。 この実装は、Northwind Dev Edition の目標を超えています。

MRU または [最近使用済み] は、最近使用した注文と発注書の一覧です。 これらの項目に頻繁に戻って、次の状態に戻す場合があります。 MRU リストは、最近使用したファイルの一覧として Office 製品でよく見られます。もう一度開き直す必要があります。

Northwind Dev Edition では、MRU 機能 (Starter エディションには存在しません) を実装するには、まず次の項目を確立する必要があります。 

  1. MRU 情報を格納するテーブル。

  2. 注文または発注書 (PO) が開かれたときにテーブルを更新するコード。

  3. リボンの MRU ドロップダウンを更新するコード。

  4. MRU 項目がリボンから選択されたときに項目を読み込むコード。

これらのそれぞれについて詳しく見てみましょう。 


1. MRU 情報を格納する表。

テーブル MRU の設計は、特にそのインデックスを確認する価値があります。 リボンドロップダウン リストの MRU 項目の簡単な並べ替えに役立つ重複インデックス SortIdx と、アイテムが 1 回だけ発生するビジネス ルールを適用する一意のインデックスがあることに注意してください。 たとえば、同じ順序を 2 回開いても、MRU テーブルに 2 つのレコードは作成されません。


テーブルは、データベース内のすべての MRU 関連の PK (主キー) フィールドが AutoNumber であるため、LONG Integer データ型を PKValue に使用できるという事実を利用します。

2. 注文または P.O. が開かれたときにテーブルを更新するコード。

NW2 では、既存のレコードが再度更新されたときではなく、新しいレコードが作成されたときにのみ MRU リストに追加することを選択しました。 AddToMRU 呼び出しをForm_AfterInsertからForm_AfterUpdateに移動してサポートすることは確かです。

AddToMRU および DeleteFromMRU プロシージャは modGlobal に実装されています。これは、パブリック プロシージャが任意のフォームから表示される標準モジュールです。

AddToMRU (名前が示すように) は、MRU テーブルに新しい項目を追加し、必要に応じて、最大サイズ (MAX_MRU_COUNT) を超えた場合は最も古いレコードを削除して、元に戻します。 最後の手順はおそらく Access 開発者に最もよく知られていません。リボンのドロップダウンを更新する必要があり、InvalidateControl を呼び出すことによって実行されます。 これは、リボンの初期化プロセスを再実行するためのシグナルです。 

3. リボンの [MRU] ドロップダウンを更新するコード。 

起動時に InvalidateControl が呼び出されると、複雑な関数セットが実行され、リボンが設定されます。  これらのプロシージャは、テーブル uSysRibbons の Ribbon XML によって呼び出されます。一部は次のとおりです。

<group id="gCurrentStatus" label="MRU">
    <box id="bxMRU" boxStyle="vertical">
        <dropDown id="ddMRU"
                  getItemCount="ddMRU_GetItemCount"
                  getItemLabel="ddMRU_GetItemLabel"
                  getSelectedItemIndex="ddMRU_GetSelectedItemIndex"
                  getItemID="ddMRU_GetItemID"
                  onAction="ddMRU_OnAction"
                  screentip="Most Recently Used Objects">
        </dropDown>
    </box>
</group>

これら 4 つのコールバック関数によってドロップダウンが設定されます。 これは、標準的なコンボボックスについて 本明細書で説明したのとほぼ同じ考えであることに注意してください。

modRibbonCallbackDebug.Print 行のコメントを解除し、アプリケーションを再起動すると、イミディエイト ウィンドウに次のようなシーケンスが表示されます。 

ddMRU_GetItemCount    ddMRU    6 
ddMRU_GetItemLabel    ddMRU    0      Order 60, Proseware, Inc.
ddMRU_GetItemID       ddMRU    0       2 
ddMRU_GetItemLabel    ddMRU    1      Order 62, Best For You Organics Company
ddMRU_GetItemID       ddMRU    1       4 
ddMRU_GetItemLabel    ddMRU    2      Order 63, Wide World Importers
ddMRU_GetItemID       ddMRU    2       5 
ddMRU_GetItemLabel    ddMRU    3      Order 66, Proseware, Inc.
ddMRU_GetItemID       ddMRU    3       8 
ddMRU_GetItemLabel    ddMRU    4      Order 67, Best For You Organics Company
ddMRU_GetItemID       ddMRU    4       9 
ddMRU_GetItemLabel    ddMRU    5      Order 68, Adatum Corporation
ddMRU_GetItemID       ddMRU    5       10 
ddMRU_GetSelectedItemIndex  ddMRU    0


ここでは、Access が最初に、ddMRU_GetItemCount の ByRef 引数に読み込む項目の数を返すプロシージャを呼び出 していることがわかります。 これは、MRU テーブルに対してクエリを開き、それをキャッシュするタイミングでもあります。これは、数回使用されようとしているためです。 

その後、リボンは 2 つのプロシージャを繰り返し呼び出して、2 列のドロップダウンの ID とラベルの値を取得します。 

最後に、プロシージャを呼び出して、選択する項目を見落とします。 (ここでは、最初のケースです)。 

4. MRU 項目がリボンから選択されたときに項目を読み込むコード。

他のリボン項目と同様に、リボン XML の OnAction プロパティは、アクションの実行に使用するコールバック関数を指定します。

onAction="ddMRU_OnAction"

このプロシージャは modRibbonCallback で実装されます。 既に開いているレコードセットを再利用して、選択した項目を含むレコードを検索し、必要な TableName に応じて対応するフォームを開き、読み込む PK 値を渡します。

ヘルプを表示

その他のオプションが必要ですか?

サブスクリプションの特典の参照、トレーニング コースの閲覧、デバイスのセキュリティ保護方法などについて説明します。

コミュニティは、質問をしたり質問の答えを得たり、フィードバックを提供したり、豊富な知識を持つ専門家の意見を聞いたりするのに役立ちます。

この情報は役に立ちましたか?

言語の品質にどの程度満足していますか?
どのような要因がお客様の操作性に影響しましたか?
[送信] を押すと、Microsoft の製品とサービスの改善にフィードバックが使用されます。 IT 管理者はこのデータを収集できます。 プライバシーに関する声明。

フィードバックをいただき、ありがとうございます。

×