突出显示修改后的单元格
Highlighting modified cell
我试图通过宏突出显示从 "a" 修改为 "b" 的列中的单元格(应排除从空白到 "a" 的更改)。谁能帮帮我?
Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
Dim KeyCells As Range
Set KeyCells = Range("A:A")
If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
ActiveCell.Select
Application.Run ("color")
End If
End Sub
Sub color()
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.color = 255
.TintAndShade = 0
.PatternTintAndShade = 0
End With
End Sub
以上代码还突出显示了已编辑单元格下方的单元格。
您可以使用 SelectionChange
事件获取 before 更改的值,然后像这样添加您的条件。
请注意,如果打开工作簿时在目标范围内选择了一个单元格,并且您更改了值而不先更改选择,则此代码将提前退出,因为 ValBeforeChange
的值尚未设置然而。
您可以通过多种方式解决这个问题。您可以向 Workbook_Open
事件添加一些内容到 运行 SelectionChange
例程 或 您可以使 ValBeforeChange
成为全局变量并设置它最初在 Workbook_Open
事件中,或者您可以将突出显示代码重构为具有 "before" 和 "after" 属性的 class,在打开时实例化一个 class 对象并关闭时清理它。
以下是添加条件检查的方法:
modified from "a" to "b" (should exclude the changes from blank to
"a")
Dim ValBeforeChange as String
Private Sub Worksheet_SelectionChange(ByVal Target as Range)
ValBeforeChange = Target.Value
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
If Not Len(ValBeforeChange) > 0 Then Exit Sub
If Target.Value = ValBeforeChange Then Exit Sub
Dim KeyCells As Range
Set KeyCells = Range("A:A")
If Application.Intersect(KeyCells, Target) Is Nothing Then Exit Sub
Highlight Target
End Sub
Sub Highlight(ByRef Target as Range)
With Target.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 255
.TintAndShade = 0
.PatternTintAndShade = 0
End With
End Sub
其实我不想添加新的答案。因为这个答案是 CBRF23 的答案的一个小修改。根据他们的意见,我决定添加新的答案,因为我认为这个问题没有得到正确的答案。
我的回答有什么新内容。没什么特别的。但我对代码进行了格式化,我添加了空白值检查并删除了突出显示。
在这里,您可以看到不同的代码。
Dim ValBeforeChange As String
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
ValBeforeChange = Target.Value
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
If Not Len(ValBeforeChange) > 0 Then
Exit Sub
End If
If Target.Value = ValBeforeChange Then
Exit Sub
End If
If Application.Intersect(Range("A:A"), Target) Is Nothing Then
Exit Sub
End If
If Target.Value <> "" Then
Highlight Target, vbRed
Else
Highlight Target, xlNone
End If
End Sub
Sub Highlight(ByRef Target As Range, ByVal colorValue As Variant)
With Target.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.color = colorValue
.TintAndShade = 0
.PatternTintAndShade = 0
End With
End Sub
Dim ValBeforeChange As String
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
ValBeforeChange = Target.Value
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
If ValBeforeChange ="" Then
Exit Sub
End If
IF ValBeforeChange <> Target.Value Then
If Application.Intersect(Range("A:A"), Target) Is Nothing Then
Application.Run("Color")
End If
End If
End Sub
这段代码运行良好,谢谢大家的帮助:)
我试图通过宏突出显示从 "a" 修改为 "b" 的列中的单元格(应排除从空白到 "a" 的更改)。谁能帮帮我?
Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
Dim KeyCells As Range
Set KeyCells = Range("A:A")
If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
ActiveCell.Select
Application.Run ("color")
End If
End Sub
Sub color()
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.color = 255
.TintAndShade = 0
.PatternTintAndShade = 0
End With
End Sub
以上代码还突出显示了已编辑单元格下方的单元格。
您可以使用 SelectionChange
事件获取 before 更改的值,然后像这样添加您的条件。
请注意,如果打开工作簿时在目标范围内选择了一个单元格,并且您更改了值而不先更改选择,则此代码将提前退出,因为 ValBeforeChange
的值尚未设置然而。
您可以通过多种方式解决这个问题。您可以向 Workbook_Open
事件添加一些内容到 运行 SelectionChange
例程 或 您可以使 ValBeforeChange
成为全局变量并设置它最初在 Workbook_Open
事件中,或者您可以将突出显示代码重构为具有 "before" 和 "after" 属性的 class,在打开时实例化一个 class 对象并关闭时清理它。
以下是添加条件检查的方法:
modified from "a" to "b" (should exclude the changes from blank to "a")
Dim ValBeforeChange as String
Private Sub Worksheet_SelectionChange(ByVal Target as Range)
ValBeforeChange = Target.Value
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
If Not Len(ValBeforeChange) > 0 Then Exit Sub
If Target.Value = ValBeforeChange Then Exit Sub
Dim KeyCells As Range
Set KeyCells = Range("A:A")
If Application.Intersect(KeyCells, Target) Is Nothing Then Exit Sub
Highlight Target
End Sub
Sub Highlight(ByRef Target as Range)
With Target.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 255
.TintAndShade = 0
.PatternTintAndShade = 0
End With
End Sub
其实我不想添加新的答案。因为这个答案是 CBRF23 的答案的一个小修改。根据他们的意见,我决定添加新的答案,因为我认为这个问题没有得到正确的答案。
我的回答有什么新内容。没什么特别的。但我对代码进行了格式化,我添加了空白值检查并删除了突出显示。
在这里,您可以看到不同的代码。
Dim ValBeforeChange As String
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
ValBeforeChange = Target.Value
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
If Not Len(ValBeforeChange) > 0 Then
Exit Sub
End If
If Target.Value = ValBeforeChange Then
Exit Sub
End If
If Application.Intersect(Range("A:A"), Target) Is Nothing Then
Exit Sub
End If
If Target.Value <> "" Then
Highlight Target, vbRed
Else
Highlight Target, xlNone
End If
End Sub
Sub Highlight(ByRef Target As Range, ByVal colorValue As Variant)
With Target.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.color = colorValue
.TintAndShade = 0
.PatternTintAndShade = 0
End With
End Sub
Dim ValBeforeChange As String
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
ValBeforeChange = Target.Value
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
If ValBeforeChange ="" Then
Exit Sub
End If
IF ValBeforeChange <> Target.Value Then
If Application.Intersect(Range("A:A"), Target) Is Nothing Then
Application.Run("Color")
End If
End If
End Sub
这段代码运行良好,谢谢大家的帮助:)