Excel VBA 逆引き集 | シートの色変更

Excel VBA
スポンサーリンク

シートの色変更

「タブ色で見やすくする」「一括で色付け」「状況で色分け」——初心者でも迷わず使えるコードと安全テンプレートで、失敗しやすいポイントまでまとめます。シートのタブ色は Worksheet.Tab の Color/ColorIndex/ThemeColor で設定します。


基本:1枚のシートタブ色を変える/戻す

Sub SheetColor_Basic()
    'タブ色を赤に(RGB指定)
    ThisWorkbook.Worksheets("売上").Tab.Color = RGB(255, 0, 0)

    'タブ色を黄色に(ColorIndex指定:パレット番号)
    ThisWorkbook.Worksheets("在庫").Tab.ColorIndex = 6

    'タブ色をテーマ色に(Officeのテーマに追随)
    ThisWorkbook.Worksheets("顧客").Tab.ThemeColor = xlThemeColorAccent1

    'タブ色をなしに戻す(標準のグレー)
    ThisWorkbook.Worksheets("設定").Tab.ColorIndex = xlColorIndexNone
End Sub
VB
  • ポイント:
    • RGB: 細かい色指定に最適。
    • ColorIndex: 56色パレットの番号。環境で色の中身が変わる可能性あり。
    • ThemeColor: テーマ変更に追随したいときに便利。
    • 色なし: xlColorIndexNone で標準表示へ。

一括で色付け/クリア

Sub ColorAllSheets()
    Dim s As Object
    For Each s In ThisWorkbook.Sheets
        s.Tab.Color = RGB(0, 120, 215) 'Office系ブルー
    Next
End Sub

Sub ClearAllSheetColors()
    Dim s As Object
    For Each s In ThisWorkbook.Sheets
        s.Tab.ColorIndex = xlColorIndexNone
    Next
End Sub
VB
  • ポイント:
    • Sheets: グラフシートも含む。ワークシートだけならWorksheetsに変更。
    • クリア: 一度全色を「なし」に戻すと管理しやすい。

条件で色分け(名前・可視状態・保護状態)

Sub ColorByRules()
    Dim ws As Worksheet

    For Each ws In ThisWorkbook.Worksheets
        'トップページは緑
        If ws.Name = "トップ" Then
            ws.Tab.Color = RGB(0, 176, 80)
        '「_tmp」を含む一時系はグレー
        ElseIf InStr(1, ws.Name, "_tmp", vbTextCompare) > 0 Then
            ws.Tab.Color = RGB(191, 191, 191)
        'VeryHiddenは色なし(視認不要)
        ElseIf ws.Visible = xlSheetVeryHidden Then
            ws.Tab.ColorIndex = xlColorIndexNone
        '保護されているシートはオレンジ
        ElseIf ws.ProtectContents Then
            ws.Tab.Color = RGB(255, 192, 0)
        'それ以外は青系
        Else
            ws.Tab.Color = RGB(0, 112, 192)
        End If
    Next
End Sub
VB
  • ポイント:
    • 揺れに強い: 部分一致で命名規則に合わせて色分け。
    • 可視状態・保護状態: 実務で役立つ判断軸。

安全テンプレート:色名→RGB に変換して使う

Function ColorFromName(name As String) As Long
    Select Case LCase$(Trim$(name))
        Case "red", "赤":            ColorFromName = RGB(255, 0, 0)
        Case "green", "緑":          ColorFromName = RGB(0, 176, 80)
        Case "blue", "青":           ColorFromName = RGB(0, 112, 192)
        Case "orange", "オレンジ":   ColorFromName = RGB(255, 192, 0)
        Case "gray", "灰":           ColorFromName = RGB(191, 191, 191)
        Case "purple", "紫":         ColorFromName = RGB(112, 48, 160)
        Case Else:                   ColorFromName = RGB(0, 120, 215) 'デフォルト
    End Select
End Function

Sub ColorByControlList()
    'Control!A:B に「シート名」「色名」を書いておく
    Dim ctrl As Worksheet, last As Long, r As Long, nm As String, cn As String, ws As Worksheet
    Set ctrl = ThisWorkbook.Worksheets("Control")
    last = ctrl.Cells(ctrl.Rows.Count, "A").End(xlUp).Row

    For r = 2 To last
        nm = CStr(ctrl.Cells(r, "A").Value)
        cn = CStr(ctrl.Cells(r, "B").Value)
        On Error Resume Next
        Set ws = ThisWorkbook.Worksheets(nm)
        On Error GoTo 0
        If Not ws Is Nothing Then
            ws.Tab.Color = ColorFromName(cn)
        End If
        Set ws = Nothing
    Next

    MsgBox "Controlの指定に従って色を設定しました。"
End Sub
VB
  • ポイント:
    • 管理しやすい: 一覧シートから色指定すれば運用負担が減る。
    • 未知の色名: 未定義は既定色にフォールバック。

応用:16進カラーコード(#RRGGBB)対応

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

Sub ColorFromHexList()
    'Control!A:B に「シート名」「#RRGGBB」を書く
    Dim ctrl As Worksheet, last As Long, r As Long, ws As Worksheet
    Set ctrl = ThisWorkbook.Worksheets("Control")
    last = ctrl.Cells(ctrl.Rows.Count, "A").End(xlUp).Row

    For r = 2 To last
        On Error Resume Next
        Set ws = ThisWorkbook.Worksheets(CStr(ctrl.Cells(r, "A").Value))
        On Error GoTo 0
        If Not ws Is Nothing Then
            ws.Tab.Color = RGBFromHex(CStr(ctrl.Cells(r, "B").Value))
        End If
        Set ws = Nothing
    Next
End Sub
VB
  • ポイント:
    • Web色対応: デザイン指定をそのまま使える。
    • 入力検証: 不正コードは黒にフォールバック(必要に応じて変更可)。

例題で練習

例題1:重要度で信号カラー(赤・黄・緑)

Sub TrafficLightTabs()
    '重要:赤、注意:黄、通常:緑
    ThisWorkbook.Worksheets("重要").Tab.Color = RGB(255, 0, 0)
    ThisWorkbook.Worksheets("注意").Tab.Color = RGB(255, 192, 0)
    ThisWorkbook.Worksheets("通常").Tab.Color = RGB(0, 176, 80)
End Sub
VB
  • ポイント:
    • 視認性抜群: ひと目で優先度が分かる。

例題2:週報を交互色で見やすく

Sub AlternateWeeklyColors()
    Dim i As Long, ws As Worksheet, n As Long
    n = ThisWorkbook.Worksheets.Count
    For i = 1 To n
        Set ws = ThisWorkbook.Worksheets(i)
        If Left$(ws.Name, 3) = "週報" Then
            If i Mod 2 = 0 Then
                ws.Tab.Color = RGB(0, 112, 192) '青
            Else
                ws.Tab.Color = RGB(191, 191, 191) 'グレー
            End If
        End If
    Next
End Sub
VB
  • ポイント:
    • 交互色: 並びの識別がしやすくなる。

例題3:可視ワークシートだけテーマ色で統一

Sub ThemeColorVisibleSheets()
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        If ws.Visible = xlSheetVisible Then
            ws.Tab.ThemeColor = xlThemeColorAccent2
        End If
    Next
End Sub
VB
  • ポイント:
    • テーマ整合: 会社の配色ルールに合わせやすい。

実務の落とし穴と対策

  • 色が違って見える問題:
    • 対策: ColorIndexは環境のパレットに依存。意図通りの色にしたいならRGBを使う。
  • テーマ変更で色ズレ:
    • 対策: 変化を許容したいならThemeColor、固定色にしたいならRGB。
  • 非表示・VeryHiddenの扱い:
    • 対策: 非表示でも色は設定できるが、整理目的なら「色なし」に戻すほうが分かりやすい。
  • 対象の混同(Sheets/Worksheets):
    • 対策: グラフも含めるならSheets、ワークシート限定ならWorksheetsに統一。
  • 命名や存在チェックを忘れる:
    • 対策: 操作前に対象シートの存在確認(TryGetで安全取得)を癖にする。

次の一歩(小課題)

  • 課題1: Controlシートに「シート名」「#RRGGBB」を並べ、指定色で一括設定。
  • 課題2: 「売上」「在庫」「顧客」を赤・黄・緑で固定、その他はテーマ色で統一。
  • 課題3: 保護中はオレンジ、解除中は青に自動切替するトグルマクロを作成。

タイトルとURLをコピーしました