如何仅突出显示最后编辑的行?

Posted

技术标签:

【中文标题】如何仅突出显示最后编辑的行?【英文标题】:How to highlight only the last edited row? 【发布时间】:2019-07-11 17:32:56 【问题描述】:

我有一个 Excel 中的客户数据表,可以使用 VBA 用户表单添加/编辑。因此,我想突出显示刚刚添加/编辑的行。这是我第一次使用 VBA,所以我搜索并找到了来自 here 的代码:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    If Target.Value <> "" Then
        Target.Interior.ColorIndex = 6
    End If
End Sub

效果很好,但以前的编辑/附加组件的亮点仍然存在。我只想突出显示最后一个。

【问题讨论】:

【参考方案1】:

使用变量。当您更改颜色时,将范围存储在其中。下次从该范围中删除颜色。

这是你正在尝试的吗?

Dim prevRng As Range

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Dim aCell As Range

    If Not prevRng Is Nothing Then prevRng.Interior.ColorIndex = xlNone
    Set prevRng = Target

    For Each aCell In Target
        If aCell.Value <> "" Then aCell.Interior.ColorIndex = 6
    Next aCell
End Sub

这将处理评论中提到的@Pᴇʜ 的多个单元格。

【讨论】:

你需要一个Target 的循环来遍历它的单元格。它可能是一个范围而不是单个单元格,然后 Target.Value &lt;&gt; "" 失败。 真的……会合并……片刻 请问您为什么要添加If 声明?我的意思是循环甚至会在Target 上运行一个单元格。这是性能上的差异吗?还是我错过了什么? 我在办公室,所以目前无法为此投入任何时间。今晚晚些时候会再看这篇文章 @SiddharthRout 如果只是需要处理一个特定的表/工作表,那么您可以将Workbook_SheetChange 切换到特定的Worksheet_Change 事件,您的解决方案将适合(除了节省我描述的效果)。这会将问题简化为一个更简单的问题。【参考方案2】:

这里有一些代码可以为你工作:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

'Removing old conditional formatting if it exists already
Conditions = ActiveSheet.Cells.FormatConditions.Count
For i = 1 to Conditions
    If ActiveSheet.Cells.FormatConditions(i).Type = 2 Then
        If ActiveSheet.Cells.FormatConditions(i).Formula1 = "=1" Then ActiveSheet.Cells.FormatConditions(i).Delete
    End If
Next i

'Adding new conditional formatting rule to the edited range
Target.EntireRow.FormatConditions.Add Type:=xlExpression, Formula1:="=1"
Target.EntireRow.FormatConditions(1).Interior.ColorIndex = 6

End Sub

目前它将突出显示所有工作表中所有最后编辑的行。不确定这是否是您想要的。

当新范围发生变化时,它会保持工作表中的彩色单元格完好无损。 它将保持其他条件格式规则不变。 它会突出显示最后编辑的范围,即使该范围已被清除!

【讨论】:

要么向后运行循环 (For i = Conditions To 1 Step -1),要么在 If 语句中包含 Exit For - 否则,当 "=1" 条件不是最后一个时,您将收到错误一。 @Chronocidal,感谢您的提醒。我已经用另一个 if 语句更新了代码,因为向后迭代和 Exit For 策略都起作用并产生了另一个错误。任何理论为什么 And 语句也不起作用?

以上是关于如何仅突出显示最后编辑的行?的主要内容,如果未能解决你的问题,请参考以下文章

如何避免以特定符号开头的行中字符串的文本突出显示[java]

单击jqgrid网格时如何仅突出显示单元格

仅突出显示 UILabel 中的文本

QTextBrowser:如何突出显示单击的行

突出显示 JTextArea 中的一个特定行/行

如何使 emacs 突出显示超过 80 个字符的行?