Страницы: 1
RSS
Удалить имена в диспетчера имен с помощью VBA, Макрос для удаления имен
 
Доброго времени суток! Подскажите, пожалуйста... Мне нужно удалить все имена в диспетчере имен.
На сайте нашел макрос, но он для моего файла не подходит.
Код
Sub DellAllName()
   Dim name As Object
    For Each name In ActiveWorkbook.Names
       name.Delete
   Next
End Sub

Файл должен иметь расширение  "*.xlsb", Имен очень много будет, хотелось бы макросом, если это возможно (с расширением "*.xlsm" - работает)
Спасибо!
Изменено: vanya7819 - 08.12.2017 23:39:34
 
Если не углубляться, то
Код
Sub DellAllName()
On Error Resume Next
   Dim name As Object
    For Each name In ActiveWorkbook.Names
       name.Delete
   Next
End Sub
По вопросам из тем форума, личку не читаю.
 
БМВ, Большое, ВАМ, СПАСИБО! Всё работает!
 
БМВ, добрый день.
Я работаю с именами как "As Name". И всё бы ничего, но иногда это имя нужно "Delete". И вот здесь... как с гуся вода.
А если я обращаюсь к именам как "As Object", то я не могу прочесть название этого имени:

Dim ЫЫЫ As Object
...
If ЫЫЫ.Name = ... Then

Посоветуйте, пожалуйста, как быть.
Изменено: Алексей Вячеславович - 12.03.2025 18:34:23
Кто хочет - ищет способы.
Кто НЕ хочет - ищет причины...
 
Цитата
Алексей Вячеславович написал:
я не могу прочесть название этого имени
а что мешает? Object так же имеет в этом случае все те же методы и свойства, что и Name, т.к. переменная унаследует все эти свойства от объекта коллекции Name. Только после ввода точки нет выпадающего списка этих свойств и методов.
Другой вопрос, что есть "заблокированные" имена. И тогда хоть Object, хоть Name - не получится достучаться ни до каких свойств и удалить тоже. Если Вы про эти имена - то здесь вообще не играет роль то, какой тип Вы назначаете для перебора имен.
Однако, очень плохая практика использовать в качестве имен переменных имена уже используемых объектов. Объект Name уже есть. Называйте хотя бы oName или просто - on.
Изменено: Дмитрий(The_Prist) Щербаков - 12.03.2025 19:23:48
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков, здравствуйте. Рад вновь Вас слышать.

Требуется лёгкий ликбез.

Я в своей программе работаю с "выкройками" кубических поверхностей, которые "расписываю" некими функциями.
Выкройки располагаю на 6 листах (А-Б-В-Г-Д-Е). При этом центральные (базовые) грани  обзываю именованными диапазонами книги
(А.1-А.2-...-А.18 на листе А; Б.1-Б.2-...-Б.18 на листе Б ; и т.д. до листа Е),
а проекции боковых - приклеиваю к ним с соответствующей стороны и обзываю именованными диапазонами листа

(На листе А:
А.1в, А.1н, А.1л и А.1п - вокруг А.1;
А.2в, А.2н, А.2л и А.2п - вокруг А.2;
...
А.18в, А.18н, А.18л и А.18п - вокруг А.18;

На листе Б:
Б.1в, Б.1н, Б.1л и Б.1п - вокруг Б.1;
Б.2в, Б.2н, Б.2л и Б.2п - вокруг Б.2;
...
Б.18в, Б.18н, Б.18л и Б.18п - вокруг Б.18;

и т.д. до листа Е )

Получается на каждом листе по 18 "крестов", в центрах которых - именованные диапазоны книги, а по краям - именованные диапазоны соответствующего листа.

Обзывание ведётся стандартными процедурами:

Dim WS as WorkSheet

For Each WS in ThisWorkBook.Sheets

   For i = 1 to 18

      S = WS.Name & "." & i

       ThisWorkBook.Names.Add Name := S, RefersToR1C1:=.....

       WS.Names.Add Name := S & "л", RefersToR1C1:=.....
       WS.Names.Add Name := S & "п", RefersToR1C1:=.....
       WS.Names.Add Name := S & "в", RefersToR1C1:=.....
       WS.Names.Add Name := S & "н", RefersToR1C1:=.....
................................................................................................
     
Кубы - переменной размерности, поэтому по ходу работы приходится очищать книгу от одних имён и переназначать их на другие диапазоны.

И вот тут я обнаружил, что в цикле:

Dim диапазон As Name

For Each диапазон in ThisWorkBook.Names
   If диапазон = ... Then ActiveWorkBook.диапазон.Delete
...................................................................................................

именованные диапазоны - обрабатываются, но имена их - НЕ УДАЛЯЮТСЯ,

а в цикле:

Dim диапазон As Object

For Each диапазон in ThisWorkBook.Objects
   If диапазон = ... Then ...
...................................................................................................

имена - НЕ ЧИТАЮТСЯ.

При этом средствами Excel-я удаление - происходит, но  в VBA "проявляются" старые (использовавшиеся ранее) имена, НЕ ОТОБРАЖАЮЩИЕСЯ в Excel-евском списке.

"Кого любить? Чему же верить?" (не моё:)
Изменено: Алексей Вячеславович - 13.03.2025 15:32:38 (правка текста)
Кто хочет - ищет способы.
Кто НЕ хочет - ищет причины...
 
Дмитрий(The_Prist) Щербаков, кажется, о чём-то начинаю догадываться.

Когда я писал

For Each диапазон in ThisWorkBook.Names

то был убеждён, что перебираются именно ИМЕНА.

А перебираются - ДИАПАЗОНЫ, у которых ЕСТЬ имена...

Эпическая сила!...
Кто хочет - ищет способы.
Кто НЕ хочет - ищет причины...
 
Я не очень понимаю, что Вы хотите и в чем проблема. Без файла очень сложно понять, что у Вас за проблема.
Цитата
Алексей Вячеславович написал:
If диапазон = ... Then
что здесь? Что с чем сравниваете? Если пытаетесь достучаться так до имени - то так и надо писать:
Код
If диапазон.name = "имя имени" Then

если что-то другое - то опишите, что и по каким условиям ищете. А так - можно только посоветовать изучать глубже мат.часть :)
Изменено: Дмитрий(The_Prist) Щербаков - 14.03.2025 08:37:52
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Спасибо, Дмитрий. Ваше желание помочь мне ещё пригодится.
В заблуждение меня ввела языковая структура "Each ... in .Names". В прошлый раз на подобные лингвистические грабли я наступил, покупая бескаркасные щётки для а/м. Что можно было понять и как "Щётки, которым не хватает каркаса", и как "Каркас и не требуется". И я понял неправильно...
Кто хочет - ищет способы.
Кто НЕ хочет - ищет причины...
Страницы: 1
Читают тему
Наверх