AccessのVBAは、Webアプリへ移すと何割そのまま置き換わりますか?見本の69本を7種に分けて数えた
AccessのVBAは、見本のNorthwind 2.0 Starterで数えると、69本のうち42本(61%)がWebアプリの標準機能で足り、書き直しは2本(3%)、残る25本(36%)は移さずに済みました。処理の種類を画面イベント・帳票の出力・データ更新・ファイル出力・メール送信・外部DLL・消えて良い処理の7つに分け、本数と行き先を数えています。分類の基準とスクリプトも載せます。(2026年10月時点)
全体の流れと費用はAccess・オフコンの引越しのページにまとめています。
要点
- 見本のAccessのVBA 69本のうち、Webアプリの標準機能で足りるのは42本(61%)、書き直しは2本(3%)、移さずに済むのは25本(36%)でした。
- 69本のうち31本は画面のボタンや入力チェックで、標準の部品で足ります。外部DLLを呼ぶDeclare文は0本でした。
- 分けるのは、DLL・メール・ファイル出力・帳票・データ更新・画面の順で、最初に当たった種類に決めます。
- 見本はVBAが薄く、この割合はふつうの業務のAccessには当てはまりません。自分のファイルを同じ手順で数えます。
目次
AccessのVBAは、Webアプリでどれくらいそのまま置き換わりますか?
見本のVBA 69本では、42本(61%)がWeb側の標準機能で足り、書き直しは2本(3%)でした。残る25本(36%)は、エラーログや見本のデータ作りで、移す必要がありません。数えたのはMicrosoftが配るNorthwind 2.0 Starterです。
ここでいう「そのまま置き換わる」は、同じ動きをするコードを書かなくても、移行先の標準の部品で足りることです。特定の製品で動かして確かめたのではなく、処理の中身から分けました。作り直しまで含めた全体の流れは、Access・オフコンの引越しにまとめています。
処理の種類ごとの本数と行き先は、次の表のとおりです。画面イベントが31本で最も多く、外部DLLを呼ぶ処理とファイルへの書き出しは0本でした。
| 処理の種類 | 本数 | 標準機能 | 書き直し | 廃止 |
|---|---|---|---|---|
| 画面イベント | 31 | 31 | 0 | 0 |
| 帳票の出力 | 1 | 0 | 1 | 0 |
| データ更新 | 11 | 10 | 1 | 0 |
| ファイル出力(CSV/Excel) | 0 | 0 | 0 | 0 |
| メール送信 | 1 | 1 | 0 | 0 |
| 外部DLL(Declare) | 0 | 0 | 0 | 0 |
| 消えて良い処理 | 25 | 0 | 0 | 25 |
| 合計 | 69 | 42 | 2 | 25 |
VBAは何を基準に、7つの種類に分けましたか?
プロシージャ(SubかFunctionの1つ分)のコードを読んで、最初に当たった種類で決めました。外部DLL、メール送信、ファイル出力、帳票の出力、データ更新、画面イベントの順に調べます。
DLLは、Declare文で宣言した関数を呼んでいるかで決めます。メールはSendObjectやOutlookの操作、mailto:のリンクです。
ファイル出力はTransferTextやOpen … For Outputで、帳票はOpenReportなどです。データ更新はOpenRecordset、Execute、DLookup、保存や削除の命令です。どれにも当たらないフォームのコードが、画面イベントになります。
30本は、名前を見て手で決めました。見本の管理画面、エラーログ、テストデータ作りなどの25本は「消えて良い処理」です。起動時の処理、画面の再表示、通貨の書式を決める5本は「画面イベント」にしました。この30本の名前はスクリプトに書いてあるので、数え直しても同じ答えです。
画面イベントのVBAは、なぜ標準機能で足りますか?
31本の中身が、画面の開閉、次の画面への値の受け渡し、確認の表示、ボタンの出し分け、保存と削除の前後の処理だったためです。
たとえば受注の「出荷した」ボタンは、空行を除いて17行あります。出荷したかを尋ね、出荷日に今日の日付と状態「出荷済み」を入れて保存し、一覧を更新するだけです。社員の画面で追加ボタンを新規の入力中だけ隠す処理は、1行でした。状態を変えるボタンと確認の表示は、Web側の部品にもあります。
データ更新の11本のうち10本も、DLookupやDCountで調べるか、保存と削除をするだけでした。「注文のある得意先は削除できない」という決まりもその1つです。コードは要りませんが、決まりそのものは移行先にも設定します。標準機能で足りるのは、コードを書かずに済むという意味で、決めごとを移す手間はなくなりません。
足りるかどうかは、移行先の部品の範囲で変わります。足りないときは、その1本が書き直しに回ります。
書き直しになるのは、どんなVBAですか?
見本で書き直しになったのは2本です。帳票のラベル作成を呼び出す1本と、SQLの文で設定の表を更新する1本でした。数が少ないのは、見本のVBAが画面の操作に偏っているためです。
書き直しが増えるのは、次の4つの形です。
| 形 | 書き直しになる理由 | 見本の本数 |
|---|---|---|
| 外部DLL(Declare) | DLLの外部手続きを宣言する文で、Web側に同じDLLがない。64bit版では、PtrSafeのない1行で別の関数まで止まった | 0 |
| メール送信 | SendObjectはMAPIを使うメールソフトに送る。Webではメールを送る仕組みを別に用意する | 0(mailto:の1本は標準機能) |
| ファイル出力 | TransferTextはテキストファイルに書き出す。WebではCSVやExcelの出力の部品に替えるか、書き直す | 0 |
| 帳票の出力 | VBAではなく、レポートの作り直しが中心になる | 1 |
外部DLLは、64bit版で動かない原因を試した記事で数え方を書きました。帳票は、レポートを同じ形で再現する実験が参考になります。
この割合は、ふつうの業務のAccessにも当てはまりますか?
当てはまりません。見本の42本・2本・25本は、このファイルだけの数です。MicrosoftはNorthwind 2.0のDeveloper版を、主な機能を見せるもので、会社を動かすためのものではないと説明しています。Starter版も同じ見本の系統です。
見本にはマクロが4つ、クエリが30あり、これらは数えていません。VBAの行数も、空行を除いたプロシージャの中で1,024行です。長く使った業務のAccessは、DeclareやRecordsetの繰り返しが増え、書き直しの割合が上がりやすいと考えています。ただ、これは見込みで、数えた結果ではありません。
Accessの中身を数える手順では、同じ見本のVBAを1,569行と数えました。この記事は本数で数え直したので、プロシージャの外の行を含む1,569行とは合いません。
自分のAccessのVBAは、どう数えれば割合が出ますか?
コピーしたファイルから、プロシージャの一覧を書き出し、同じ規則で分けます。数えるのはコピーなので、元のファイルは開きません。手順は4つです。
- 全員が閉じた時間に、.accdbをコピーする
- access_vba_dump.ps1にコピーを渡し、フォーム・レポート・モジュールのコードを書き出す(マクロとVBAは動かさない)
- vba_patterns.pyで、プロシージャごとに種類と行き先を決める
- 出たCSVを、種類と行き先で数える
CSVの列は、object・objectKind・procedure・lines・kind・destination・byです。byは、規則で決めたか、手で決めたかを表します。分け方の中心は、次の数行です。
if declared and DLLの関数を呼んでいる: kind = '外部DLL(Declare)'
elif re.search(r'SendObject|Outlook\.Application|mailto:', code): kind = 'メール送信'
elif re.search(r'TransferText|TransferSpreadsheet|OutputTo|Open .+ For (Output|Append)', code): kind = 'ファイル出力'
elif re.search(r'OpenReport|acOutputReport|PrintOut', code): kind = '帳票の出力'
elif re.search(r'OpenRecordset|\.Execute|RunSQL|DLookup|DCount', code): kind = 'データ更新'
elif フォームのコード: kind = '画面イベント'
限界もあります。.accdeや.mdeはVBAのソースがなく、数えられません。VBAの中身の読み方は、AIにVBAを読ませる実験にあります。数える項目の全体は、棚卸しにまとめています。
このサイトで相談するには?
AccessのVBAが何本あり、どれが書き直しになるかも、Access引越しで一緒に数えます。何をどう頼むか決まっていなくても大丈夫です。御社のやり方に合わせて、進め方を一緒に考えます。
準備は要りません。無料で相談するからお送りください。返信は最短当日です。
よくある質問
- Declare文が多いAccessでも、標準機能で足りますか?
- いいえ。Declare文で呼ぶDLLはWebアプリ側に同じものがないので、書き直しになります。見本はDeclare文が0行でした。
- マクロやクエリも、同じ方法で数えますか?
- この記事では数えていません。見本にはマクロ4つとクエリ30があり、別に棚卸しで数えます。
- .accdeしかないときは、VBAを数えられますか?
- いいえ。VBAのソースがないので、プロシージャを読めません。元の.accdbを探します。
- 手で決める分は、どれくらい出ますか?
- 見本では69本のうち30本でした。見本の管理画面やテストデータ作りが混じったためで、業務のAccessでは数えてみないと分かりません。
この数字の出し方
この記事の自前の数字は、次の見本・条件・回数で出しました。主宰が確かめ、更新日は2026年10月17日です。スクリプトの名前から、同じ手順を自分のファイルで再現できます。
- Access引越しの計測(2026年10月17日、Microsoft 365 Access 16.0 ビルド20430 64bit・Windows 11。Northwind 2.0 Starter のプロシージャ69本)。scripts/figs/access_vba_dump.ps1・vba_patterns.py、結果は vba_patterns_northwind_starter.csv
出典
- Microsoft サポート「Northwind 2.0 Developer Edition: Template Tutorial」(見本は主な機能を見せるもので、会社を動かすためのものではない。対象 Microsoft 365・2024・2021・2019)(2026年10月17日確認)
- Microsoft Learn「Declare statement (VBA)」(DLLの外部手続きを宣言する文。PtrSafe の書き方)(2026年10月17日確認)
- Microsoft Learn「DoCmd.SendObject method (Access)」(MAPI を使うメールソフトでオブジェクトを送る)(2026年10月17日確認)
- Microsoft Learn「DoCmd.TransferText method (Access)」(テキストファイルへの書き出し)(2026年10月17日確認)