Страница 1 из 1

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

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

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

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

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

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

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

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

Добавлено: 27 окт 2005, 14:45
Zigi
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

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