【VBA】ブックに定義されているセルの名前をすべて消す

セルには名前をつけることができますが、マクロを実行していると名前が悪さをすることがあります。

なので消し去ってしまいましょう。

経験上、名前を消して困ったことはないので大丈夫です。きっと。

Sub DeleteCellName(wb As Workbook)

    Dim currentName As Name
    Dim errorNames As Collection
    Set errorNames = New Collection
    Dim message As String
    
    ' ブックに定義されているすべての名前に対して処理を行う
    For Each currentName In wb.Names
        
        ' 印刷関係は無視する
        If InStr(currentName.Name, "Print_Area") = 0 And InStr(currentName.Name, "Print_Titles") = 0 Then
            On Error Resume Next
            
            ' 名前を削除
            currentName.Delete
            
            ' 削除したときにエラーが出たときはコレクションに追加してエラーをリセットする
            If Err.Number <> 0 Then
                errorNames.Add currentName.Name
                Err.Clear
            End If
            On Error GoTo 0
        End If
    Next
    
    ' エラーが出てスルーした名前を表示する
    If errorNames.Count > 0 Then
        For Each Name In errorNames
            message = message & Name & " "
        Next
        message = "以下の名前は手動で削除してください:" & vbCrLf & message
        MsgBox message, vbOKOnly, "エラー"
    End If
    
End Sub

Sub test()

    Call DeleteCellName(ThisWorkbook)

End Sub

As Nameという見慣れない謎の型がありますね。

見たままですがエクセルの名前型です。

私はこのコードでしか使ったことがないので忘れてもいいと思います。

errorNamesはエラーを格納するコレクションで、今回のコードではサブです。

メインはcurrentName.Deleteだけです。簡単ですね。

よくあるエラーハンドリング

On Error Resume Next
            
' 名前を削除
currentName.Delete

' エラーがあればコレクションに追加してエラーをリセットする
If Err.Number <> 0 Then
    errorNames.Add currentName.Name
    Err.Clear
End If

On Error GoTo 0

名前そのものもよく悪さをしますが、名前を削除するときにも結構悪さをします。

なのでエラーが出た時の処理をしっかり入れておきます。

Err.Number直前はエラーNo.です。

Err.Numberが0でないとき=エラーが出たときerrorNamesにエラーが出たセルの名前を格納しています。

格納したらErr.Clearでリセットし、If文を抜け、エラーが出た名前をユーザーに伝えています。

この処理はよく出るので書けるようになりましょう。

On Error Resume NextからOn Error GoTo 0までがセットです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA