ねらい:業務Excelに最適な「命名規則」で迷いゼロ・保守ラク
業務Excelは、人とマクロが長く使います。名前が統一されていないと「どれが何か分からない」「修正で壊れる」原因に。命名規則を決めて守るだけで、検索・再利用・引き継ぎが一気に楽になります。初心者でもすぐ使える「実務向けルール」と、貼って使えるテンプレを詳しく解説します。
基本原則(短く強く)
- 目的: 意味が即わかり、誤操作を防ぎ、変更に強い命名をする。
- 指針:
- 短く・一貫: 英数+アンダースコア/ハイフンで統一。略語は固定。
- 接頭辞で役割を明示: シート/範囲/テーブル/名前定義/モジュール/プロシージャ/変数…
- 日本語は見出しに、コードは英数: ユーザー向け表示は日本語、コードで参照する識別子は英数。
- 深掘り(重要):
- 検索性が命: “売上”を探すとき、シート名・テーブル名・モジュール名が揃っていると迷わない。
- 変更に強い構造: 列順や文言が変わっても、識別子は不変(Configで参照)にする。
命名マップ(何にどう付けるか一目で)
| 対象 | 推奨パターン | 例 | 用途 | 禁則・注意 |
|---|---|---|---|---|
| シート | 区分_役割 | Data_Input, Report_Monthly | 機能と役割を明示 | 記号/全角スペース禁止 |
| テーブル(ListObject) | tbl名詞 | tblSales, tblEmployees | データ集合 | 列名は英数・語義一貫 |
| 名前定義(Name) | nm_機能 | nm_OutputFolder, nm_Threshold | 設定・参照範囲 | ワークブックスコープ推奨 |
| モジュール | Mod役割 | ModIO, ModConfig | 責務分離 | 1責務1モジュール |
| プロシージャ | Run_処理名 / Get/Set/Write… | Run_SalesExport, GetConfigString | 動作が分かる動詞 | 入口はRun_で統一 |
| 変数 | 意味+型ヒント | salesTotal As Double | 中身が見える名前 | tmp, xは避ける |
| 定数 | 全大文字_区切り | DATE_FMT, MAX_ROWS | 変更禁止の値 | モジュール先頭に集約 |
| ファイル名 | ベース_日付 | SalesReport_yyyy-mm-dd.xlsx | 世代管理 | 禁則記号除去 |
| バージョン名 | vMajor.Minor.Patch | v1.2.0 | 配布管理 | 先頭コメントに記載 |
- 深掘り(重要):
- tbl/nm/Mod/Run 接頭辞で瞬間理解: “tblSales”を見た瞬間にテーブルと分かる、これが現場で効く。
- 名前定義は設定の要: パスやしきい値は nm_ で統一すると、コード変更ゼロで差し替え可。
シート・テーブル・名前定義の実務ルール
- シート名:
- 形式: 区分_役割(例:Data_Input, Data_Master, Report_Monthly)
- 環境依存を避ける: 記号/日本語混在は検索性低下、英数+アンダースコアで統一。
- テーブル名(ListObject):
- 形式: tbl名詞(tblSales, tblEmployees)
- 列名: 英数で意味を明確(EmpNo, EmpName, Dept, HireDate)。
- 名前定義(Name):
- 形式: nm_機能(nm_OutputFolder, nm_Threshold)
- スコープ: Workbookスコープ原則。シート限定名は保守が難しい。
' 例:名前定義から設定を読む(命名規則nm_)
Function ReadNmString(ByVal nm As String) As String
ReadNmString = ThisWorkbook.Names(nm).RefersToRange.Value
End Function
Sub Example_UseNames()
Dim folder As String: folder = ReadNmString("nm_OutputFolder")
Dim th As Double: th = CDbl(ReadNmString("nm_Threshold"))
MsgBox "Folder=" & folder & " / Threshold=" & th
End Sub
VB- 深掘り(重要):
- コードは識別子固定+値は名前定義: 仕様変更はシートで完結。配布後でも安全に運用変更可能。
モジュール・プロシージャ・変数・定数の命名
- モジュール: Mod役割(ModApp, ModConfig, ModIO, ModLogic, ModService, ModUI)
- プロシージャ:
- 入口: Run_処理名(Run_SalesExport, Run_EmployeeImport)
- ヘルパー: 動詞+目的語(ReadInput, WriteOutput, ValidatePhone)
- 変数: 名詞+意味+型ヒント(salesTotal As Double, lastRow As Long, empList As Collection)
- 定数: 全大文字+アンダースコア(DATE_FMT, DEFAULT_FOLDER)
' ModService: 売上エクスポート入口
Public Sub Run_SalesExport()
Dim ws As Worksheet: Set ws = Worksheets("Data_Sales")
Dim lo As ListObject: Set lo = ws.ListObjects("tblSales")
Dim arr As Variant: arr = lo.DataBodyRange.Value
Dim path As String: path = BuildExportPath("SalesReport", "xlsx") ' 動詞+目的語
WriteWorkbookCopy path ' 動詞+目的語
MsgBox "エクスポート完了: " & path
End Sub
' ModIO/ModUtil
Public Const DATE_FMT As String = "yyyy-mm-dd_HHNNSS"
Public Function BuildExportPath(ByVal base As String, ByVal ext As String) As String
Dim folder As String: folder = ReadNmString("nm_OutputFolder")
BuildExportPath = folder & base & "_" & Format(Now, DATE_FMT) & "." & ext
End Function
Public Sub WriteWorkbookCopy(ByVal path As String)
ThisWorkbook.SaveCopyAs path
End Sub
VB- 深掘り(重要):
- 入口Run_で揃えるとUI連携が楽: ボタン割当一覧が視認しやすい。
- 動詞+目的語で“何をするか”が即わかる: Read/Write/Validate/Build/Findが基本動詞。
一覧・略語の標準化(辞書を配布)
- 略語固定(例):
- 部門: Dept/部署 → Dept
- 社員番号: EmpNo
- 入社日: HireDate
- 売上: Sales
- 数量: Qty
- 金額: Amount
- 閾値: Threshold
- コラム命名(英数): EmpNo, EmpName, Dept, HireDate, Phone, Score, SalesDate, Qty, Amount
' 列名の比較は英数固定の規則で(日本語見出しは表示用)
Dim expected As Variant
expected = Array("EmpNo", "EmpName", "Dept", "HireDate", "Phone", "Score")
VB- 深掘り(重要):
- 略語をチームで固定し「辞書配布」: 混在を防ぐ最大の施策。
- 列名は英数、ヘッダー表示は日本語: 開発・運用双方の利便性を両立。
品質ルールと導入チェック(壊れないための規約)
- 導入ルール:
- シート: 区分_役割で英数/アンダースコア統一。
- テーブル: tbl+名詞。列名は英数固定辞書から選ぶ。
- 名前定義: nm_+機能。設定は名前定義経由に。
- モジュール: Mod+役割。1責務1モジュール。
- 入口プロシージャ: Run_+処理名で揃える。
- 変数: 意味+型ヒント。tmp/x禁止。
- 定数: 全大文字+アンダースコア。先頭で集約。
- 自動検査テンプレ(簡易):
Sub Audit_Naming()
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
If Not ws.Name Like "*_*" Then Debug.Print "WARN Sheet名に _ がありません: "; ws.Name
If ws.Name Like "* *" Then Debug.Print "NG Sheet名にスペース: "; ws.Name
Next
Dim lo As ListObject
For Each ws In ThisWorkbook.Worksheets
For Each lo In ws.ListObjects
If Not lo.Name Like "tbl*" Then Debug.Print "NG Table名がtbl開始でない: "; lo.Name
Next
Next
Dim nm As Name
For Each nm In ThisWorkbook.Names
If Not nm.Name Like "nm_*" Then Debug.Print "NG Name定義がnm_開始でない: "; nm.Name
Next
MsgBox "命名チェック完了(Immediateに結果)"
End Sub
VB- 深掘り(重要):
- 規約は“守られる仕掛け”まで作る: 目視では綻びが出る。自動チェックで習慣化。
例題で練習(貼って試せる)
- 例1: シートを Data_Input/Report_Monthly に改名、テーブルを tblSales に統一。
- 例2: 名前定義 nm_OutputFolder/nm_Threshold を作成し、コードから参照。
- 例3: 入口を Run_SalesExport に揃え、ボタン割当を一覧化。
- 例4: Audit_Naming を実行して、規約違反を洗い出し・修正。
実務の落とし穴と対策(ここが肝)
- 落とし穴1:日本語混在で検索が効かない
- 対策: コード識別子は英数固定。日本語は表示ヘッダーのみに。
- 落とし穴2:略語が人によって違う
- 対策: チーム辞書を配布。EmpNo/Dept/HireDate など標準化。
- 落とし穴3:入口がバラバラ
- 対策: Run_で統一。UI・マクロ一覧が分かりやすくなる。
- 落とし穴4:設定がコードに埋め込み
- 対策: 名前定義 nm_ 経由で参照。変更はシートで完結。
- 落とし穴5:規約が形骸化
- 対策: Audit_Naming の実行を運用に組み込み、違反を継続是正。
スターター手順(最短導入)
- 命名辞書を作成(略語・列名の標準一覧)。
- シート/テーブル/名前定義の接頭辞規約(区分役割/tbl/nm)を布告。
- モジュール・入口の命名統一(Mod/Run_)。
- Audit_Naming を配布して、導入チェックを定例化。
- Config+名前定義を併用し、設定のコード直書きを撤廃。
