和風スパゲティのレシピ

日本語でコーディングするExcelVBA

18本目:名前定義の削除

Excel&VBA解説サイト「エクセルの神髄」様出題の問題集、
VBA100本ノック」に対する私の回答と解説のページです。

100本ノックの出題リストはこちらから
excel-ubara.com

出題:名前定義の削除

#VBA100本ノック 18本目
不明な名前定義が沢山あるので、以下の処理をしてください。
・非表示の名前定義は表示にする
・参照範囲に「#REF!」が含まれる場合は削除しイミディエイトに「名前」と「参照範囲」を出力
・最後に非表示件数と削除件数をメッセージボックスに表示
※ブック指定は任意

名前定義サンプル

◇ 出題ページはこちら

ソースコード

定義モジュール

Option Explicit

' 100本ノック018:名前定義の削除
Sub 非表示の名前を表示しREFエラーの名前を削除する()
    
    ' ブック内のすべての名前定義をループ
    Dim 非表示件数 As Long
    Dim 削除件数 As Long
    Dim 名前定義 As Name
    For Each 名前定義 In ActiveWorkbook.Names
        
        ' 非表示なら表示
        If Not 名前定義.Visible Then
            非表示件数 = 非表示件数 + 1
            名前定義.Visible = True
        End If
        
        ' #REF!を含むなら削除
        If InStr(名前定義.RefersTo, "#REF!") > 0 Then
            削除件数 = 削除件数 + 1
            Debug.Print 名前定義.Name & ":" & 名前定義.RefersTo
            名前定義.Delete
        End If
    Next
  
    MsgBox "名前定義の整理を完了しました。" & vbLf & _
           "非表示件数:" & 非表示件数 & "件" & vbLf & _
           "削除件数:" & 削除件数 & "件"
           
End Sub

解説

名前定義を操作する問題でした。

オブジェクトを扱うかなり基本的なコードで書ける処理で、

  • 名前定義を扱うオブジェクトは「Nameオブジェクト」
  • NamesコレクションをFor Eachすると各名前定義のNameオブジェクトを取得可
  • プロパティ(VisibleやReforsTo)を読み取って名前定義の情報を取得・判定
  • メソッド(Delete)の実行やプロパティ(Visible)への代入で操作

という、教科書通りのコードとなっています。


オブジェクト/コレクション/プロパティ/メソッドの関係を知っておくと、
初見のオブジェクトでも.の入力候補だけでかなりのコードを書けるようになります。


「ブック内の非表示シートを表示に切り替えて、
 #REFエラーセルがあるシートは削除する」

というコードを書いてみて比べてみると構造がわかりやすいかもしれません。

この機会に勉強してみてください。