2016-04-11 55 views
0

運行VBA代碼允許我檢測到在表中應用過濾器會創建一個範圍名稱,該名稱不會出現在名稱管理器中(範圍名稱或者僅與表頭或整個表關聯) 。有什麼方法可以知道爲什麼會發生這種情況和/或預防它的方法?這只是一個Excel故障?範圍名稱不在名稱管理器

,導致我試圖運行錯誤的VBA代碼的部分是以下幾點:

For Each Rng In ActiveWorkbook.Names 
    Set Rng2 = Range(Rng) 
    If Not Intersect(Rng2, Range(rng1.Offset(1, 0), rng1.End(xlDown)).EntireRow) Is Nothing Then ActiveWorkbook.Names(Rng.Name).Delete 
Next Rng 

當我調試,我發現我的RNG(這是一個名稱的對象,方式)指向我從未創建的範圍(我知道這是因爲它所在的表單中沒有其他範圍名稱,我從來沒有放入任何範圍名稱) 我使用此vba代碼來驗證此表中是否存在該名稱:

Sub test() 

Dim Rng As Name 

For Each Rng In Sheets("WindHail Zone 2").Names 
    'ActiveWorkbook.Names(Rng.Name).Delete 
    MsgBox Rng 
Next Rng 

End Sub 

我從第一行刪除了註釋塊o f將for循環刪除到第二行。我刪除了該選項卡上的過濾器並重新輸入,只是出現同樣的問題。

謝謝!

+2

那......就不會發生。任何我們可以重現的方式?什麼樣的過濾器?什麼VBA代碼?需要更多信息。 – vacip

+1

請編輯您的帖子以包含更多詳細信息:包括代碼片段,迄今爲止已嘗試過的內容等。 –

回答

1

不那麼清楚,我需要的資料試圖實現,但只要「隱藏」的名稱和範圍路口都參與,你必須考慮到什麼如下:

  • 過濾並創建隱藏「的名字如果施加到不屬於同一範圍片_FilterDatabase‘

  • 範圍相交沃爾德返回錯誤「

    但它們都與字符串結尾’

所以在這裏你應該嘗試

For Each Rng In ActiveWorkbook.Names 
    Set rng2 = Range(Rng) 
    If rng2.Parent.Name = rng1.Parent.Name And InStr(Rng.Name, "_FilterDatabase") = 0 Then 'the first check is for ranges belonging to the same worksheet and the second is for rng2 not deriving from any filtering 
     ' now you can safely "Intersect" 
     If Not Intersect(rng2, Range(rng1.Offset(1, 0), rng1.End(xlDown)).EntireRow) Is Nothing Then ActiveWorkbook.Names(Rng.Name).Delete 
    End If 
Next Rng 
+0

非常感謝! – daniel

+0

不客氣,丹尼爾 – user3598756