2018年03月14日

Excel マトリックスの行と列を強調表示する

マトリックス(表)のセルを選択すると、行と列の色を変えて強調表示するVBAです。

※強調表示したままブックを保存すると、解除されなくなります。
保存操作が発生しないような参照専用のドキュメントでの使用を想定してます。
'マトリックスの行と列を強調表示する
Option Explicit

'以前の強調表示の位置を保持する変数
Dim prevCol As Integer
Dim prevRow As Integer

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'強調する列のヘッダ(シートの行番号)(範囲は"C4:L4")
Const rowHdNum As Integer = 4
'強調する行のヘッダ(シートの列番号)(範囲は"B5:B14")
Const colHdNum As Integer = 2
'表の範囲(10×10の表)
Const strTargetRange = "C5:L14"

'ヘッダの強調表示色
Dim markHeadColor As Long
markHeadColor = vbYellow
'行・列の強調表示色
Dim markLineColor As Long
markLineColor = RGB(&HFF, &HFF, &HD0)
'選択されたセルを保持
Dim curCell As Range
Set curCell = Application.Selection

'表の範囲を特定
Dim targetRange As Range
Set targetRange = Range(strTargetRange)

'以前の強調を戻す
Dim prevCell As Range
'表の列
If prevCol > 0 Then
Set prevCell = Cells(rowHdNum, prevCol)
'列のヘッダ
If prevCell.Interior.Color = markHeadColor Then
prevCell.Interior.ColorIndex = xlNone
End If
prevCell.Font.Bold = False
'列
targetRange.Columns(prevCol - colHdNum).Interior.Color = xlNone
End If
'表の行
If prevRow > 0 Then
'行のヘッダ
Set prevCell = Cells(prevRow, colHdNum)
If prevCell.Interior.Color = markHeadColor Then
prevCell.Interior.ColorIndex = xlNone
End If
prevCell.Font.Bold = False
'行
targetRange.Rows(prevRow - rowHdNum).Interior.Color = xlNone
End If

'表の範囲外は扱わない
If curCell.Column < targetRange.Column Or _
targetRange.Column + targetRange.Columns.Count - 1 < curCell.Column Then
prevCol = 0
prevRow = 0
Exit Sub
End If
If curCell.Row < targetRange.Row Or _
targetRange.Row + targetRange.Rows.Count - 1 < curCell.Row Then
prevCol = 0
prevRow = 0
Exit Sub
End If

'強調表示
Dim markCell As Range
'列のヘッダ
Set markCell = Cells(rowHdNum, curCell.Column)
If markCell.Interior.ColorIndex = xlNone Then
markCell.Interior.Color = markHeadColor
End If
markCell.Font.Bold = True
'列
targetRange.Columns(curCell.Column - colHdNum).Interior.Color = markLineColor
prevCol = curCell.Column

'行のヘッダ
Set markCell = Cells(curCell.Row, colHdNum)
If markCell.Interior.ColorIndex = xlNone Then
markCell.Interior.Color = markHeadColor
End If
markCell.Font.Bold = True
'行
targetRange.Rows(curCell.Row - rowHdNum).Interior.Color = markLineColor
prevRow = curCell.Row

End Sub
タグ:Excel VBA
posted by Hiro at 22:56| Comment(0) | プログラム
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: