
前提・実現したいこと
初めてマクロを書いているので理解不足な点が多々あることはご了承ください。
大量のexcelファイルを一つのフォルダに格納して、
該当の文字列を含んだ名前の定義(値、参照範囲どちらかに含んでいるもの)を削除するマクロを作成したいです。
その中で、非表示となっている名前の定義も削除対象としたいです。
発生している問題・エラーメッセージ
getName(nm.Name) = 1 _部分でrangeのglobalエラーが表示されてしまっています。
該当のソースコード
vba
1Public Sub DeleteNames() 2 '非表示となっている名前の定義を表示 3 DisplayNames 4 Dim nm As name 5 Dim i As Integer: i = 0 6 On Error Resume Next ' エラーを無視。(削除件数にカウントしてしまう) 7 '名前の定義の「値」、「参照範囲」に特定の文字列を含んでいた場合、該当する名前の定義を削除 8 9 For Each nm In ActiveWorkbook.Names 10 If InStr(nm.Value, "#REF") > 0 OR _ 11 getName(nm.Name) = 1 _ 12 Then 13 nm.Delete 14 i = i + 1 15 End If 16 Next nm 17 18End Sub 19 20'非表示の名前の定義を再表示する 21Public Function DisplayNames() 22 Dim name As Object 23 For Each name In Names 24 If name.Visible = False Then 25 name.Visible = True 26 End If 27 Next 28End Function 29 30'セル範囲の値を順番に取得し、CheckRangeValueを呼び出す 31Public Function getName(na As String) 32 Dim i As Long 33 Dim naStr As String 34 Dim result As Integer 35 result = 0 36 37 For i = 1 To Range(na).Count 38 naStr = Range(na).Item(i).Value 39 40 If CheckRangeValue(naStr) = 1 Then 41 result = 1 42 End If 43 Next i 44 getName = result 45 46End Function 47 48'名前の定義の「値」に特定の文字列を含んでいた場合1を返却 49Public Function CheckRangeValue(r As String) 50 Dim val 51 Dim result As Integer 52 If InStr(val.Value, "#REF") > 0 _ 53 Then 54 result = 1 55 End If 56 CheckRangeValue = result 57End Function
試したこと
処理の中にdebugを張ったりしてみましたが、名前の定義の名前部分が正しく取得できていることは確認できました。
補足情報(FW/ツールのバージョンなど)
特になし

まず人に見てもらうならインデントしましょう。次にDeleteNames()のIf InStr(nm.Value, "#REF") > 0 _ getName(nm.Name) = 1 _ Thenですが、Orが抜けているのが原因と思われます。さらにrestult = 1はスペルが違いますね。 CheckRangeValue(r As String)のrはFor Eachで使っていることからAs Rangeではないでしょうか。 この他にもエラーの原因が多数ありそうです。デバッグ中はOn Errorは切ったほうが良いと思います。最初のREF判定とgetNameをOrでつなぐのではなく、別のIfで括ったほうが理解しやすいかと思います。時間があればデバッグしてみます。
ソースコードの直前の行に「```vba」、直後の行に「```」を追加して、ソースコードにシンタックスハイライトが適用されるようにしてください

回答2件
あなたの回答
tips
プレビュー