指定した名前のセル範囲が参照切れだったら削除する(Excel)

f:id:akashi_keirin:20180318110827p:plain

定義された名前を消す

そういえば、定義された名前を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

終わりに

まあ、もちろんそもそも指定した名前が存在するかどうかは事前にチェックしとかないとダメですけど。

@akashi_keirin on Twitter