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エラーセルがあるシートは削除する」
というコードを書いてみて比べてみると構造がわかりやすいかもしれません。
この機会に勉強してみてください。