使用Excel VBA事件检测合并/取消合并单元格?

我试图find一种方法来检测即时使用合并(或不合并)单元格。 更改事件触发也不会改变select。 我尝试了其他一些,但似乎没有事件触发合并 – 我觉得奇怪。 我的代码在更改事件当前更改Interior.Color基于单元格的内容。 如果合并单元格然后取消合并,则颜色会保留在选区内。 但是我希望它只在文本格中保留颜色,然后回到xlNone上。 无论如何把这个关掉?

Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column < 3 Then Exit Sub If Target.Row <> 3 Then Exit Sub Select Case Target.Text Case "Blackberry Serrano", "BS" Target.Interior.Color = RGB(120, 33, 111) [...more of the same...] Case "" Target.Interior.Color = xlNone End Select End Sub 

据我所知,没有办法检测单元格上的格式变化。 合并被视为格式更改,因此无法通过VBA事件进行检测。 但是,我做了一些挖掘,发现这个有趣的列表:

  • 更改单元格的格式不会触发Change事件(如预期的那样)。 但是复制和粘贴格式确实会触发Change事件。 select首页=>编辑=>清除=>清除格式命令也触发事件。
  • 即使合并单元格的某些内容在过程中被删除,合并单元格也不会触发Change事件。
  • 添加,编辑或删除单元格注释不会触发Change事件。
  • 即使单元格是空的,按下Delete键也会生成一个事件。
  • 通过使用Excel命令更改的单元格可能会或可能不会触发更改事件。 例如,sorting范围或使用Goal Seeker更改单元格不会触发事件。 但使用拼写检查器呢。
  • 如果您的VBA过程更改单元格的内容,它触发更改事件。

Excel 2013用VBA进行功率编程 John Walkenbach 来源

所以基本上,如果有人正在合并或不合并单元格,就没有办法通过VBA事件来检测。

我发现了我自己的一种解决方法,让事情发生,我想要的。 不知道是否有一个更有效率/更快捷的方式来做到这一点,但至less在工作中没有任何错误。 它在select改变之后触发,比我想要的要慢,但VBA就是这样。

对于工作表:

 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Call EnforceFormatting(Target) End Sub 

在一个模块中:

 Public oldR As Range Public newR As Range Sub EnforceFormatting(ByVal Target As Range) Set newR = Target If oldR Is Nothing Then Set oldR = newR Exit Sub End If If oldR.Column < 3 Then Set oldR = newR Exit Sub End If If oldR.Row <> 3 And oldR.Row <> 7 And oldR.Row <> 11 Then Set oldR = newR Exit Sub End If If oldR.Rows.Count > 1 Then Set oldR = newR Exit Sub End If If oldR.Count > 1 Then Application.ScreenUpdating = False Dim c As Range For Each c In oldR c.Value = c.Text Next c Application.ScreenUpdating = True End If Set oldR = newR End Sub