首页 > 解决方案 > 选择时更改单元格填充颜色,取消选择时更改原始颜色

问题描述

我有一个 Excel 2010 工作表和以下要求:

  1. 当一个单元格被选中时,它的填充颜色必须改变以表明它被选中,并在另一个单元格被选中时恢复到原来的颜色。使用下面的代码,单元格将恢复为白色,即使它在被选中之前可能是粉红色的。
  2. 如果用户保存文件,我不希望将所选单元格的颜色保存为文件的一部分(例如,使用下面的代码,如果我选择一个单元格,保存,关闭并重新打开文件,该单元格甚至具有该颜色虽然它没有被选中)。
  3. 代码必须在受保护的工作表上工作
  4. 该代码必须适用于合并的单元格

这是我的代码:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Static xLastRng As Range
On Error Resume Next
Target.Interior.ColorIndex = 6
xLastRng.Interior.ColorIndex = xlColorIndexNone
Set xLastRng = Target

End Sub

标签: excelvba

解决方案


这是一个有趣的任务!这将需要几个步骤:

1)添加一个标准模块(例如Module1)并创建两个公共变量:

Public g_lngEXISTINGCOL        As Long
Public g_rngPREVIOUSTARGET     As Excel.Range

2)回到您的工作表事件,您需要使用以下代码:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim rngTarget               As Excel.Range

    On Error Resume Next
        Set rngTarget = Application.Intersect(Me.UsedRange, Target)
    On Error GoTo 0

    If Not rngTarget Is Nothing Then
        If rngTarget.Cells.Count = 1 Then
            With Target
                If Not g_rngPREVIOUSTARGET Is Nothing Then
                    If g_lngEXISTINGCOL = 16777215 Then
                        g_rngPREVIOUSTARGET.Interior.ColorIndex = 0
                    Else
                        g_rngPREVIOUSTARGET.Interior.Color = g_lngEXISTINGCOL
                    End If
                End If
                g_lngEXISTINGCOL = .Interior.Color
                Set g_rngPREVIOUSTARGET = Target
                .Interior.ColorIndex = 6
            End With
        End If
    End If
End Sub

3)为了在保存工作簿之前恢复原来的内部颜色,您需要双击“ThisWorkbook”并添加BeforeSave事件:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    If Not g_rngPREVIOUSTARGET Is Nothing Then
        g_rngPREVIOUSTARGET.Interior.Color = g_lngEXISTINGCOL
    End If
End Sub

希望能帮助到你!


推荐阅读