将参数添加到工作表事件

时间:2015-07-09 20:52:54

标签: excel vba excel-vba event-handling worksheet-function

我找到了一个非常适合突出显示与所选单元格对应的整行的宏(无论您选择哪个单元格,宏运行,所有行都突出显示)。这个当前的迭代有一些缺点,我似乎无法找到一种方法来制定参数,我希望将突出显示限制为特定的行数。有什么想法吗?

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
    Const cnNUMCOLS As Long = 512
    Const cnHIGHLIGHTCOLOR As Long = 6  'default lt. yellow
    Static rOld As Range
    Static nColorIndices(1 To cnNUMCOLS) As Long
    Dim i As Long


    If Not rOld Is Nothing Then 'Restore color indices
        With rOld.Cells
            If .Row = ActiveCell.Row Then Exit Sub 'same row, don't restore
            For i = 1 To cnNUMCOLS
                .Item(i).Interior.ColorIndex = nColorIndices(i)
               Next i
        End With
    End If
    Set rOld = Cells(ActiveCell.Row, 1).Resize(1, cnNUMCOLS)
    With rOld
        For i = 1 To cnNUMCOLS
            nColorIndices(i) = .Item(i).Interior.ColorIndex
        Next i
        .Interior.ColorIndex = cnHIGHLIGHTCOLOR
    End With

End Sub

1 个答案:

答案 0 :(得分:1)

试试这个:

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
    Const cnNUMCOLS As Long = 512
    Const cnHIGHLIGHTCOLOR As Long = 6  'default lt. yellow
    Static rOld As Range
    Static nColorIndices(1 To cnNUMCOLS) As Long
    Dim i As Long, bClear as Boolean, bInRange as Boolean

    bInRange = Not Application.Intersect(Me.Range("11:54"), Target) Is Nothing
    bClear = Not Application.Intersect(Me.Range("A6"), Target) Is Nothing

    'exit if selection is not in the first ten rows or A6
    If Not (bClear Or bInRange) Then Exit Sub

    If Not rOld Is Nothing Then 'Restore color indices
        With rOld.Cells
            If .Row = ActiveCell.Row Then Exit Sub 'same row, don't restore
            For i = 1 To cnNUMCOLS
                .Item(i).Interior.ColorIndex = nColorIndices(i)
               Next i
        End With
    End If

    If Not bInRange Then
        Set rOld = Nothing 
        Exit Sub  ' Exit if we're in A6
    End If

    Set rOld = Cells(ActiveCell.Row, 1).Resize(1, cnNUMCOLS)
    With rOld
        For i = 1 To cnNUMCOLS
            nColorIndices(i) = .Item(i).Interior.ColorIndex
        Next i
        .Interior.ColorIndex = cnHIGHLIGHTCOLOR
    End With

End Sub

注意:您的代码假设只选择了一个单元格 - 如果用户在> 1行中选择多个单元格,则行为可能不符合预期