5

我在引用 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)替换命名范围,它确实有效,所以它似乎取决于命名范围的传递方式。
任何想法,将不胜感激。

谢谢。

4

4 回答 4

5

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

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

如果不是相同的问题,我也遇到过类似的问题,这就是我解决它的方法:

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

因此, 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
于 2016-05-17T15:56:13.530 回答
0

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

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

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

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

于 2021-03-18T19:59:28.577 回答
-2

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

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”的变体都失败了!!!

于 2014-01-25T16:39:51.887 回答