评估方法不会产生预期结果

时间:2014-06-09 17:11:41

标签: vba excel-vba excel

在我的工作表中,第4列中的单元格包含公式。有时公式会返回一个数字,有时会返回字符串"数据!"。对于后一种结果,我希望字体颜色变为红色。以下事件处理程序代码失败:

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False

'font color red if error
If Target.Column = 4 Then
    If Target = "data!" Then
        Range("D" & Target.Row).Font.ColorIndex = 3
    Else
        Range("D" & Target.Row).Font.ColorIndex = 1
    End If
End If

Application.EnableEvents = True
End Sub

也许代码看到公式而不是公式返回的值,所以我添加了evaluate方法来对Target进行操作:

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False

'font color red if error
If Target.Column = 4 Then
    If Evaluate(Target) = "data!" Then
        Range("D" & Target.Row).Font.ColorIndex = 3
    Else
        Range("D" & Target.Row).Font.ColorIndex = 1
    End If
End If

Application.EnableEvents = True
End Sub

这也行不通。没有错误,只是没有字体颜色变化。有什么问题?

1 个答案:

答案 0 :(得分:1)

据我所知,Worksheet_Change的目标是单个单元格(您单击并编辑的单元格)。当我修改您的第一个代码示例以使用

If Target.Value = "data!" Then

它运作得很好。每当我输入"数据!"在第4列的单元格中,它会将字体颜色更改为红色。虽然细胞的值确实随公式而变化,但细胞本身并不被认为是变化的目标。 -event。

如果你想检查整个列并一次更新所有颜色 - 我知道有两个选项:

  • 条件格式

Here's有关如何实现条件格式的一些信息。还有this问题与使用VBA创建条件格式有关。

  • 使用按钮,计时器,计算或其他事件触发的宏。

例如,可以调用这个小方法为单元格着色。

Sub Main()

Dim r As Range

Set r = ThisWorkbook.Sheets(1).Range("D:D").SpecialCells(xlCellTypeFormulas)
r.Cells.Font.ColorIndex = 0
For Each Cell In r
    If Cell.Value = "data!" Then Cell.Font.ColorIndex = 3
Next

End Sub

编辑:只要工作表计算公式时调用Main方法,就可以添加

Private Sub Worksheet_Calculate()
Call Main
End Sub

到您要使用该功能的工作表的代码。每当公式计算时,这将自动更新范围的颜色,这应该是期望的效果。

HTH