📦 Excel VBAを社内に配布するときのTips
ChatGPTやClaudeにVBAのコードを書かせるのは、もう普通になった。
でも 「作ったあと、どうやって社内に配る?」 ここで詰まる人が多い。
自分用に動くマクロと、社内の全員に使ってもらえるマクロは、作り方がちょっと違う。この記事では、実際に企業さまへExcelツールを納品するなかで身につけた 配布のコツ をまとめます。

🎯 この記事の前提
- VBAのコードはLLM(ChatGPT / Claude)に書かせる
- 自分が使うだけでなく、チームや部署に配布したい
- 配布後の アップデート もラクにしたい
💡 Tips 1:Excelにマクロを埋め込まない
これが一番大事。
❌ やりがちなパターン
データが入ったExcelファイルに直接VBAを書いて、そのまま配布する。
これをやると、ファイルごとにコードのコピーが増える。バグが見つかっても、配布済みの全ファイルを回収して直すハメになる。
✅ 配布するならこうする
マクロ入りのExcel(ツール) と データ用のExcel を分ける。
📗 ツール.xlsm(マクロ入り) → 📊 データ.xlsx を開いて処理する
ツール側のVBAで、対象のExcelファイルを開いて処理する形にしておく。
Sub ProcessFile()
Dim filePath As String
filePath = Application.GetOpenFilename("Excelファイル,*.xlsx")
If filePath = "False" Then Exit Sub
Dim wb As Workbook
Set wb = Workbooks.Open(filePath)
' ここでデータ処理
' ...
wb.Save
wb.Close
MsgBox "✅ 処理が完了しました!"
End Sub
こうしておくと:
- アップデートはツール.xlsmだけ差し替えればOK
- データファイルにはマクロが入らないから安全
- ユーザーは「ツールを開く → ファイルを選ぶ → 実行」だけ
💡 Tips 2:操作ボタンもVBAで自動配置する
配布したツールに「実行ボタン」を置きたい。
手動でボタンを配置すると、レイアウトが崩れたり、マクロの紐付けが切れたりする。ボタン配置自体もVBAで自動化 できる。
📌 シート上にボタンを自動生成
Sub CreateButtons()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("メニュー")
' 既存のボタンを削除
Dim shp As Shape
For Each shp In ws.Shapes
If shp.Type = msoFormControl Then shp.Delete
Next
' 実行ボタン
Dim btn As Shape
Set btn = ws.Shapes.AddFormControl(xlButtonControl, 50, 50, 200, 40)
btn.TextFrame.Characters.Text = "▶ 実行する"
btn.OnAction = "ProcessFile"
' エクスポートボタン
Set btn = ws.Shapes.AddFormControl(xlButtonControl, 50, 110, 200, 40)
btn.TextFrame.Characters.Text = "📊 エクスポート"
btn.OnAction = "ExportData"
' ヘルプボタン
Set btn = ws.Shapes.AddFormControl(xlButtonControl, 50, 170, 200, 40)
btn.TextFrame.Characters.Text = "📖 使い方"
btn.OnAction = "ShowHelp"
End Sub
初回セットアップ時にこれを実行すれば、ボタンが揃った状態のツール が完成する。
💡 Tips 3:モジュール名はちゃんとつける
VBAのモジュールが増えてくると、何がどこにあるか分からなくなる。

❌ よくある惨状
Module1 ← 全部入り。何が何だか分からない
Module2 ← 追加で書いたやつ
Module3 ← コピーしたまま
✅ こうする
Main ← エントリーポイント(ボタンから呼ぶ処理)
Config ← 設定値(シート名, 列番号, メールアドレス)
DataAccess ← データ読み書き
Formatter ← 出力整形・フォーマット
Mailer ← メール送信
Setup ← 初回セットアップ用
英語の命名が難しければ、ローマ字でも全然OK。
Syori ← メイン処理
Settei ← 設定値
DataYomikaki ← データ読み書き
大事なのは「何が入ってるか名前で分かること」。Module1 に全部突っ込むのだけは避ける。
ポイント:
- LLMにコードを書かせるとき「Main, Config, DataAccess に分けて」と指示すると、最初から整理されたコードが出てくる
💡 Tips 4:Config モジュールで設定値を分離する
同じツールを別の部署やチームにも展開するとき、変わるのは設定値だけ ということが多い。
' Config モジュール
Public Const SHEET_NAME As String = "売上データ"
Public Const NOTIFY_EMAIL As String = "admin@example.com"
Public Const COMPANY_NAME As String = "営業部"
' 共通設定(変更不要)
Public Const DATE_FORMAT As String = "yyyy/mm/dd"
Public Const MAX_ROWS As Long = 10000
こうしておくと:
- 展開時に「Configモジュールのここだけ変えてください」で済む
- コア処理のコードに触らなくていいから 事故が起きない
- LLMに「Configモジュールを参照する形で書いて」と指示すればOK
💡 Tips 5:初回セットアップもマクロ化する
「シートを作って、ヘッダーを入れて、列幅を調整して…」
この手順をマニュアルに書いても、誰かが必ず間違える。セットアップ自体もVBAにやらせる。
Sub InitialSetup()
Dim ws As Worksheet
' シート作成(なければ追加)
On Error Resume Next
Set ws = ThisWorkbook.Sheets(SHEET_NAME)
On Error GoTo 0
If ws Is Nothing Then
Set ws = ThisWorkbook.Sheets.Add
ws.Name = SHEET_NAME
End If
' ヘッダー設定
Dim headers As Variant
headers = Array("日付", "担当者", "内容", "金額", "ステータス")
Dim i As Long
For i = 0 To UBound(headers)
ws.Cells(1, i + 1).Value = headers(i)
Next
' スタイル適用
With ws.Range("A1:E1")
.Interior.Color = RGB(66, 133, 244)
.Font.Color = RGB(255, 255, 255)
.Font.Bold = True
End With
' 列幅調整
ws.Columns("A:E").ColumnWidth = 15
' ボタン配置
CreateButtons
MsgBox "✅ セットアップ完了!"
End Sub
配布先の人は ボタン1つで環境構築完了。

💡 Tips 6:エラーが出たとき、ユーザーが困らないようにする
VBAのエラーメッセージは、非エンジニアには意味不明。日本語でやさしく教えてあげる。
Sub ProcessFile()
On Error GoTo ErrorHandler
' メイン処理
' ...
MsgBox "✅ 処理が完了しました!"
Exit Sub
ErrorHandler:
MsgBox "⚠️ エラーが発生しました" & vbCrLf & vbCrLf & _
"原因:" & Err.Description & vbCrLf & vbCrLf & _
"対処法:" & vbCrLf & _
"1. シート名が「" & SHEET_NAME & "」になっているか確認" & vbCrLf & _
"2. データが入っているか確認" & vbCrLf & _
"3. 解決しない場合は管理者に連絡", _
vbExclamation, "エラー"
End Sub
💡 Tips 7:ヘルプをHTMLで同梱して、ボタンから開けるようにする
使い方マニュアルをPDFやWordで別に渡しても、誰も見ない。
ツールと同じフォルダにHTMLファイルを置いて、ボタンから開けるようにする。
Sub ShowHelp()
Dim helpPath As String
helpPath = ThisWorkbook.Path & "\help.html"
If Dir(helpPath) <> "" Then
Shell "cmd /c start """" """ & helpPath & """", vbHide
Else
MsgBox "ヘルプファイルが見つかりません。" & vbCrLf & _
"ツールと同じフォルダに help.html を置いてください。", _
vbExclamation
End If
End Sub
HTMLファイルはシンプルでOK。
<!DOCTYPE html>
<html lang="ja">
<body style="font-family: sans-serif; max-width: 600px; margin: 2rem auto;">
<h2>📖 使い方ガイド</h2>
<h3>1. 初回セットアップ</h3>
<p>「▶ 初回セットアップ」ボタンをクリック</p>
<h3>2. データ処理</h3>
<p>「▶ 実行する」ボタンをクリック → ファイルを選択</p>
<h3>3. うまくいかないとき</h3>
<p>シート名が正しいか確認してください</p>
</body>
</html>
ヘルプを更新したいときは HTMLファイルを差し替えるだけ。ツール本体を触る必要なし。
📋 配布チェックリスト
VBAツールを社内に配る前に、これを確認する。
- 🔗 マクロとデータが分離されているか(埋め込みではないか)
- 📂 モジュールが役割ごとに分割されているか
- ⚙️ 設定値がConfigモジュールに分離されているか
- 🔘 操作ボタンが配置されているか
- 🛠️ 初回セットアップがマクロ化されているか
- ⚠️ エラー時にユーザー向けメッセージが出るか
- 📖 ヘルプHTMLが同梱されているか
✅ まとめ
| Tips | やること |
|---|---|
| 📎→🔗 | Excelにマクロ埋め込まない。ツールとデータを分離 |
| 🔘 | ボタンもVBAで自動配置 |
| 📂 | モジュール名をちゃんとつける(ローマ字でもOK) |
| ⚙️ | 設定値をConfigモジュールに分離 |
| 🛠️ | セットアップもマクロ化 |
| ⚠️ | エラーメッセージは日本語で |
| 📖 | ヘルプはHTMLで同梱、ボタンから開く |
LLMにコードを書かせるのは簡単。でも 使ってもらえるツール にするには、こういう地味なところが大事。
配布を前提にした設計にしておくだけで、社内展開がめちゃくちゃ楽になります。