Есть книга Excel в которой около 350 листов. Из них один лист служебный (Dienstblatt) со всякими списками, именнованными диапазонами и пр. Другой (Main) - сводная таблица с самыми важными данными со всех остальных листов и остальные листы - карточки клиентов с различной информацией о клиента (имена - в цифрах от 1 и до последнего).
По сути лист Main является листом оглавления, поскольку у него в колонке А перечень всех номеров существующих листов-карточек клиента, а в колонке В - стрелочка, нажав на которую, открывается нужный лист клиента.
Листы клиентов в ячейке А1 дублируют имя листа (номер клиента) и также имеют стрелочку-гиперссылку на соответствующую строку листа Main. Гиперссылка (по формуле) читает номер клиента в ячейке А1, находит это число в колонке А:А листа Main, определяет номер строки и перносится на ячейку А этой строки. Количество листов-клиентов постоянно меняется (номера у уже существующих листов не меняются - новые клиеты получают следующие по возрастанию номера).
Когда появляется новый клиент, добавляется лист клиент, а в сводную таблицу (лист Main) просто добавляется строка, в ячейку А которой впечатывается новый номер (таблица оформлена как умная таблица, поэтому все формулы, собирающие данные с листа клиента, в нужные ячейки вставляются автоматически).
Все работает, но слегка притомаживает. Более того, сейчас я готовлю новый макет файла и столкнулся с тем, что моя реалиазиция ну ОЧЕНЬ не оптимальная и чревата ошибками.
Сейчас все вышеописанные действия выполняются формулами:
Переход с листа Main:
Код |
---|
=ГИПЕРССЫЛКА("["&Dienstblatt!$B$1&"]"&ДВССЫЛ(АДРЕС(ЯЧЕЙКА();1))&"!$A$1";"►") |
Номер листа-клиента в ячейке А1:
Код |
---|
=ЗНАЧЕН(ПСТР(ЯЧЕЙКА("filename";A1);ПОИСК("]";ЯЧЕЙКА("filename";A1))+1;65535)) |
Переход с листа-клиента на соответствующую строку листа Main:
Код |
---|
=ГИПЕРССЫЛКА("["&Dienstblatt!$B$1&"]Main!"&АДРЕС(ПОИСКПОЗ(A1;Main!A:A;0);1);"◄") |
Я думаю, что если заменить эти три формулы на макросы, работа с файлом ускорится. Я поискал решение и у нас на сайте и вообще, но то ли не нашел, то ли не понял. Например, имя листа и ссылку на лист Main я вставляю так:
Код |
---|
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
If Sh Is Me.Sheets("Main") Or Sh Is Me.Sheets("Dienstblatt") Then Exit Sub
With Sh
.Range("C1") = .Name
.Hyperlinks.Add Anchor:=.Range("A1").Offset(i), Address:="", SubAddress:="Main!A1"
End With
End Sub |
но у меня при этом нарушается форматирование ячейки со ссылкой. И я не могу пока попасть на нужную строку листа Main...
Вопрос: как это сделать с помощью макросов и ускорит ли это действительно работу файла?
И 2 пожелания:
- хотелось бы сделать так, чтобы макрос вставленный в ячейку не ломал форматирование этой ячейки (у меня, в моих попытках написать нужный макрос, меняется размер шрифта стрелки и появляется подчеркивание).
- было бы неплохо сделать так, чтобы ячейка с номером листа становилась гиперссылкой (что бы вообще убрать колоку В:В с листа Main и освободить ячейку В1 на листе-клиенте) но это, конечно, так - хотелки.
Прикладываю файл. Удалил из него всю "лишнюю" информацию. Оставил только 5 пустых листов-клиентов и лист оглавления.
Помогите с макросами, плз.
И с Праздником всех наших дорогих женщин!