Разбираем по кусочкам новый «ленточный» интерфейс Word 2007. Здесь нет и не будет советов о том, как его сделать похожим на Word 2003. Только усовершенствования уже существующего. Также приглашаю посетить мой блог, посвященный работе с макросами в Word.

Напоминаю, что все коды программ, приведенных в блоге, вы используете на свой страх и риск. Не забывайте создавать резервные копии.

воскресенье, 14 июня 2009 г.

Динамическое меню (продолжение 3)

В своей заметке я привел пример динамического меню для работы с закладками в документе. Как это обычно бывает, первый блин оказался комом. Меню, хотя и работало, не было избавлено от недостатков.
При большом количестве закладок в документе в нем было трудно ориентироваться. Попал мне в руки документ, в котором было более 200 закладок. Меню сформировалось, но найти в нем нужную закладку было довольно сложно. Поэтому я решил доработать это меню, расширив его функциональность и сделав более удобным в эксплуатации.
Что было сделано:

  1. Добавлена возможность сортировки списка закладок по алфавиту или по положению в документе

  2. Добавлена кнопка включения/выключения отображения закладок. Спасибо за идею Антону Кокину

  3. После имени закладки добавляются первые 10 символов из текста закладки

  4. На кнопке «Управление закладками» в скобках отображается количество закладок.

  5. В подсказке к каждой закладке в меню отображается полный её текст.


Выглядит меню так:

Скачать шаблон с примером можно отсюда
При совершенствовании меню самой неожиданной стала проблема с формированием текста пунктов меню и всплывающей подсказки. Дело в том, что если в тексте закладки есть символы, которые в языке XML рассматриваются как служебные, то это вызовет ошибку. К таким символам относятся: двойная кавычка «"», одинарная кавычка «'», знаки больше «>» и меньше «<», квадратные скобки «[]», двойное тире «--». Я решил эту проблему, написав функцию, которая заменяет все эти символы на их ASCII-код так, чтобы они могли правильно отображаться в меню. Вот код этой функции:
Замена литералов на сущности   Копировать код без номеров строк
1 Public Function GetRightXMLString(ByVal str As String) As String
2 '
3 'Замена в строке XML спецсимволов на их коды
4 '
5 Dim ar(), i%
6 ar = Array("""", "<", ">", "[", "]", "'", "-", vbTab, vbCr, vbCrLf, vbLf)
7 For i = 0 To UBound(ar)
8 str = Replace(str, ar(i), "&#" & AscW(ar(i)) & ";")
9 Next
10 str = Replace(Replace(str, ChrW(7), ""), ChrW(21), "")
11 GetRightXMLString = CleanString(str)
12 End Function