【问题标题】:Referring to Dynamic Named Ranges in VBA在 VBA 中引用动态命名范围
【发布时间】:2012-08-08 16:12:43
【问题描述】:

我在引用 VBA 中的动态名称范围时遇到了麻烦。
我的范围定义为

 =OFFSET(Sheet!$B$2,0,0,COUNTA(Sheet!$B:$B)-1,1)

我的代码应该在一个范围内搜索另一个范围内的所有条目,目的是添加任何缺失的条目。到目前为止我有

子 UpdateSummary() 将单元格调暗为范围 将 rngF 调暗为范围 设置 rngF = 无 ' 遍历数据范围内的每个单元格 对于 Worksheets("Aspect").Range("A_Date") 中的每个单元格 ' 搜索当前单元格值的摘要范围 Set rngF = Worksheets("Summary").Range("Sum_Date").Find(Cell.Value) // 不起作用 如果 rngF 什么都不是,那么 ' 将日期添加到摘要 万一 设置 rngF = 无 下一个单元格 结束子

For 循环似乎工作正常。但是,使用 .Find 方法会给我一条错误消息。

 应用程序定义或对象定义的错误

如果我将命名范围替换为特定范围 ($B$2:$B$5000),它确实有效,因此这似乎取决于命名范围的传递方式。
任何想法将不胜感激。

谢谢。

【问题讨论】:

  • Tr 用实际工作表限定您的所有Range 引用。任何不合格的Range 都将引用活动工作表,因此如果您引用的范围不在该工作表上,您将遇到问题。
  • 谢谢,虽然它似乎没有帮助。我已经更新了上面的代码以反映更改,但结果仍然相同。
  • 失败时Cell的值是多少?

标签: vba excel excel-2010


【解决方案1】:

这个错误几乎肯定是因为 Excel 找不到一个命名范围 Sum_Date,它引用了名为 Summary 的工作表上的一个范围。最常见的原因是

  1. Sum_Date 指的是除摘要之外的工作表。检查 Sum_Date 的 RefersTo 属性,确保没有拼写错误。
  2. 没有命名范围 Sum_Date,也就是说,它在 VBA 代码中拼写错误。在名称管理器中检查命名范围的拼写。
  3. Sum_Date 的 RefersTo 公式有错误。听起来您已经确认不是这种情况。

【讨论】:

  • Ach,原来是我的 RefersTo 公式中的错误。我很确定它们很好,因为我一直在使用宏来创建它们。忘了我稍微调整了宏,这在我最近的命名范围中引入了一个错误。谢谢
【解决方案2】:

我遇到过类似的问题,如果不是相同的问题,我是这样解决的:

我首先意识到我用来创建命名范围的方法,使用名称管理器,我的命名范围有一个工作簿的范围。这很重要,因为它不属于工作表,因此不会在那里找到。

所以,Worksheets("Summary").Range("Sum_Date") 对我不起作用。

由于我的范围属于工作簿,因此我能够找到的方法是使用 ActiveWorkbook.Names("Sum_Date")

对我来说,我用它从我在很多地方使用的命名范围中删除公式。巨大的优势是命名范围仅更新一次,而不是为调用范围的每个单元格位置调用公式。巨大的时延差异!

Public last_Selection As String

Private Sub Worksheet_Change(ByVal Target As Range)
'excel data change detection

If Range(last_Selection).Column = 2 Then
    'Disable events, so this only executes once
    Application.EnableEvents = False

    'This can be done with a complex formula in a cell, 
    'but this is easily understood
    Range("B1").End(xlDown).Select
    ActiveWorkbook.Names("last_Entry").Value = ActiveCell.Row

    'Re-enable so this routine will execute on the next change
    Application.EnableEvents = True
End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    'constantly store the last cell to know which one was previously edited
    last_Selection = Target.Address
End Sub

【讨论】:

    【解决方案3】:

    我知道这是一个非常古老的线程,但我今天遇到了同样的问题,我一直在寻找解决方案。所以也许这会对某人有所帮助。

    =OFFSET(...) 公式定义的命名“范围”实际上是一个命名公式,因此在 VBA 中您必须先评估它才能获得范围。例如:

    Set rgNamedRange = Worksheets("Summary").Evaluate("Sum_Date")
    

    感谢来自 mrexcel.com 的一个名叫“shg”的人,他让我走上了正轨。 :)

    【讨论】:

      【解决方案4】:

      我已经对此进行了几天的试验,最终我想出了以下内容。它可能不是最有效的,但它确实对我有用!

      The named range of "OhDear" was set up in the normal way
      
      Dim vItem As Variant
      Set vItem = Names("OhDear")
      Debug.Print vItem.Name
      

      你不觉得值得一试! 如果不使用变体,而是使用类似以下内容的变体,这将不起作用:将 Nm 作为名称:设置 Nm = Names("OhDear")。任何使用“Nm”的变体都失败了!!!

      【讨论】:

        猜你喜欢
        • 2019-11-25
        • 1970-01-01
        • 2016-12-11
        • 1970-01-01
        • 1970-01-01
        • 2013-01-29
        • 1970-01-01
        • 2017-10-10
        • 2021-10-01
        相关资源
        最近更新 更多