2012-08-08 125 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