【VBA】ブック内の「名前の定義」を一括削除するマクロ【取扱注意】

目次

はじめに

Excelの「名前の定義」は、特定のセル範囲に分かりやすい名前を付けて、数式などで便利に利用できる機能です。しかし、ブックのコピーを繰り返したり、多くの人によって編集されたりするうちに、不要な定義やリンク切れの定義が大量に溜まってしまうことがあります。

これらの不要な定義は、ブックの動作を不安定にしたり、ファイルの容量を肥大化させたりする原因にもなり得ます。「名前の管理」ダイアログから一つずつ削除するのは大変ですが、VBAマクロを使えば、ブック内の全ての「名前の定義」を一括でクリーンアップできます。

この記事では、そのためのシンプルなVBAコードと、実行する上での重要な注意点を解説します。

⚠️ 重要:実行する前の注意 このマクロを実行すると、ブックに登録されている全ての「名前の定義」が削除されます。 VLOOKUP関数やINDIRECT関数などで利用している重要な名前も消えてしまい、数式が #NAME? エラーになる危険性があります。実行する前には、必ずファイルのバックアップを取るか、削除しても問題ないことが確実なファイルでのみ使用してください。


全ての「名前の定義」を削除するVBAサンプルコード

このマクロは、ブック(ActiveWorkbook)に存在する全ての名前(.Names)をループ処理で一つずつ取得し、削除(.Delete)していきます。

完成コード

' 現在のブックに定義されている名前を全て削除する
Sub DeleteAllDefinedNames()

    '== 変数を定義します ==
    Dim definedName As Name
    Dim nameCount As Long
    Dim userResponse As VbMsgBoxResult

    ' 削除前の名前の数をカウント
    nameCount = ActiveWorkbook.Names.Count
    
    If nameCount = 0 Then
        MsgBox "このブックには「名前の定義」がありません。", vbInformation
        Exit Sub
    End If
    
    '== ユーザーに最終確認を求めます ==
    userResponse = MsgBox(nameCount & "個の「名前の定義」がブック内に存在します。" & vbCrLf & _
                          "これらを全て削除しますか?" & vbCrLf & _
                          "(この操作は元に戻せません)", _
                          vbExclamation + vbOKCancel, "最終確認")

    '== 「OK」が押された場合のみ処理を実行します ==
    If userResponse = vbOK Then
    
        '== ブック内の全ての名前をループ処理で削除します ==
        For Each definedName In ActiveWorkbook.Names
            definedName.Delete
        Next definedName
        
        MsgBox "全ての「名前の定義」を削除しました。", vbInformation
        
    Else
        MsgBox "処理を中断しました。", vbInformation
    End If

End Sub

コードの解説

Dim definedName As Name

Name オブジェクトを格納するための変数 definedName を宣言しています。Name オブジェクトは、Excelの「名前の定義」そのものを指します。

userResponse = MsgBox(...)

前述の通り、このマクロの処理は破壊的で元に戻せないため、実行前にユーザーに最終確認を促すメッセージボックスを表示しています。安全性を高めるための重要なステップです。

For Each definedName In ActiveWorkbook.Names

このコードが処理の核心です。

  • For Each ... Next 構文を使い、ActiveWorkbook.Names コレクション(現在アクティブなブックに存在する全ての「名前の定義」)から、名前を一つずつ definedName 変数に取り出してループ処理を実行します。

definedName.Delete

For Each ループの中で、取り出された個々の definedName オブジェクトに対して .Delete メソッドを実行し、名前の定義を削除しています。


まとめ

今回は、ブックに溜まった不要な「名前の定義」を一括で削除するVBAマクロをご紹介しました。

  • ActiveWorkbook.Names でブック内の全ての名前を取得できる。
  • For Each ループ.Delete メソッドを組み合わせて一括削除を実現する。
  • 実行すると重要な数式がエラーになる可能性があるため、バックアップと実行前の確認が不可欠

意図せず肥大化したファイルや、動作が不安定になったファイルのメンテナンスに非常に役立つマクロです。リスクを十分に理解した上で、慎重に活用してください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次