【VBA】マクロとVBAの使い分け|マクロの限界とVBAの利点

VBA

Accessでは、各操作を自動化するために「マクロ」と「VBA(Visual Basic for Applications)」という2つの仕組みが用意されています。どちらも目的は「作業の効率化」ですが、この2つは実現できる処理に相違点があります。違いを端的にいうと、マクロの方が取り扱いのハードルは低く、VBAの方はより多くのことを実現できます。

この記事では、それぞれの特徴と、「マクロではできないけれどVBAならできる」具体例を交えながら、実務での使い分け方を解説します。

マクロとVBAの基本情報

マクロとは

マクロは、コードを書かずに処理を自動化できる機能です。
操作は一覧形式で設定できるため、Access初心者でも扱いやすく、「ボタンをクリックしてフォームを開く」「レポートを印刷する」といった単純な操作を自動化するのに向いています。

残念ながら、Excelにおける「マクロの記録」のような機能はありません。

【マクロで出来る主なこと】

  • フォームやレポートを開く・閉じる
  • クエリを実行する
  • メッセージを表示する
  • 簡単な条件分岐を設定する

プログラミング知識がなくても利用できるのが大きなメリットですが、一方で、複雑なロジックや外部連携が必要な場面では、マクロでは対応しきれないこともあります。

マクロに関しては、こちら↓の記事でも詳しく解説しています。

VBAとは

VBA(Visual Basic for Applications)は、Accessで実現できる動作を細かく制御できるプログラミング言語です。WordやExcelでも使われており、Office製品を横断した自動化が可能になります。

VBAを使うと、以下のようなことが実現できます。

  • 複雑な条件分岐や繰り返し処理
  • エラー処理の細かな制御
  • 外部ファイル(ExcelやCSV)の入出力
  • 他アプリケーションとの連携

Accessを「業務用ツール」として開発・使用するためには、VBAの知識が欠かせません。

VBAの基本構造や用語については、こちら↓の記事で詳しく解説しています。

マクロでは実現難しい/不可能な処理例

マクロとVBAは「自動化する手段」であるため、どちらの手段であっても、ある程度同様の自動化を実現することができます。しかし中には、マクロでは難しい、またはどう頑張っても不可能というものもあります。

マクロでは難しい処理として、主に次のようなものがあります。

処理内容マクロでの対応
ループ処理(繰り返し処理)対応不可
直接的なデータベース操作(DAO/ADO)対応不可
Officeアプリとの連携(オートメーション)対応不可
外部ファイル操作不可ではないが限界あり
条件分岐の入れ子(ネスト)不可ではないが限界あり
フォームやレポートの動的制御不可ではないが限界あり

マクロで出来ることはVBAでほぼ実現できるのに対して、マクロでは出来ないことが多いんだ。その分複雑さを取っ払ったシンプルさがマクロのメリットといえます。

各項目について解説します。

ループ処理(繰り返し)

マクロには、VBAのFor~NextDo~Loopに相当する、同じ処理を複数回繰り返すアクションが用意されていません

実務において、たとえば「全レコードを順にチェックして条件に合うデータを更新する」といったような処理内容がよく求められます。こういった大量のデータに対して、柔軟な一括処理を行う場合は、VBAが選択肢となります。

直接的なデータベース操作(DAO/ADO)

マクロはテーブルやクエリを「開く・実行する」といった操作はできますが、レコードセットを開いてレコードを1行ずつ処理することはできません

VBAでは、DAO(Data Access Objects)やADO(ActiveX Data Objects)を使い、テーブルを直接開いてレコードの追加・更新・削除を柔軟に制御することがきます。たとえば、非連結フォームに入力したデータを、テーブルに追加する処理はマクロでは出来ません。

Officeアプリとの連携(オートメーション)

Accessは、ExcelやOutlookなどのOffice製品をはじめとする外部アプリケーションと連携することができます。これをOLE(Object Linking and Embedding)オートメーションといいます。

OLEオートメーションを使用することによって、例えば「AccessのデータをExcelに出力し、そのExcelファイルを添付したメールをOutlookで送信」といった工程を自動化することができます。しかもこの一連の操作をAccess側からVBAで制御できるのです。

このような外部アプリケーションの制御はマクロでは実行できませんので、こういった処理の実現にはVBAを活用することとなります。

「柔軟な操作」とはいえませんが、マクロでも「Wordに差し込み」アクションのように、一部他アプリと連携できるアクションもあります。

外部ファイル操作

マクロでも以下のようなアクションでデータのインポートやエクスポートを実行することができます。

  • スプレッドシートのインポート/エクスポート
  • データのインポート/エクスポート
  • テキストのインポート/エクスポート
  • 保存済みのインポート/エクスポート操作の実行

上記アクションだけでも、Excelファイルやテキストファイルを取り込んだり、テーブルのデータをExcel形式で保存したりすることができますので、一般的な用途としては十分といえるでしょう。

一方VBAでは、TransferTextメソッドやTransferSpreadsheetメソッドによるデータのインポート/エクスポートはもちろん、Dir関数やFileSystemObjectという仕組みを使って、ファイルのコピーや削除、フォルダ間の移動など様々な処理を行うことができます

これらの仕組みを使い、例えば「フォルダに格納されている特定のファイル名のみ、他のフォルダに移動させる」といった柔軟な動作も実現できます。Accessで業務用ツールを構築する場合は、必要になってくるテクニックです。

条件分岐の入れ子(ネスト)

マクロでもIfアクションにより条件分岐を設定することができます。そして、このIfアクションを数段配置すれば複数の分岐を行うこともできます。

例えば「ある条件でAフォームを開き、別の条件でBフォームを開く、いずれでもなければツールを終了する」といった感じですね。

しかし、2段・3段と条件が複雑になると、設定画面がどんどん深くなり、可読性が著しく低下します。

一方、VBAでは If~ElseIf~Else~End If 構文で複数条件を記述できることに加え、多分岐であればSelect Caseを用いることで、見た目にもスッキリした構文にすることができます。

また、一度完成したマクロでは、アクションの途中に別のアクションを差し込むのが難しいですが、VBAであれば後から条件を追加・変更するのも容易です。
条件が多い処理は、VBAで記述した方が圧倒的に見通しがよく、保守性にも優れているといえるでしょう。

フォームやレポートの動的制御

マクロでは、フォームを開いたり、特定のコントロールに値を設定したりということは可能ですが、条件に応じてテキストボックスの背景色を変えたり、入力不可にするといった、所謂、プロパティを動的に扱う処理はできません。

以下は、VBAコードでラベルオブジェクトのプロパティを設定している例です。
(フォーム上のテキストボックス(txt金額)の値が10万円を超えると、赤文字の注意喚起文字が表示されます。)

Private Sub txt金額_AfterUpdate()
    If Me.txt金額 > 100000 Then
        Me.lbl注意.Visible = True
        Me.lbl注意.ForeColor = vbRed
    Else
        Me.lbl注意.Visible = False
    End If
End Sub


マクロでは上記のような各オブジェクトを動的に制御することはできないため、このような制御を行いたい場合はVBAを用いることになります。

まとめ

マクロとVBAの使い分けについて解説しました。

マクロのメリットは、プログラミングを意識せずとも処理の自動化を図れることですが、VBAと比較すると出来ることに限界があります。

自動化を習得するステップとして、マクロで処理を作って「慣れてきたらVBAに移行」するという段階的なアプローチも良いですが、業務用ツールの開発を見据えてAccessを学習する場合は、初めからVBAを習得する方が混乱も少ないでしょう。

ご自身の目的に合わせて、使い分けをしてみてください。

タイトルとURLをコピーしました