指定した名前のセル範囲が参照切れだったら削除する(Excel)
定義された名前を消す
そういえば、定義された名前をVBAから消すのって、どうしたらいいんだろう?
そう思ってちょっと調べてみた。
WorkbookオブジェクトのNamesプロパティ
コチラによると
指定されたブックのすべての名前 (すべてのワークシートの名前を含む) を表す Names コレクションを返します。値の取得のみ可能です。 Names コレクション オブジェクトを使用します。
とのこと。
つまり、WorkbookオブジェクトのNamesプロパティを参照すれば、Namesコレクションを返してくれる、ということだ。
Workbookオブジェクト傘下のNameオブジェクト
また、コチラによると
単体の Name オブジェクトを取得するには、 Names ( index ) プロパティを使用します。引数 index には、定義されている名前のインデックス番号または名前自体を指定します。
ということなので、特定の名前を削除するには、
[Workbookオブジェクトの式].Names([定義された名前]).Delete
と、NameオブジェクトのDeleteメソッドを使えばよい。
指定した名前が参照切れならば削除するSub
上記のことを踏まえて、指定した名前が参照切れだったら削除する、というSubを作ってみる。
リスト1 標準モジュール
Public Sub deleteDeadName(ByVal targetName As String) If Not hasReferences(targetName) Then _ ThisWorkBook.Names(targetName).Delete End Sub Private Function hasReferences(ByVal nameOfRange As String) As Boolean On Error Resume Next Dim tmpRange As Range Set tmpRange = Range(nameOfRange) If Err.Number = 0 Then hasReferences = True Else hasReferences = False End If Err.Clear End Function
hasReferencesで指定した名前のセル範囲が存在するかどうかをチェック。
名前を使ってRangeプロパティを参照してみて、エラーが出なけりゃTrueという乱暴なやり方w
終わりに
まあ、もちろんそもそも指定した名前が存在するかどうかは事前にチェックしとかないとダメですけど。