2011-12-28 10 views
10

名前付き範囲がワークブックまたは特定のシートにスコープされているかどうかをテストするために、かなり単純なvbaステートメントを試しています。名前付き範囲がワークブックにスコープされているかどうかをプログラマティックに判断


テストとして、私は新しいExcelドキュメントを作成し、6つの名前付き範囲に追加しました。 、

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

は3つのWorkbookスコープ名前付き範囲につながるログインする:私はその実行を期待

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 

:ここでは、それらが名マネージャにレイアウトされる方法でありますしかし、何も起こらない。エラーはありません。 .Names(i).WorkbookParameterは、ALLFalseと評価されています。理由はわかりません。しかし、任意の違いを確認しないことの方法を使用して、私はWorkbookParameter読み取り専用いとこのように見えますValidWorkbookParameterに出くわしたVBAのヘルプでNameオブジェクトを通して見ると


は、私はまた、明示的ThisWorkbook.Names(i).WorkbookParameter = Trueを設定しようとしたが、これはエラーになります:

"Invalid procedure call or argument"

WorkbookParameter読む/書く


あるものとして記載されているという事実にもかかわらず、誰でも当てることができます私はそれも期待しているように、なぜこれが動作していないの上の任意の光? Name.WorkbookParameterはどのように動作するはずですか?誰でもこれを成功させることができますか?

+0

非常に使いやすいソリューションのおかげでありがとう...私はVBAの 'Name'オブジェクトの' WorkbookParameter'と 'ValidWorkbookParameter'プロパティの振る舞いについて、まだ興味があります。私の考えでは、広告されているように、これらのプロパティは機能していません。 –

+0

WorkbookParameterが何であるか正確にはわかりませんが、SharepointのExcel Servicesではクライアントサービスではないと思われます。クライアントExcelではなく、 –

答えて

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

Niceです。チップをありがとう – JMax

+0

解決してくれてありがとう...私は 'Parent'プロパティを使うことを考えていませんでした。名前付き範囲がワークブックまたはシートに属しているかどうかを最も直接的に処理するので、これを答えとしてマークしました。 –

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

私は、「スプリット」 –

関連する問題