Excel工作表SelectionChange事件也是最常用的事件代碼之一,通俗的講工作表選中的單元格發生變化時,此事件將被激活。
SelectionChange事件的過程框架如下,其中參數Target是Range類型變量,代表工作表中被選中的單元格區域。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
' Your code
End Sub
需求如下:如下圖中的數據表,第一列爲月度,需要實現當選中表格中某個單元格時,與該行相同月份的表格區域設置黃色背景色,例如:圖中選中的爲D9單元格,該行月度爲2020/05
,第7行至第11行均爲相同的月度,設置黃色背景色。當選中其他月度的表格區域時,清楚當前的背景色,並設置新區域的背景色。
示例代碼如下:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim rngMth As Range, c As Range, rngTab As Range
Set rngTab = Range("A2:J46")
If Target.Count = 1 Then
If Not Intersect(Target, rngTab) Is Nothing Then
If Target.Interior.ColorIndex = 6 Then
Exit Sub
Else
rngTab.Interior.Pattern = xlNone
For Each c In Range([a2], Cells(Rows.Count, 1).End(xlUp))
If c.Value = Cells(Target.Row, 1).Value Then
If rngMth Is Nothing Then
Set rngMth = c
Else
Set rngMth = Union(rngMth, c)
End If
End If
Next c
If Not rngMth Is Nothing Then
rngMth.Resize(, rngTab.Columns.Count).Interior.ColorIndex = 6
End If
End If
End If
End If
End Sub
【代碼解析】
第3行代碼取得表格區域,不含表頭。
第4行代碼判斷選中的是單個單元格,才執行後續操作。
第5行代碼判斷激活單元格是否包含在表格區域中。
第6行代碼判斷激活單元格的背景色,如果已經是黃色,說明選中的單元格在着色區域中,無需處理。
第7行代碼退出事件過程。
第9行代碼清空表格區域的背景色。
第10~18行代碼循環遍歷第一列單元格。
第11行代碼判斷單元格中月度值是否與激活單元格所在行相同。如果相同,則將單元格合併到rngMth
對象變量中。
如果rngMth
對象變量爲空,則使用第13行代碼賦值,否則使用第15行代碼合併單元格區域。
第19行代碼判斷rngMth
對象變量是否爲非空。
第20行代碼設置具有相同月度值的行的背景色,rngMth
對象變量爲第一列相關單元格Range對象,使用Resize將該區域的列進行擴展,rngTab.Columns.Count
爲表格區域的列數。