【问题标题】:"Compile Error: ambiguous name detected: Worksheet_Change" notification“编译错误:检测到不明确的名称:Worksheet_Change”通知
【发布时间】:2019-09-13 09:05:28
【问题描述】:

我从 Internet 检索到一个有用的 VBA 命令,它允许我更改 Excel 中的任意单元格,该单元格充当我的数据透视表的过滤器。当我尝试在同一张工作表上重复使用相同的命令但使用不同的过滤器时,我收到“编译错误:检测到不明确的名称:Worksheet_Change”通知并且代码停止工作......我试图将“End Sub”更改为“ Exit Sub" 不起作用,我希望有人能在这里指出正确的方向。

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Target.Address = Range("D2").Address Then Exit Sub
    Dim PT As PivotTable
    Dim ptItem As PivotItem
    On Error Resume Next
    For Each PT In Worksheets("Tier Comps").PivotTables
        With PT.PivotFields("Product")
            If .EnableMultiplePageItems = True Then
                .ClearAllFilters
            End If
            Set ptItem = .PivotItems(Target.Value)
            If Not ptItem Is Nothing Then
                .CurrentPage = Target.Value
            End If
        End With
    Next
Exit Sub
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Target.Address = Range("D3").Address Then Exit Sub
    Dim PT As PivotTable
    Dim ptItem As PivotItem
    On Error Resume Next
    For Each PT In Worksheets("Tier Comps").PivotTables
        With PT.PivotFields("Country Tier")
            If .EnableMultiplePageItems = True Then
                .ClearAllFilters
            End If
            Set ptItem = .PivotItems(Target.Value)
            If Not ptItem Is Nothing Then
                .CurrentPage = Target.Value
            End If
        End With
    Next
End Sub

希望有两个单独的单元格为同一张表上的一个数据透视表修改两个单独的过滤器。

【问题讨论】:

  • 你有两个同名的潜艇Private Sub Worksheet_Change(ByVal Target As Range)你不能有那个
  • 我之前遇到过类似的问题,奇怪的是有一个非常简单的解决方案 - 在 VBA 中,您只需指定具有数据透视表过滤器的单元格是您想要的值,它会自动更新桌子;即从字面上命名范围并说出什么值。
  • 克里斯,如果您想同时处理两个单元格,即 D2 和 D3,那么您可以在一个 Worksheet_Change 事件中完成。您不需要两个单独的潜艇,而且也不需要相同的名称:)
  • @SiddharthRout,请问 - 我该怎么做?当我说菜鸟时,我的意思是我没有 VBA 知识......只需搜索谷歌
  • 查看THIS 您可以使用If Not Intersect(Target, Range("D2")) Is Nothing Then,如该链接所示,在ElseIf 中对D3 执行相同操作:) 试一试。如果遇到困难,请回帖。

标签: excel vba


【解决方案1】:

请仔细阅读 --> https://stackoverflow.com/help/minimal-reproducible-example

在编写 MCVE 的过程中,最好的部分之一是在编写问题的过程中的很多时间,当您剥离更多代码以找到问题时,您将自己解决问题。

这是一个简化的答案,用您的实际代码修改MsgBox 部分。

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("D2")) Is Nothing Then
       MsgBox "Cell D2 Change Event"
    End If
    If Not Intersect(Target, Range("D3")) Is Nothing Then
       MsgBox "Cell D3 Change Event"
    End If
Exit Sub

另外,为了完整起见。问题是你不能有两个同名的潜艇。我遇到的另一个要注意的问题是不要将模块命名为与子相同的名称。我通常添加一个_。例如模块 = Test_Sub 然后Private Sub TestSub()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-12
    • 2013-01-22
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2014-04-17
    • 1970-01-01
    • 2016-11-12
    相关资源
    最近更新 更多