社内のマクロ付きファイルは、何本ありますか?マクロの棚卸しを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 にあり、共有フォルダの棚卸しでは漏れます。
目次
社内のマクロ付きファイルは、どう数えれば本数が分かりますか?
拡張子で拾い、中に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」のような名前の複製と、シートの値だけ違う版違いを作っています。
拡張子ごとに見ると、.xlsmでも69本中13本はVBAがありませんでした。マクロのない新しいブックを .xlsmで保存すると、手元のExcelは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つありました。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日。
出典
- Microsoft サポート「File formats that are supported in Excel」(.xlsx は VBA を保存できない、.xlsm・.xltm は保存できる、.xlam・.xla は VBA プロジェクトをサポート)(2026年10月16日確認)
- Microsoft Learn「Macros from the internet are blocked by default in Office」(Mark of the Web と ZoneId、既定のブロック)(2026年10月16日確認)
- Microsoft サポート「Create and save all your macros in a single workbook」(個人用マクロブック Personal.xlsb と XLSTART)(2026年10月16日確認)
- oletools(olevba)の説明。Office のファイルから VBA のコードを取り出す Python のツール(2026年10月16日確認)
- マクロの守りの計測(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日確認)