和風スパゲティのレシピ

日本語でコーディングするExcelVBA

1行おきに背景色を設定して縞模様にする

テーブル形式の表データに縞模様を付けるコードを紹介します。

背景色を縞模様に設定した表


通常テーブルを挿入したり条件付き書式で対応する方が簡単ですが、
それらの方法が取れない場合は以下のマクロで対応してください。

表の範囲を取得できる場合 - 表エリア.Rows

CurrentRegionAutoFilter.Rangeなどが利用でき、
表の範囲を簡単に取得できる場合はこちらのコードを使用してください。

Sub 表エリアに縞模様の背景色を設定する()
    
    Dim1カラー As Long: 第1カラー = RGB(255, 255, 255)
    Dim2カラー As Long: 第2カラー = RGB(221, 235, 247)
    
    Dim Range表エリア As Range
    Set Range表エリア = Worksheets("○○").AutoFilter.Range
    
    Dim R As Long
    For R = 1 To Range表エリア.Rows.Count
        
        If WorksheetFunction.IsOdd(R) Then
            Range表エリア.Rows(R).Interior.Color =1カラー
        Else
            Range表エリア.Rows(R).Interior.Color =2カラー
        End If
        
    Next
    
End Sub

 
行をひとつずつFor文でループし、
偶数/奇数を判定して第1/2カラーで着色するコードです。


着色エリアは「表エリア.Rows(R)」で取得しています。


RowsプロパティはWorksheetだけでなくRangeからも取得でき、
その場合は「親Rangeの第○行部分」を取得してくれます。

この仕様は今回の処理にピッタリで、

Range表エリア.Rows(R).Interior.Color

これだけで表の第○行の背景色を設定していくことができます。


この「第○行」はシートの行番号ではなくRange内の行番号のため、For文を

For R = 1 To Range表エリア.Rows.Count

こう書けるのも便利ですね。


なお、着色を「無色(背景なし)」に設定したい場合は、

Range表エリア.Rows(R).Interior.Color = RGB(255, 255, 255)

これでは「白色」になってしまうため、RGB値では指定できません。

背景色をなしにしたい場合は、以下のいずれかのコードに差し替えてください。

Range表エリア.Rows(R).Interior.ColorIndex = 0
Range表エリア.Rows(R).Interior.Pattern = xlNone

 

着色する列の範囲を指定する場合 - Intersect

「A列~G列内を着色する」など、列範囲を指定して着色する場合は、
Intersectメソッドを用いて以下のコードで実行します。

Sub 指定列に縞模様の背景色を設定する()
    
    Dim1カラー As Long: 第1カラー = RGB(255, 255, 255)
    Dim2カラー As Long: 第2カラー = RGB(221, 235, 247)
    
    Dim ws着色シート As Worksheet
    Set ws着色シート = Worksheets("○○")
    
    Dim 最終行 As Long
    最終行 = ws着色シート.UsedRange.Rows.Count + ws着色シート.UsedRange.Row - 1
    
    Dim R As Long
    For R = 4 To 最終行
        
        If WorksheetFunction.IsOdd(R) Then
            Intersect(ws着色シート.Rows(R) _
                        , ws着色シート.Columns("A:G")).Interior.Color =1カラー
        Else
            Intersect(ws着色シート.Rows(R) _
                        , ws着色シート.Columns("A:G")).Interior.Color =2カラー
        End If
        
    Next
    
End Sub

 
Intersectメソッドは複数のセル範囲の重複部分を取得するメソッドです。

例えばIntersect(Range("A1:C3"), Range("B2:D4"))は、
両者の重複するB2:C3セルを取得します。


今回のように「ある列範囲の第○行部分」を取得するのに便利なメソッドで、
Intersect(Rows(○), Columns("△:□"))という記述で取得できます。


エリア内を行ごとに分割して処理するのにIntersectはとても便利ですので、
知らなかった方はこの機会に覚えておきましょう。

汎用関数化

この処理をよく行う方は、以下のように汎用関数にしておくと便利です。

' 縞模様に着色
Sub セル範囲を行ごとに縞模様に着色する(着色エリア As Range _
    , Optional1カラー As Long = -1, Optional2カラー As Long = -1)
    
    Dim R As Long
    For R = 1 To 着色エリア.Rows.Count
        
        ' ◇ 奇数行
        If R Mod 2 = 1 Then
            If1カラー = -1 Then
                着色エリア.Rows(R).Interior.ColorIndex = 0
            Else
                着色エリア.Rows(R).Interior.Color =1カラー
            End If
        
        ' ◇ 偶数行
        Else
            If2カラー = -1 Then
                着色エリア.Rows(R).Interior.ColorIndex = 0
            Else
                着色エリア.Rows(R).Interior.Color =2カラー
            End If
        End If
    Next
    
End Sub
' 使用例
Call セル範囲を行ごとに縞模様に着色する(Worksheets("○○").AutoFilter.Range _
    , ,RGB(221, 235, 247))

RGB値を渡すとその色に着色しますが、
「省略した場合(-1)は背景なしにする」
という機能も持たせました。


この汎用関数を用意しておけば、
使用例のように今回の処理を1行で実行できるようになります。


このように、「簡単だけど書くのが面倒なコード」は、
関数化が簡単な割にメリットが大きいです。

汎用関数集を作っている方は、ぜひそのメンバーに加えてあげてください。


汎用関数集の作り方・使い方についてはこちらをどうぞ。
www.limecode.jp