您需要的是一种检测单元格格式变化的方法。似乎没有任何事件会在格式更改时触发。请参阅
如何检测单元格格式的变化?
我将描述一种解决方法,几乎是一步一步的。它不是一个按键一个按键,所以你可能需要用谷歌搜索一下,这取决于你的背景知识。
描述不短,请仔细阅读。
你必须:
- 检测选择的变化(有一个事件)。
- 询问您的源单元格的颜色。
- 必要时采取行动。
转到 Visual Basic 编辑器 (VBE) 并在三个模块中添加代码:
- 一个标准模块(比如,Module1)。您必须先插入模块。
- 本工作簿。
- 表 2。
在模块 1 中:
Public prev_sel As Range
Public wssrc As Worksheet, wstrg As Worksheet
Public ssrc As String, strg As String
Public rngsrc As Range, rngtrg As Range
Sub copy_color(rngs As Range, rngt As Range)
Dim csrc As Long
csrc = rngs.Interior.Color
If (csrc = vbBlue) Then
rngt.Interior.Color = vbBlue
End If
End Sub
Sub copy_color2(rngs As Range, rngt As Range)
If (TypeName(prev_sel) = "Range") Then
Dim pss As String
pss = prev_sel.Parent.Name
If (pss = ssrc) Then
Dim ints As Range
Set ints = Application.Intersect(rngs, prev_sel)
If (Not (ints Is Nothing)) Then
Call copy_color(rngs, rngt)
End If
End If
End If
End Sub
在本工作簿中:
Private Sub Workbook_Open()
ssrc = "Sheet2"
strg = "Sheet1"
Set wssrc = Worksheets(ssrc)
Set wstrg = Worksheets(strg)
Set rngsrc = wssrc.Range("A1")
Set rngtrg = wstrg.Range("A1")
Call copy_color(rngsrc, rngtrg)
If (TypeName(Selection) = "Range") Then
Set prev_sel = Selection
Else
Set prev_sel = Nothing
End If
End Sub
在表 2 中:
Private Sub Worksheet_Deactivate()
Call copy_color(rngsrc, rngtrg)
If (TypeName(Selection) = "Range") Then
Set prev_sel = Selection
Else
Set prev_sel = Nothing
End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Call copy_color2(rngsrc, rngtrg)
If (TypeName(Target) = "Range") Then
Set prev_sel = Target
End If
End Sub
我将很快编辑解释。不过仔细阅读,还是很容易理解的。
笔记:
如果源单元格颜色从其他颜色变为其他颜色,则此代码不起作用vbBlue
。您没有为此操作指定任何内容。实际上,您的规范不够详细,无法涵盖所有可能的情况。
可能存在此代码失败的情况(我猜极不可能)。例如,如果通过其他 VBA 代码更改颜色,而不选择/取消选择单元格。
这个想法是在尽可能多的相关事件之后检查是否需要采取行动。我在这里检测Workbook_Open
, Worksheet_Deactivate
, Worksheet_SelectionChange
. 您可以使用合适的 s 添加其他事件Sub
,例如Workbook_BeforeClose
, Workbook_BeforeSave
。所有这些都是替代不存在的更改单元格格式事件的一种方式。
我喜欢pnuts 的答案(尽管我没有时间测试它)。但是目前的一个提供了另一种所不具备的灵活性。可能有一些情况(取决于你需要做什么)它不会被覆盖。
还有其他可能的位置组合来定位变量声明和其他代码,基本上执行相同的操作。