2016-12-05 4 views
1

Часть гораздо большего макроса включает обнаружение и удаление именных диапазонов, которые были непреднамеренно дублированы при перемещении/копировании листа в основную книгу. Эти «сломанные» именованные диапазоны обозначаются столбцом «Значение» в диспетчере имен, отображающим «#REF!».Удаление сломанных именных диапазонов в Excel с использованием VBA

Я попытался исключить из этих именованных диапазонов, используя следующий макрос:

Sub DeleteBrokenNamedRanges() 
Dim NR As Name 
Dim numberDeleted As Variant 

numberDeleted = 0 
For Each NR In ActiveWorkbook.Names 
    If InStr(NR.Value, "#REF!") > 0 Then 
     NR.Delete 
     numberDeleted = numberDeleted + 1 
    End If 
Next 

MsgBox ("A total of " & numberDeleted & " broken Named Ranges deleted!") 

End Sub 

К сожалению, возвращаемое значение равно 0, и никакие именованные диапазоны не были удалены. Я играл с защитой/снятием защиты и некоторыми параметрами InStr, но ничего не сработало.

Сторона Примечание - Возврат NR.Value не #REF! или аналогичный код ошибки, как ожидалось, но на самом деле это путь =C:\Blahblah\blarg.xls.

Любая помощь на этом была бы весьма признательна, спасибо!

+1

он отлично подходит для меня, говоря, что 7 сломанных диапазонов были удалены из тестового файла. Возможно, проверка значения ячейки для '# REF' может работать. – ballsy26

+0

Whhaaatt. Я запускаю Excel 2013, может быть, это проблема? Я видел, что InStr имеет прошлые изменения, но не может сказать, связано ли это. #REF! связано с путём к файлу, содержащему тему с ошибкой диапазона, потому что файл не существует. –

+0

Я запускаю excel 2010, в качестве теста попробуйте создать новый диапазон, а затем удалите всю строку, чтобы создать ошибку '# REF', а затем запустите свой код. Если это сработает, вы узнаете, что это связано с ошибкой пути к файлу. – ballsy26

ответ

1

Я не думаю, что коды ошибок существуют как значения диапазона (не то, чтобы я был авторитетом на этом). Если допустимые диапазоны имели ошибки, отличные от #REF! это может быть проблемой, но я думаю, что-то вроде

IsError(NR.RefersToRange) 

Может быть, хороший способ проверить разбитые именованные диапазоны?

Смежные вопросы