Добрый день, всем участникам форума! Прошу оказать содействие в правки моего кода "Франкенштейна": [vba]
Код
Sub DeleteExternalNames() 'отображаем скрытые имена Dim nName As Name For Each nName In ActiveWorkbook.Names nName.Visible = True Next nName 'удаляем лишние имена Dim n As Name For Each n In Application.ActiveWorkbook.Names n.Delete count = count + 1 Next n MsgBox "Все имена в количестве " & count & " удалены" End Sub
[/vba] Этим кодом отображаю все скрытые имена и потом удаляю все именованные диапазона (т.к. при копировании листа всем известно что происходит с тысячами имен). Но в некоторых файлах есть нужные именованные диапазоны (списки, умные таблицы, созданные в этой книге). Попытался удалить только имена с ошибками: [vba]
Код
For Each IName In ActiveWorkbook.Names If IName.RefersTo Like "*REF!*" Then IName.Delete 'удаление имени с ошибками End If Next
[/vba] Но остаются имена с внешними ссылками или системными (которые подтянулись из файлов 1С). На одном из сайте нашел что можно сделать "Если n.referestorange существует, и если n.referstorange.worksheet.parent is thisworkbook, то не удалять", но не понял как это вкрутить в свой код. Буду признателен за любой совет.
Добрый день, всем участникам форума! Прошу оказать содействие в правки моего кода "Франкенштейна": [vba]
Код
Sub DeleteExternalNames() 'отображаем скрытые имена Dim nName As Name For Each nName In ActiveWorkbook.Names nName.Visible = True Next nName 'удаляем лишние имена Dim n As Name For Each n In Application.ActiveWorkbook.Names n.Delete count = count + 1 Next n MsgBox "Все имена в количестве " & count & " удалены" End Sub
[/vba] Этим кодом отображаю все скрытые имена и потом удаляю все именованные диапазона (т.к. при копировании листа всем известно что происходит с тысячами имен). Но в некоторых файлах есть нужные именованные диапазоны (списки, умные таблицы, созданные в этой книге). Попытался удалить только имена с ошибками: [vba]
Код
For Each IName In ActiveWorkbook.Names If IName.RefersTo Like "*REF!*" Then IName.Delete 'удаление имени с ошибками End If Next
[/vba] Но остаются имена с внешними ссылками или системными (которые подтянулись из файлов 1С). На одном из сайте нашел что можно сделать "Если n.referestorange существует, и если n.referstorange.worksheet.parent is thisworkbook, то не удалять", но не понял как это вкрутить в свой код. Буду признателен за любой совет.Anis625
Попробуйте такой вариант, только сначала на копии файла) [vba]
Код
Sub DeleteExternalNames() 'отображаем скрытые имена Dim nName As Name For Each nName In ThisWorkbook.Names nName.Visible = True Next nName 'удаляем лишние имена Dim n As Name, count As Long On Error Resume Next For Each n In ThisWorkbook.Names If InStr(n.RefersTo, "#") > 0 Or InStr(n.RefersTo, "\\") > 0 Then n.Delete count = count + 1 ElseIf Not n.RefersToRange.Worksheet.Parent Is ThisWorkbook Then n.Delete count = count + 1 End If Next n MsgBox "Все имена в количестве " & count & " удалены" End Sub
[/vba]
Попробуйте такой вариант, только сначала на копии файла) [vba]
Код
Sub DeleteExternalNames() 'отображаем скрытые имена Dim nName As Name For Each nName In ThisWorkbook.Names nName.Visible = True Next nName 'удаляем лишние имена Dim n As Name, count As Long On Error Resume Next For Each n In ThisWorkbook.Names If InStr(n.RefersTo, "#") > 0 Or InStr(n.RefersTo, "\\") > 0 Then n.Delete count = count + 1 ElseIf Not n.RefersToRange.Worksheet.Parent Is ThisWorkbook Then n.Delete count = count + 1 End If Next n MsgBox "Все имена в количестве " & count & " удалены" End Sub
Pelena, Не срабатывает код. Буквально сразу после запуска выводится сообщение msgbox "Все имена в количестве 0 удалены" Получается сразу отрабатывается строка[vba]
Код
On Error Resume Next
[/vba]
Pelena, Не срабатывает код. Буквально сразу после запуска выводится сообщение msgbox "Все имена в количестве 0 удалены" Получается сразу отрабатывается строка[vba]
Pelena, Странное дело - поместил код в "Личную книгу макросов" не работает. Поместил в модуль книги - работает. Из-за чего может быть так? На счет размера - согласен, что в этом и была причина такого веса, поэтому и пытался решить задачку.
Pelena, Странное дело - поместил код в "Личную книгу макросов" не работает. Поместил в модуль книги - работает. Из-за чего может быть так? На счет размера - согласен, что в этом и была причина такого веса, поэтому и пытался решить задачку.Anis625
Pelena, Все отлично работает после замены. Спасибо Вам огромное. Маленький (не критичный нюанс) только уточню. Код не отработал две ошибки (фото во вложении) из-за чего это может быть?
Pelena, Все отлично работает после замены. Спасибо Вам огромное. Маленький (не критичный нюанс) только уточню. Код не отработал две ошибки (фото во вложении) из-за чего это может быть?Anis625
Pelena, Пусто там. И при копировании листа именно на них и выводится сообщение о конфликте имен. В них вроде есть символ # который указан в коде, по идее должен снести и его тоже код
Pelena, Пусто там. И при копировании листа именно на них и выводится сообщение о конфликте имен. В них вроде есть символ # который указан в коде, по идее должен снести и его тоже кодAnis625