首页 > 解决方案 > 以单击另一个单元格为条件突出显示单元格

问题描述

我有有效的 VBA 代码,但似乎不是最佳的。当单击 N 列中的单元格时,代码应更改 H 列和 I 列中相关单元格中文本的颜色。

例如,单击单元格 N5 时,单元格 H5 和 I5 中的文本应变为白色。未单击时,它们将恢复正常颜色。

代码似乎不是最优的,因为 I 列的变化落后于 H 列的变化。

我想要一种让两者都立即改变的方法。

(如果您可以使单元格更改颜色并立即变为粗体,则奖励积分,具有像颜色一样的约束,一旦取消选择单元格,粗体就会消失)。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  Dim r As Range

  Intersect(Columns("H"), ActiveSheet.UsedRange).Font.Color = vbBlack
  Set r = Intersect(Range("N:N"), Target)
  If r Is Nothing Then Exit Sub
  Cells(r.Row, "H").Font.Color = vbWhite

  Intersect(Columns("I"), ActiveSheet.UsedRange).Font.Color = vbBlack
  Set r = Intersect(Range("N:N"), Target)
  If r Is Nothing Then Exit Sub
  Cells(r.Row, "I").Font.Color = vbWhite

End Sub

请注意,这是我第一次编写 VBA,因此是业余爱好者。

标签: excelvbaconditionalhighlight

解决方案


您不需要分别处理每一列...

编辑:添加粗体和多个单元格

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim r As Range, c As Range

    Set r = Intersect(Me.Range("N:N"), Target)
    '? what to do if user selects multiple cells ?
    'E.g. - exit if user has >100 cells selected (possibly whole column)
    If r Is Nothing Or Target.Cells.CountLarge > 100 Then Exit Sub

    Application.ScreenUpdating = False

    HighlightIt Application.Intersect(Me.Range("H:I"), Me.UsedRange), False

    For Each c In r.Cells
        HighlightIt Me.Cells(c.Row, "H").Resize(1, 2)
    Next c

    Application.ScreenUpdating = False
End Sub

'utility sub for highlighting/unhighlighting
Sub HighlightIt(rng As Range, Optional hilite As Boolean = True)
    With rng
        .Font.Color = IIf(hilite, vbWhite, vbBlack)
        .Font.Bold = hilite
    End With
End Sub

如果用户选择多个单元格(甚至整列),总是值得思考会发生什么。稳健地处理这个问题有时是一个挑战,这取决于你在他们这样做时想要发生什么。


推荐阅读