参考VBA中的动态命名范围

时间:2012-08-08 16:12:44

标签: excel vba excel-vba excel-2010

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

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

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

    Sub UpdateSummary()
    Dim Cell As Range
    Dim rngF As Range
    Set rngF = Nothing

    ' Step through each cell in data range
    For Each Cell In Worksheets("Aspect").Range("A_Date")
        ' search Summary range for current cell value
        Set rngF = Worksheets("Summary").Range("Sum_Date").Find(Cell.Value) // Does not work
        If rngF Is Nothing Then
            ' Add date to Summary
        End If
        Set rngF = Nothing
    Next Cell
    End Sub 

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

    Application-defined or object-defined error

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

感谢。

4 个答案:

答案 0 :(得分:3)

错误几乎肯定是因为Excel无法找到引用名为Summary的工作表上的范围的命名范围Sum_Date。最常见的原因是

  1. Sum_Date指的是摘要以外的工作表。检查Sum_Date的RefersTo属性,确保没有拼写错误。
  2. 没有命名范围Sum_Date,也就是说,它在VBA代码中拼写错误。检查名称管理器中命名范围的拼写。
  3. Sum_Date的RefersTo公式中存在错误。听起来你已经证实情况并非如此。

答案 1 :(得分:0)

我有类似的问题,如果不是同一个问题&这是我如何解决它:

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

因此,工作表("摘要")。范​​围(" 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

答案 2 :(得分:0)

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

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

Measure-Object

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

答案 3 :(得分:-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

值得一试你不觉得! 如果不是使用变体,而是使用以下内容:Dim Nm as Name:Set Nm = Names(“OhDear”),这不起作用。使用'Nm'的任何变化都失败!!!