マクロの守り中小企業のAI導入支援|Excelマクロ(VBA)の属人化の解消からExcelマクロ(VBA)の引き継ぎ 専門

コラムやり方・手順

社内のマクロ付きファイルは、何本ありますか?マクロの棚卸しを395ファイルで試した手順

マクロの棚卸しは、共有フォルダのファイルを拡張子(.xlsm・.xlsb・.xlam・.xls)で拾い、中に VBA の本体があるものだけを数え、同じ中身の複製をハッシュで束ねる作業です。マクロの守りが架空の共有フォルダ395ファイルで試すと、拡張子で拾った139本のうち VBA があったのは81本でした。中身の違うファイルは33本、中のコードは4つです。数える間 Excel は起動しないので、マクロは動きません(2026年10月時点)。

読み解きから直す・置き換えるまでの流れと費用はExcelマクロの引き継ぎのページにまとめています。

要点

  • マクロの棚卸しは、拡張子で拾い、中の VBA の有無で数え、ハッシュで複製を束ねる3段で進めます。
  • 架空の共有フォルダ395ファイルでは、拡張子で拾った139本のうち VBA があったのは81本(58.3%)でした。
  • 81本をファイル全体のハッシュで束ねると33本、取り出したコードのハッシュで束ねると4つに減りました。
  • 一覧とハッシュは約2.6秒、コードの取り出しは81本で約16秒で、どちらも Excel を起動しません。
  • 個人用マクロブック(Personal.xlsb)は各 PC の XLSTART にあり、共有フォルダの棚卸しでは漏れます。
目次
  1. 社内のマクロ付きファイルは、どう数えれば本数が分かりますか?
  2. 架空の共有フォルダで数えると、何本が何本に束なりましたか?
  3. 洗い出しのスクリプトは、どう動かしますか?
  4. 同じマクロの複製と版違いは、どう束ねますか?
  5. 共有フォルダの外に、数え漏れやすいマクロはありますか?
  6. 数えた後、どのマクロから手を付けますか?
  7. このサイトで相談するには?
  8. よくある質問

社内のマクロ付きファイルは、どう数えれば本数が分かりますか?

拡張子で拾い、中にVBAがあるかを確かめ、同じ中身をハッシュで束ねる、の3段で数えます。拡張子だけで数えると、マクロのないブックや同じファイルの複製まで1本に数えてしまいます。数えた後の進め方はExcelマクロの引き継ぎにまとめています。

ハッシュは、ファイルの中身から計算する指紋のような値です。1バイトでも違えば別の値になり、同じ中身なら名前や場所が違っても同じ値になります。3段で見るものを表にしました。

段 見るもの 道具 分かること
1 拾う 拡張子 .xlsm・.xlsb・.xlam・.xls PowerShell マクロが入りうるファイル
2 確かめる 中の vbaProject.bin か _VBA_PROJECT_CUR Python 本当に VBA があるファイル
3 束ねる ファイル全体と取り出したコードのハッシュ PowerShell・olevba 複製を除いた本数と、コードの種類

.xlsxは外して構いません。Microsoftは .xlsxを「VBAのコードを保存できない」形式と説明しています。

架空の共有フォルダで数えると、何本が何本に束なりましたか?

マクロの守りが作った架空の共有フォルダ395ファイルでは、拡張子で拾ったのが139本でした。そのうち中にVBAがあったのは81本です。81本はファイルのハッシュで33本、コードのハッシュで4つに束なりました。

フォルダは部署と個人の12か所に分けました。.xlsx 232本、開いている人がいると残る「~$」で始まるファイル4本、CSV 20本も混ぜています。VBAの本体は、Excelに付いてくるアドイン4つから借りて架空のブックに入れました。そこから「- コピー」「_old」のような名前の複製と、シートの値だけ違う版違いを作っています。

架空の共有フォルダのマクロ付きファイルを4段階でしぼり込んだ横棒グラフ。拡張子で139本、中に VBA があるのは81本、中身の違うファイルは33本、中のコードの違いは4つ共有フォルダのマクロ付きファイルを、4段階でしぼり込んだ数マクロの入りうる拡張子.xlsm・.xlsb・.xlam・.xls(~$ の所有者ファイルを除く)139中に VBA があるxl/vbaProject.bin か _VBA_PROJECT_CUR がある81中身が違うファイルファイル全体の SHA-256 で複製を束ねた数33中のコードが違うolevba で取り出したコードの SHA-256 で束ねた数4架空の共有フォルダ(macro_inventory_make.py、乱数の種 20261016)を2026年10月16日に数えた結果
図1 139本が4つに束なるまで。マクロの守りの計測(2026年10月16日)。フォルダは架空で、乱数の種を決めて作ったので同じスクリプトで作り直せます。

拡張子ごとに見ると、.xlsmでも69本中13本はVBAがありませんでした。マクロのない新しいブックを .xlsmで保存すると、手元のExcelはVBAの本体を書きませんでした。

拡張子ごとのファイル数と VBA があった数の横棒グラフ。.xlsm は69本中56本、.xlsb は16本中6本、.xlam は1本中1本、.xls は53本中18本に VBA があった拡張子ごとのファイル数と、中に VBA があった数.xlsm69本中 VBA あり 56本.xlsb16本中 VBA あり 6本.xlam1本中 VBA あり 1本.xls53本中 VBA あり 18本VBA ありVBA なし(拡張子だけ)架空の共有フォルダ(macro_inventory_make.py、乱数の種 20261016)を2026年10月16日に数えた結果
図2 拡張子ごとの VBA の有無。.xls は53本中18本でした。拡張子だけで数えると、VBA のないファイルが混ざります。

洗い出しのスクリプトは、どう動かしますか?

PowerShellで一覧とSHA-256をCSVに書き出します。そのCSVをPythonで読み、VBAの有無を確かめます。どちらもファイルを読むだけでExcelを起動しないので、マクロは1行も動きません。

一覧を作る部分の要点は次のとおりです。名前が「~$」で始まるファイルは、開いている人がいるときにできる所有者ファイルなので外します。

$exts = '.xlsm','.xlsb','.xlam','.xls','.xla','.xltm'
Get-ChildItem -LiteralPath $Root -Recurse -File |
  Where-Object { $exts -contains $_.Extension.ToLower() -and $_.Name -notlike '~$*' } |
  ForEach-Object { [pscustomobject]@{ Path = $_.FullName; LastWrite = $_.LastWriteTime
    Sha256 = (Get-FileHash -LiteralPath $_.FullName).Hash } } |
  Export-Csv macro_files.csv -NoTypeInformation -Encoding UTF8

Pythonの側は、ファイルの先頭が「PK」ならZIPとして開き、xl/vbaProject.binを探します。古い形式ならolefileで _VBA_PROJECT_CURを探します。

手元のノートPC(Windows 11、Ryzen 7 7735U)では、一覧とハッシュが1回目23.2秒でした。2回目以降は2.6秒前後です。VBAの有無の確認は0.6〜0.7秒、olevbaでのコードの取り出しは81本で約16秒でした。測ったのはローカルのSSDで、ファイルサーバーの上では測っていません。

同じマクロの複製と版違いは、どう束ねますか?

まずファイル全体のハッシュで複製を束ね、次に取り出したコードのハッシュで版違いを束ねます。ファイルのハッシュはシートの値が1つ違えば別になるので、版違いはコードの側で見ます。

架空のフォルダでは、VBAのある81本がファイルのハッシュで33本になりました。いちばん大きいコードの束は35本で、中身の違うファイルは14本でした。拡張子は .xls・.xlsb・.xlsmにまたがっています。

コードの束ごとのファイル数の横棒グラフ。束1は35本(中身の違うもの14)、束2は25本(9)、束3は16本(6)、束4は5本(4)。最終更新の年の幅も並べたコードの束ごとのファイル数と、最終更新の年の幅ファイル数(うち中身の違うもの)最終更新の年束1.xls・.xlsb・.xlsm35(14)2006〜2025年束2.xls・.xlsm25(9)2007〜2024年束3.xlsb・.xlsm16(6)2015〜2024年束4.xlam・.xlsm5(4)2016〜2020年中身の違うファイル複製(同じ SHA-256)架空の共有フォルダ(macro_inventory_make.py、乱数の種 20261016)を2026年10月16日に数えた結果。更新日時は乱数で散らした架空の値
図3 コードの束ごとの本数。更新日時は乱数で散らした架空の値です。

途中に罠が1つありました。vbaProjectの塊そのもののハッシュで束ねると、4つではなく10に分かれます。Excelで別の形式に保存し直したファイルは、コードが同じでも塊のバイト列が変わっていたためです。版違いを束ねるときは、olevbaでコードの本文を取り出してから比べます。

共有フォルダの外に、数え漏れやすいマクロはありますか?

あります。いちばん漏れやすいのは個人用マクロブック(Personal.xlsb)です。Microsoftの説明では、各PCのXLSTARTというフォルダにある隠しブックです。Excelを開くたびに裏で開きます。

共有フォルダをいくら数えても出てこないので、毎日の作業で使っている人のPCを1台ずつ見ます。

メールの添付やブラウザから保存したファイルにも気を付けます。こうしたファイルにはMark of the Webという印(ZoneId)が付きます。ZoneIdが3のファイルのマクロは、既定でブロックされます(Mark of the Web とは)。

架空のフォルダで印を付けた13本のうち、VBAがあったのは5本です。一覧のCSVにZoneIdの列を足しておくと、開いたときに止まる候補が分かります。

ほかに、拡張子 .xlaの古いアドインと、.xltmのテンプレートもVBAを持てます。スクリプトの拾う拡張子にはこの2つも入れました。

数えた後、どのマクロから手を付けますか?

コードの束ごとに、最後に更新された日と、使っている人を書き出し、止まると業務が止まる束から手を付けます。本数の多い束が大事とは限らず、複製が多いだけのこともあります。

私が棚卸しの結果を読むときは、束ごとにいちばん新しいファイルを1本選びます。それを使っている人に「月に何回、何のために開くか」を聞きます。答えが出ない束は、使われていない候補として印を付けます。束の代表を1本に決めたら、そのファイルについて引き継ぎ書のひな形の12項目を埋めていきます。

数には限界もあります。今回のフォルダは架空で、本数の割合は作り方で決まり、実際の社内で何割が複製かは数えてみないと分かりません。複製は元の更新日時のまま残ることがあり、今回の複製も元の日時を写して作りました。使っているかどうかは、日付ではなく人に聞いて確かめます。

別のPCで開いたときに止まる原因の1つは、参照設定が見つかりませんのエラーです。棚卸しの表に、参照を持つブックを足しておくと追えます。

このサイトで相談するには?

マクロの守りでは、共有フォルダの洗い出しから、束ごとの処理の図と引き継ぎ書までをお手伝いします。スクリプトは御社のPCの中で動かし、ファイルの中身を外に出しません。

何をどう頼むか決まっていなくても大丈夫です。御社のやり方に合わせて、進め方を一緒に考えます。準備は要りません。無料で相談するからお送りください。

よくある質問

ファイルサーバーの上で、そのまま数えても大丈夫ですか?
はい。一覧とハッシュはファイルを読むだけで、Excel を起動しないのでマクロは動きません。ただし利用者の多い時間は避け、読み込みの負荷が業務に響かないようにします。
パスワードの掛かった VBA でも数えられますか?
VBA の有無とファイルのハッシュは数えられます。どちらも ZIP の中のファイル名とファイル全体のバイト列を見るだけで、パスワードを外す必要はありません。
.xlsx のファイルは数えなくてよいのですか?
はい、マクロの棚卸しでは外せます。Microsoft は .xlsx を VBA のコードを保存できない形式と説明しています。
何本くらいから外に頼むことを考えますか?
本数より、中のコードの束の数と、ブックどうしが互いを開くかで決めます。束が数個でも、互いを開き合うなら処理の図を先に作ります。

この記事の実験・計算の条件

架空の共有フォルダ395ファイル(12か所)。Windows 11、Excel 16.0 ビルド20430(64bit)、oletools 0.60.2。2026年10月16日。

出典

  1. Microsoft サポート「File formats that are supported in Excel」(.xlsx は VBA を保存できない、.xlsm・.xltm は保存できる、.xlam・.xla は VBA プロジェクトをサポート)(2026年10月16日確認)
  2. Microsoft Learn「Macros from the internet are blocked by default in Office」(Mark of the Web と ZoneId、既定のブロック)(2026年10月16日確認)
  3. Microsoft サポート「Create and save all your macros in a single workbook」(個人用マクロブック Personal.xlsb と XLSTART)(2026年10月16日確認)
  4. oletools(olevba)の説明。Office のファイルから VBA のコードを取り出す Python のツール(2026年10月16日確認)
  5. マクロの守りの計測(2026年10月16日、Windows 11・Excel 16.0 ビルド20430 64bit・oletools 0.60.2。架空の共有フォルダ395ファイル)。scripts/figs/macro_inventory_make.py・macro_inventory.ps1・macro_inventory.py(2026年10月16日確認)