マクロ専用設定シートの作成
「設定値を一か所に集約」「安全に読み書き」「表示は隠して保護」——初心者でも迷わず使えるテンプレートと例題で、実務で使える“設定シート”をゼロから作ります。
設定シートの考え方(運用のコツ)
- 役割分離: 処理のパラメータ(対象フォルダ、出力有無、色、パスワード等)を「設定シート」に集めると、コードを直さずに運用変更できます。
- 名前の例: シート名は「Settings」や「Control」など分かりやすく。VeryHidden+保護で誤操作を防ぎましょう。
- 命名規則: 取り出しやすいように「キー」「値」「説明」の3列構成が定番です。
ひな形の自動作成(初期セットアップ)
Sub SetupSettingsSheet()
Dim ws As Worksheet
'存在チェック→なければ作成
On Error Resume Next
Set ws = ThisWorkbook.Worksheets("Settings")
On Error GoTo 0
If ws Is Nothing Then
Set ws = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count))
ws.Name = "Settings"
End If
'初期レイアウト
With ws
.Range("A1").Value = "キー"
.Range("B1").Value = "値"
.Range("C1").Value = "説明"
.Range("A1:C1").Font.Bold = True
'サンプル設定
.Range("A2").Value = "OutputFolder": .Range("B2").Value = ThisWorkbook.Path: .Range("C2").Value = "出力フォルダのパス"
.Range("A3").Value = "EnableExport": .Range("B3").Value = True: .Range("C3").Value = "エクスポートの有効/無効(True/False)"
.Range("A4").Value = "AccentColor": .Range("B4").Value = "#0070C0": .Range("C4").Value = "テーマカラー(#RRGGBB)"
.Range("A5").Value = "Password": .Range("B5").Value = "secret": .Range("C5").Value = "操作用の簡易パスワード"
.Columns("A:C").AutoFit
End With
'データ検証(True/False のみ許可)
With ws.Range("B3").Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="TRUE,FALSE"
.IgnoreBlank = True
.InCellDropdown = True
End With
'保護&完全非表示(実運用では必要に応じて)
ws.Protect Password:="lock", AllowFiltering:=True
ws.Visible = xlSheetVeryHidden
MsgBox "Settingsシートを準備しました。"
End Sub
VB- ポイント:
- 検証の仕込み: True/Falseをプルダウンにして入力ミスを防ぐ。
- 保護+VeryHidden: 画面からの再表示を防いで誤編集を抑止。解除はVBAでのみ。
設定値の読み取り関数(キー指定で即取得)
Function GetSettingValue(key As String, Optional defaultValue As Variant) As Variant
Dim ws As Worksheet, last As Long, r As Long
On Error Resume Next
Set ws = ThisWorkbook.Worksheets("Settings")
On Error GoTo 0
If ws Is Nothing Then
GetSettingValue = defaultValue
Exit Function
End If
last = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
For r = 2 To last
If StrComp(CStr(ws.Cells(r, "A").Value), key, vbTextCompare) = 0 Then
GetSettingValue = ws.Cells(r, "B").Value
Exit Function
End If
Next
GetSettingValue = defaultValue
End Function
VB- ポイント:
- defaultValue: キーが見つからないときの初期値を用意しておけば、運用が堅くなります。
よくある型の取り出し(ブール/色/フォルダパス)
Function GetSettingBool(key As String, Optional defaultBool As Boolean = False) As Boolean
Dim v As Variant: v = GetSettingValue(key, defaultBool)
GetSettingBool = (UCase$(CStr(v)) = "TRUE" Or v = True)
End Function
Function RGBFromHex(hex As String) As Long
Dim s As String: s = Replace$(Trim$(hex), "#", "")
If Len(s) <> 6 Then RGBFromHex = RGB(0, 0, 0): Exit Function
RGBFromHex = RGB(CLng("&H" & Left$(s, 2)), CLng("&H" & Mid$(s, 3, 2)), CLng("&H" & Right$(s, 2)))
End Function
Function GetSettingColor(key As String, Optional defaultHex As String = "#0070C0") As Long
GetSettingColor = RGBFromHex(CStr(GetSettingValue(key, defaultHex)))
End Function
Function EnsureFolderPath(pathText As String) As String
Dim p As String: p = CStr(pathText)
If Right$(p, 1) <> "\" Then p = p & "\"
EnsureFolderPath = p
End Function
VB- ポイント:
- 型変換: 文字列設定を想定し、ブール・色・パスなど使いやすい形に変換。
- Hexカラー対応: 設定側は#RRGGBB形式で覚えやすく。
設定の書き込み(キーがなければ追加)
Sub SetSettingValue(key As String, value As Variant, Optional description As String = "")
Dim ws As Worksheet, last As Long, r As Long
On Error Resume Next
Set ws = ThisWorkbook.Worksheets("Settings")
On Error GoTo 0
If ws Is Nothing Then
SetupSettingsSheet
Set ws = ThisWorkbook.Worksheets("Settings")
'VeryHiddenのまま操作可能(表示は不要)
End If
last = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
For r = 2 To last
If StrComp(CStr(ws.Cells(r, "A").Value), key, vbTextCompare) = 0 Then
ws.Unprotect Password:="lock"
ws.Cells(r, "B").Value = value
If Len(description) > 0 Then ws.Cells(r, "C").Value = description
ws.Protect Password:="lock", AllowFiltering:=True
Exit Sub
End If
Next
'見つからなければ末尾に追加
ws.Unprotect Password:="lock"
ws.Cells(last + 1, "A").Value = key
ws.Cells(last + 1, "B").Value = value
ws.Cells(last + 1, "C").Value = description
ws.Columns("A:C").AutoFit
ws.Protect Password:="lock", AllowFiltering:=True
End Sub
VB- ポイント:
- 一時解除→再保護: 変更時の基本パターン。
- 柔軟追加: 運用中にキーを足していけます。
例題で練習:設定に応じて動作を切り替える
例題1:出力先フォルダとエクスポートON/OFF
Sub ExportCSV_IfEnabled()
Dim enabled As Boolean, folder As String
enabled = GetSettingBool("EnableExport", True)
folder = EnsureFolderPath(GetSettingValue("OutputFolder", ThisWorkbook.Path))
If Not enabled Then
MsgBox "エクスポートは無効です(SettingsのEnableExportを変更)。": Exit Sub
End If
'ここにエクスポート処理(例:アクティブシートをCSV)
ActiveSheet.Copy
With ActiveWorkbook
.SaveAs Filename:=folder & ActiveSheet.Name & ".csv", FileFormat:=xlCSV
.Close SaveChanges:=False
End With
MsgBox "CSVを出力しました → " & folder
End Sub
VB例題2:設定色をタブ色に適用
Sub ApplyAccentColorTabs()
Dim col As Long: col = GetSettingColor("AccentColor", "#0070C0")
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
If ws.Visible = xlSheetVisible Then ws.Tab.Color = col
Next
MsgBox "設定のアクセントカラーをタブに適用しました。"
End Sub
VB例題3:簡易パスワードで保護解除して更新→再保護
Sub UpdateWithPassword()
Dim pwd As String: pwd = CStr(GetSettingValue("Password", ""))
Dim inputPwd As String: inputPwd = InputBox("パスワードを入力してください")
If pwd <> "" And inputPwd <> pwd Then
MsgBox "パスワードが違います。": Exit Sub
End If
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("レポート")
On Error Resume Next: ws.Unprotect Password:=pwd: On Error GoTo 0
ws.Range("B2").Value = Date
ws.Range("B3").Value = Environ$("Username")
ws.Protect Password:=pwd, AllowFiltering:=True, AllowSorting:=True
MsgBox "レポートを更新して再保護しました。"
End Sub
VB実務の落とし穴と対策
- 表示から触られたくない:
- 対策: SettingsはVeryHidden+保護。編集したい時だけ一時解除。ボタンから開く補助マクロを用意しても良い。
- 型の揺れ(True/Falseや色表記):
- 対策: 取り出し関数でブール変換/Hex→RGB変換を必ず挟む。
- キー名の誤記:
- 対策: 参照側は既定値(default)を入れて耐性を持たせる。キー名は固定の英語+説明列で補足。
- 保護の戻し忘れ:
- 対策: 書き込み後に必ず再保護。失敗時も保護が戻るように構造化する。
- シートが存在しない:
- 対策: 読み取り・書き込みともに「なければSetup」を組み込んで自己修復する。
便利なおまけ:設定編集メニュー(一時表示→編集→再非表示)
Sub OpenSettingsForEdit()
Dim ws As Worksheet
On Error Resume Next
Set ws = ThisWorkbook.Worksheets("Settings")
On Error GoTo 0
If ws Is Nothing Then
SetupSettingsSheet
Set ws = ThisWorkbook.Worksheets("Settings")
End If
'一時表示して編集(保護解除→編集→閉じると再非表示のほうが安全)
ws.Visible = xlSheetVisible
ws.Unprotect Password:="lock"
ws.Activate
MsgBox "Settingsを編集してください。編集後に「CloseSettings」を実行。"
End Sub
Sub CloseSettings()
Dim ws As Worksheet
On Error Resume Next
Set ws = ThisWorkbook.Worksheets("Settings")
On Error GoTo 0
If Not ws Is Nothing Then
ws.Protect Password:="lock", AllowFiltering:=True
ws.Visible = xlSheetVeryHidden
MsgBox "Settingsを閉じました(保護&完全非表示)。"
End If
End Sub
VB