【问题标题】:Using Excel VBA Events to detect merging/unmerging of cells?使用 Excel VBA 事件来检测单元格的合并/取消合并?
【发布时间】:2016-04-17 14:03:57
【问题描述】:

我正在尝试找到一种方法来检测合并(或取消合并)单元格的立即使用情况。更改事件也不会触发 selectionchange。我尝试了其他一些,但似乎没有事件在合并时触发——我觉得这很奇怪。我在 change 事件中的代码当前会根据单元格的内容更改 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 excel merge


    【解决方案1】:

    我找到了自己的工作方式来实现我想要的事情。不确定是否有更有效/更快的方法来做到这一点,但到目前为止它至少可以正常工作,没有任何错误。它在选择更改后触发,这比我想要的要慢,但 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
    

    【讨论】:

      【解决方案2】:

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

      • 更改单元格的格式不会触发 Change 事件(如预期的那样)。但是复制和粘贴格式确实会触发 更改事件。选择主页=>编辑=>清除=>清除格式 命令也会触发事件。
      • 合并单元格不会触发 Change 事件,即使某些合并单元格的内容在此过程中被删除。
      • 添加、编辑或删除单元格注释不会触发 Change 事件。
      • 即使单元格一开始是空的,按 Delete 键也会生成一个事件。
      • 使用 Excel 命令更改的单元格可能会也可能不会触发 Change 事件。例如,对范围进行排序或使用目标 Seeker 更改单元格不会触发该事件。但是使用 拼写检查器可以。
      • 如果您的 VBA 过程更改了单元格的内容,它确实会触发 Change 事件。

      来自 Excel 2013 Power Programming with VBA by John Walkenbach Source

      所以基本上,如果有人只是合并或取消合并单元格,则无法通过 VBA 事件检测到。

      【讨论】:

      • 感谢您找到该来源。我基本上就是在寻找那个。尽管我坚信不应该将合并视为格式化的事情并且绝对应该在更改事件上注册,但我认为没有触发任何事件。我想我只是希望有人找到某种疯狂的解决方法。
      猜你喜欢
      • 2014-03-31
      • 1970-01-01
      • 2021-05-10
      • 1970-01-01
      • 2013-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-14
      相关资源
      最近更新 更多