【问题标题】:Use named range to trigger Worksheet_Change event causes 1004 error使用命名范围触发 Worksheet_Change 事件导致 1004 错误
【发布时间】:2021-02-10 17:58:10
【问题描述】:

我有一个 excel 工作簿,我正在运行一些代码来从几张纸中的一个单元格中删除多余的空格。当我在单元格“E4”中输入内容时,它会删除“”的每个实例并将其替换为“”。这按预期工作。

我试图通过使用命名范围来使它适用于不止一张纸。在工作表中,我创建了一个命名范围“ConfigurationInput”,其范围为工作表。

以下代码在其中一张表中,它按预期运行:

Private Sub Worksheet_Change(ByVal Target As Range)
    
    If Not Intersect(Target, Range("E4")) Is Nothing Then
        Call RemoveSpaces(Range("E4"))
    End If

End Sub

这会调用位于模块中的以下 Sub:

Sub RemoveSpaces(RngRemove)

    Dim rng As Range
    Set rng = RngRemove
    
    rng = WorksheetFunction.Substitute(rng, " ", "")

End Sub

我试图用命名范围“ConfigurationInput”替换“E4”,我收到以下错误,导致 Excel 崩溃:

有人有什么建议吗?我尝试简化为单个单元格并使用 .Address 但这也不起作用:

If Target.Address = Range("ConfigurationInput").Address Then

【问题讨论】:

  • Sub RemoveSpaces(RngRemove as Range)
  • @ScottCraner - 似乎在 Excel 365 中,不能再在多个工作表上使用相同的工作表范围名称,但每个名称必须是唯一的。你有同样的行为吗?如果是这样,那将是一个巨大的变化,似乎没有任何地方记录在案。
  • 我没有这个限制。我只是将不同工作表上的两个范围命名为相同的名称。 @大本
  • @ScottCraner - 我问的很好。我重新启动了 Excel,现在不再有这个问题了。
  • @ScottCraner:感谢您的建议。我测试了Sub RemoveSpaces(RngRemove as Range),但它没有用。我不得不用 Application.EnableEvents = FalseApplication.EnableEvents = True 包装 IF 语句

标签: excel vba runtime-error named-ranges


【解决方案1】:

我终于明白了:

Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
    If Not Intersect(Target, Range("ConfigurationInput")) Is Nothing Then
        Call FixConfig(Range("ConfigurationInput"))
    End If
Application.EnableEvents = True
End Sub

我不得不用Application.EnableEvents = False Application.EnableEvents = True 包装代码

【讨论】:

  • 这意味着您正在使用工作簿范围的范围。
  • 这很奇怪 - 它是一个工作表范围的范围,但它的行为就像一个工作簿范围的范围。我确实首先将它创建为工作簿范围的范围,然后将其删除以重新创建工作表范围的范围。也许有一些片段在后台持续存在?
  • 也许吧。请注意,您应该包含一个错误处理程序,以便在发生错误时,Application.EnableEvents = True 仍然会被执行。
  • 感谢您的建议!我不熟悉错误处理程序 - 您能否详细说明如何实现错误处理程序?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-13
  • 2018-01-04
  • 1970-01-01
  • 1970-01-01
  • 2012-10-09
相关资源
最近更新 更多