【问题标题】:Excel VBA Click Cell to Fire Macro - Not working with Merged CellsExcel VBA 单击单元格以触发宏 - 不适用于合并的单元格
【发布时间】:2017-10-24 22:28:23
【问题描述】:

我正在使用下面的代码在单击单元格时触发宏。有问题的单元格是标题“Mitch's Macro”,但它位于合并的单元格 B5 到 J5 上。我曾尝试将此合并范围命名为 MITCH,但单击时仍无法运行...有什么想法吗?提前谢谢!

Option Explicit

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Selection.Count = 1 Then
        If Not Intersect(Target, Range("MITCH")) Is Nothing Then
            MsgBox ("Hello World")
        End If
    End If
End Sub

【问题讨论】:

  • 当您选择合并单元格时,您选择了合并范围内的所有单元格 - 因此您的代码将跳过 INTERSECT 部分,因为 Selection.Count=1
  • 嗨,达伦!太感谢了。通过将其设置为 Selection.Count = 9(合并的单元格数),我能够解决问题!感谢您的帮助!
  • 您可以删除Selection.Count 位并依赖Intersect 行。

标签: excel vba


【解决方案1】:

问题是 Selection.Count = 1。 合并的单元格有多个单元格,因此一旦您选择合并区域中的任何单元格,代码就不会被执行。

请试一试...

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Not Intersect(Target, Range("MITCH")) Is Nothing Then
        MsgBox ("Hello World")
    End If
End Sub

编辑:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim rng As Range
    Set rng = Range("MITCH")
    If Target.CountLarge > rng.Cells.Count Then Exit Sub
    If Not Intersect(Target, rng) Is Nothing And Target.Cells(1).Address = rng.Cells(1).Address Then
        MsgBox ("Hello World")
    End If
End Sub

【讨论】:

  • @mitchmitch24 不客气!很高兴您的问题得到解决。 :)
  • 请注意,当单击 Range("Mitch") 时,以及进行包括该范围的任何选择时(尝试 ctrl+a),这将按预期运行代码 - 这可能不会成为期望的行为。在那种情况下,If Target.Address = Range("MITCH").Address Then ... 可能是首选?
  • 您应该能够将整个IF INTERSECT(..... 行替换为@Greedo 在他的评论中提供的代码。
  • @mitchmitch24 啊,抱歉,应该是 Target(1,1).Address - Target 返回整个选定范围,而 Range("MITCH") 只返回 TL 单元格,所以 Target (1,1 ) 抓住所选内容的左上角(或者如果你想使用普通手写,实际上是Target.Cells(1,1).Address
  • 另外你确定你没有在代码中的任何地方禁用事件吗?如果是这样,请按 Ctrl+G 打开即时窗口并在其中键入 ?Application.EnableEvents 看看你得到了什么?一个真假。如果你得到 false,输入 Application.EnableEvents = True 并且你的代码应该可以正常工作。
【解决方案2】:

经过一番思考,我意识到大多数答案都有一些缺点,我认为这就是我们真正追求的:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim rng As Range
    Set rng = Range("MITCH")
    If Target.Address = rng.MergeArea.Address Then 'check if what's selected matches the named range entirely
        MsgBox ("Hello World")
    End If
End Sub

因为这会检查您选择的单元格是否完美地映射到命名区域 - 特别是命名范围的 MergeArea

Intersect 匹配只检查选择是否包含命名范围

通过 TL 单元匹配意味着 任何选择与命名范围相同的 TL 也将返回正数。 e.

此代码仅在区域相同时返回正数,即仅选择合并的单元格。

【讨论】:

  • 谢谢 Greedo - 这太棒了!
【解决方案3】:

如果你已经命名了范围,你可以使用下面的代码

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim tName As String
    On Error Resume Next
    tName = Target.Name.Name
    On Error GoTo 0
    If Len(tName) > 0 Then
        If tName = "MITCH" Then
            MsgBox ("Hello World")
        End If
    End If
End Sub

【讨论】:

    猜你喜欢
    • 2021-05-10
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 2018-07-16
    • 2013-11-23
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    相关资源
    最近更新 更多