Именованный диапозон в формуле

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Ответить
Zigi
Сообщения: 32
Зарегистрирован: 18 янв 2005, 16:45
Откуда: СПб

Мне по наследству достался экселевский файлик, где все формулы прописаны не как прямая ссылка на ячейку, а как ссылка на присвоенное ячейке имя. И таких формул/имён больше 1000+, что очень затрудняет ковыряние в файле на предмет понимания что откуда берется. :(
Если какой нибудь способ вернуть формулам нормальный вид, т.е. вместо ссылки на имя, была бы ссылка на соответствующую ячейку?

З.Ы. А какой тайный смысл в таком построении файла? По мне это только двойная работа - сначала присвоение имени ячейки, а потом еще и прописывания формулы, плюс и самому запутаться можно. Единственное что приходит на ум - это что бы осложнить жизнь другим людям, которые захотят покопаться в этом файле. А может я просто чего-нибудь недопонимаю (возможно в силу не столь преклонного возраста :wink: )
pashulka
Сообщения: 831
Зарегистрирован: 24 ноя 2004, 03:46
Контактная информация:

Наверное всё таки не 1000 имён, а ~ 1000 формул, которые содержат имена. Что касается имён, то здесь надо отметить, что имя может ссылаться не только на ячейки/диапазон ячеек, но и представлять собой константу или даже именованную формулу (которая в свою очередь может включать в себя практически всё что угодно) () Имена могут быть обычными и трёхмерными, уровня рабочей книги или уровня рабочего листа. Поэтому не зная о чём именно идёт речь, сложно что-то советовать, во всяком случае мне. Однако если Вы имеете дело с банальными именованными диапазонами, то можно просто заменить имя на адрес диапазона. В меню Правка выбираете команду Заменить (CTRL+H) в поле Что введите имя, а в поле Заменить на адрес диапазона, затем кнопка Заменить всё.
Zigi
Сообщения: 32
Зарегистрирован: 18 янв 2005, 16:45
Откуда: СПб

В том то вся и беда, что 1000 имён, причем каждое имя, за редким исключением, используется только в одной формуле.
Что бы было понятно о чем речь. попробую подробно объяснить:
Каждое имя ссылается только на одну ячейку, т.е. в меню "Вставка/Имя" имени "Rs10381" прописана формула "=Свод!$B$13", на другом листе в ячейке используется формула "=Rs10381". И таких вот Rs-ов больше тысячи. Даже не используется ссылка на диапозон ячеек.
Очень хочется привести все это в божеский вид. И заменой тут особо не поможешь, проще руками все перессылить, но уж больно это долго и муторно :cry:
pashulka
Сообщения: 831
Зарегистрирован: 24 ноя 2004, 03:46
Контактная информация:

В таком случае Ваше возмущение понятно. Что касается решения поставленной задачи, то можно попробовать использовать макрос, но только не в оригигале … мало ли что …

Код: Выделить всё

Dim iName As Name: Dim iList As Worksheet

For Each iName In ThisWorkbook.Names
iRefersTo = Mid(iName.RefersTo, 2, 1000)
    For Each iList In Worksheets
       iList.UsedRange.Replace What:=iName.Name, _
        Replacement:=iRefersTo, LookAt:=xlWhole
    Next
iName.Delete
Next
Zigi
Сообщения: 32
Зарегистрирован: 18 янв 2005, 16:45
Откуда: СПб

pashulka, спасибо огромное за ответ, я тоже не сидел сложа руки,
получилось примерно то же самое. И самое удивительное что работает :lol:

Код: Выделить всё

    Dim i As Name
    For Each i In ActiveWorkbook.Names
        i.RefersToRange.Select
     Selection.Replace What:="=" & i.Name, Replacement:=i, LookAt:=xlWhole, _
        SearchOrder:=xlByRows, MatchCase:=False
pashulka
Сообщения: 831
Зарегистрирован: 24 ноя 2004, 03:46
Контактная информация:

Вы уверены, что работает … вопрос не праздный, так как свойство .RefersToRange возвращает об'ект Range, который служит "источником" для имени. При этом формула, которая содержит подобное имя находится в совершенно другой ячейке, а стало быть замены не произойдет. Вдобавок, если формула выглядит так =100+Rs10381, то и здесь мы получим облом и т.д.
Ответить