2011-12-28 56 views
10

我正在嘗試我認爲會是相當簡單的vba語句來測試命名範圍是否作用於工作簿或特定工作表。Progammatically確定命名範圍是否作用於工作簿


作爲測試,我創建了一個新的Excel文檔並添加了6個命名範圍。這裏是他們是如何在名經理奠定了:

Name   | Refers To   | Scope 
-------------+----------------------+----------- 
rng_Local01 | =Sheet1!$A$2:$A$16 | Sheet1 
rng_Local02 | =Sheet1!$C$2:$C$16 | Sheet1 
rng_Local03 | =Sheet1!$E$2:$E$16 | Sheet1 
rng_Global01 | =Sheet1!$B$2:$B$16 | Workbook 
rng_Global02 | =Sheet1!$D$2:$D$16 | Workbook 
rng_Global03 | =Sheet1!$F$2:$F$16 | Workbook 

我預計運行:

For i = 1 To ThisWorkbook.Names.Count 
    If ThisWorkbook.Names(i).WorkbookParameter Then Debug.Print ThisWorkbook.Names(i).Name 
Next i 

會導致三個Workbook範圍的命名範圍記錄,然而,沒有任何反應。沒有錯誤。 .Names(i).WorkbookParameter評估爲False所有的命名範圍,我不知道爲什麼。


通過我碰到ValidWorkbookParameter它看起來像只讀表妹WorkbookParameter傳來VBA幫助Name對象看,但是使用方法不作任何區別。

我也試圖明確設置ThisWorkbook.Names(i).WorkbookParameter = True,但是這將導致一個錯誤:

"Invalid procedure call or argument"

儘管WorkbookParameter被列爲是事實讀/寫


任何人都瞭解任何事情爲什麼這不起作用,因爲我也期待它呢?我誤解了Name.WorkbookParameter應該如何工作?任何人都可以得到這個成功運行?

+0

感謝非常有用的解決方案傢伙......我仍然好奇VBA中'Name'對象的'WorkbookParameter'和'ValidWorkbookParameter'屬性的行爲。在我看來,這些屬性不像*所宣稱的那樣工作*。 – 2011-12-28 15:32:17

+0

不確定WorkbookParameter是什麼,但懷疑它是用於Sharepoint中的Excel Services而不是客戶端Excel – 2011-12-29 00:21:50

回答

19

可以使用Parent屬性:

Sub Global_Local_names() 
    Dim oNm As Name 
    For Each oNm In Names 
     If TypeOf oNm.Parent Is Worksheet Then 
      Debug.Print oNm.Name & " is local to " & oNm.Parent.Name 
     Else 
      Debug.Print oNm.Name & " is global to " & oNm.Parent.Name 
     End If 
    Next 
End Sub 
+0

不錯。感謝您的提示 – JMax 2011-12-28 15:07:40

+0

感謝您的解決方案......我沒有想過使用'Parent'屬性。我將其標記爲答案,因爲它最直接地處理了命名範圍是屬於工作簿還是工作表。 – 2011-12-28 15:30:17

3

我沒讓WorkbookParameter工作,但我找到了一個解決辦法:

For i = 1 To ThisWorkbook.Names.Count 
    If UBound(Split(ThisWorkbook.Names(i).Name, "!")) > 0 Then Debug.Print ThisWorkbook.Names(i).Name 
Next i 

命名範圍的本地的名稱(即範圍僅限於表格)格式如下:Sheet1!NamedRange全局命名範圍的格式爲:NamedRange

因此,您可以拆分!並檢查數組的長度。

+0

我喜歡使用「Split」的創意解決方案 – 2011-12-28 15:28:28

相關問題