2012-08-08 72 views
3

我在引用VBA中的动态名称范围时遇到了麻烦。
我的范围被定义为引用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),所以它似乎是下降到命名的范围是如何被传递。
任何想法,将不胜感激。

谢谢。

+0

Tr将所有'Range'引用与实际工作表相关联。任何不合格的'Range'都会引用活动工作表,因此如果您引用的范围不在该工作表上,则会遇到问题。 – 2012-08-08 16:26:36

+0

谢谢,虽然它似乎没有帮助。我已经更新了上面的代码以反映更改,但结果仍然相同。 – Michael 2012-08-08 16:44:26

+0

'Cell'失败时的价值是什么? – 2012-08-08 17:32:09

回答

3

错误几乎肯定是因为Excel无法找到名为范围Sum_Date,该范围指向名为Summary的工作表上的一个范围。最常见的原因是

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

Ach,原来这是我的RefersTo公式中的一个错误。我确信他们没事,因为我一直在用宏来创建它们。忘记了我微调了一下,在我最近的命名范围中引入了一个错误。谢谢 – Michael 2012-08-09 08:30:32

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

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