Страницы: 1
RSS
Что такое скрытые имена диапазонов?
 
В последнее время тут на форуме несколько раз промелькнуло, что в файле накапливаются скрытые имена диапазонов, которые в обычном диспетчере имён не видно, т.к. у них .Visible=False, но из-за них возникают глюки и пухнут файлы. И просмотреть/удалить из можно только циклом по коллекции Names.  
Конечно, можно и просто в тупую макросом на всякий случай удалять их все. Но всё-таки хотелось бы разобраться, что за зверь такой?    
Что это за имена такие, которые нигде не видно? Нафига они тогда нужны (или это баг)? Как можно хитро заюзать это свойство имён .Visible если оно не баг? При каких действиях с файлом скрытые имена сами плодятся-размножаются? Какие "симптомы болезни"? Когда начинать "лечить" и нужно ли это делать регулярно или только когда уж совсем прижмёт глюками?
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Мне кажется, что эти имена генерятся макроом - чтоб руки юзера не часались, их делают невидимыми. Потом, со временем, этот файл возможно сохраняют как копию, без макроса, удалив и область с формулами, которые использовали эти имена, а имена так и остаются. Или сразу макросом генерится файл с именами и формулами, которые со временем удалили.  
Как подверждение догадки - я один раз видел файл, где было 150 (или даже больше) скрытых имён, из-за чего файл распух на пару лишних мб. Столько имён задать вручную нереально.
 
у Уокенбаха написано, что некоторые надстройки, в частности, Поиск решения, также создают много скрытых имён.
 
Ну, Игорь, не знаю... не уверен, что они сами, гады, не размножаются.  
Не скрытые-то имена точно бывает, "прилипают" к Ёкселю и остаются в нём жить после закрытия файла их содержащего.    
Сам не раз натыкался на работе:  
у нас один из постоянно используемых отчётов из БД экспортируется в Ёксель-файлы, создаваемые на основе некоего шаблона Report.xlt. Для упрощения экспорта в шаблоне есть с десяток имён диапазонов. Так вот, пока число одновременно обрабатываемых отчётов было небольшим, всё нормально. А если открыть одновременно 5-10 отчётов, то после их закрытия в Ёкселе стали оставаться эти имена, указывающие на давно закрытые или даже удалённые файлы.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Упс... Не знал. Спасибо, Дмитрий.  
Сейчас проверил один рабочий файл - 136 имён накопилось. Чтож MS за собой не подчищает?
 
Пока писАл ответ Игорю, тут наотвечали оказывается...  
А что, все другие скрытые имена кроме _FilterDatabase и области печати ни на что не влияют и значит их можно просто спокойно удалять?  
Если это так, то можно их будет спокойно автоматом зачищать макросом каждый раз при закрытии файла.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Zurnal!Print_Area - вот это появилось при задании области печати и само удалилось после удаления.  
А Zurnal!_FilterDatabase так и сидит.
 
{quote}{login=Hugo}{date=12.04.2011 02:03}{thema=}{post}Упс... Не знал. Спасибо, Дмитрий.  
Сейчас проверил один рабочий файл - 136 имён накопилось. Чтож MS за собой не подчищает?{/post}{/quote}Подчищает Игорь, но в меру своих возможностей. Поэтому, не раз уже обсуждалось на форуме, лучше ручками проконтролировать - объекты в Nothing, arrays в Empty. А по теме - пока файл не распух до нелогичных размеров, спим спокойно, иначе - применяем спецсредства.  
 
33545
Я сам - дурнее всякого примера! ...
 
Да, забыл сказать, макросов по удалению скрытых имен, как грязи. И я в свое время выкладывал:  
Sub DeleteHiddenNames()  
   Dim n As Name  
   Dim Count As Integer  
   For Each n In ActiveWorkbook.Names  
       If Not n.Visible Then  
           n.Delete  
           Count = Count + 1  
       End If  
   Next n  
   MsgBox "Скрытые имена в количестве " & Count & " удалены"  
   'MsgBox "У вас " & Count & " скрытых имен"  
 
End Sub  
И вот еще тема, где Николай(nilem) свои варианты предложил:  
http://forum.msexcel.ru/microsoft_excel/uvelichenie_fayla_excel-t5365.0.html
Я сам - дурнее всякого примера! ...
 
Еще, справедливости ради, Sub DeleteHiddenNames() писал не я, не помню уже, где взял.
Я сам - дурнее всякого примера! ...
 
Ребята, я только что тоже потестировал.  
Выяснил, что скрытые имена, оканчивающиеся на !_FilterDatabase , удалять нельзя - перестают работать установленные автофильтры.  
А не скрытое имя области печати - Print_Area - тоже удалять не стоит, наверное.  
Поэтому я слепил такой макрос:  
 
Sub EraseNames()   ' очистка списка имен диапазонов  
  Dim nM As Name  
  For Each nM In ActiveWorkbook.Names  
     If Not nM.Visible Then  
        If Not nM.Name Like "*!_FilterDatabase" Then nM.Delete ' удалить все скрытые имена диапазонов кроме фильтров  
     Else  
        If Not nM.Name Like "*!Print_Area" Then  
           Select Case MsgBox("Удалить имя диапазона:" & vbCrLf & vbCrLf _  
                              & nM.Name & nM.RefersTo, vbYesNoCancel + vbQuestion)  
              Case vbYes: nM.Delete  
              Case vbCancel: Exit Sub  
           End Select  
        End If  
     End If  
  Next nM  
End Sub
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Леш, ну это же опять в зависимости от того, кому чего надо. Не пытайся писать универсальные макросы. Если бы такое было возможно - давно было бы написано. Это продолжение нашего диалога?:-) Шутка, в известной степени...
Я сам - дурнее всякого примера! ...
Страницы: 1
Читают тему
Наверх