Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Word
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.05.2015, 13:24   #1
Shmel_
 
Регистрация: 26.05.2015
Сообщений: 6
По умолчанию Преобразовать локальное форматирование в стили

Привет.

Есть тексты набранные в ворде. Много локального форматирования, которое зачастую весьма разнообразно. Нужно всё это преобразовать в символьные стили.

Я думал примерно так (не судите строго — не программист):

1. Устанавливаем курсор в начале в образце текста который считаем базовым и запускаем макрос.
2. Макрос находит в тексте первое отличие форматирование от базового и заносит его в массив используемых форматирований, создаёт стиль, назначает.
3. Перемещается к окончанию этого отличия в форматировании и начинает искать следующее отличие.
4. Находит, проверяет есть ли уже такое в массиве используемых форматирований, если есть — назначает соответствующий стиль и идёт на 3, если нет — записывает новый формат в массив, создаёт стиль, назначает и идёт на 3.
И так до конца текста.

Столкнулся с тем, что переменными типа font затруднительно оперировать как переменными базовых типов. Т.е. сравнивать, присваивать (значение) и т.п. Можно это делать как-то удобно? Т.е., например, мне надо записать в элемент массива типа font текущее selection.font. Как это сделать? Как потом проверить равенство/неравенство элементов массива и selection.font?

Как расширит selection вправо вплоть до начала фрагмента текста с иным форматированием?

Вообще мой подход в целом верен или это можно сделать более быстро/просто?


После того как всё это написал немного поэксперементировал и попробовал сделать так:

Код:
1 Selection.Find.ClearFormatting
2 Selection.Find.Text = ""
3 Selection.Find.Font = Selection.Font.Duplicate
4 Selection.Start = 0
5 Selection.End = 0
6 Selection.Find.Execute
Перед тем как запускать макрос выделяю фрагмент текста с искомым форматированием.
Ожидалось, что будет работать так (по сторокам):
1-2. Очищаем поиск.
3. Формату поиска задаём формат аналогичный формату выделенного фрагмента.
4-5. Перемещаем selection в начало документа.
6. Ищем фрагмент с форматированием совпадающим с тем, что было в начале выделено.

Не ищет. Если открыть потом Ctrl+H, то видно, что формат текста настроен. В ручную (Ctrl+H + "Найти далее") тоже не ищет. Если искать не всё форматирование, а только, например болд/неболд, то всё работает.

Что не так, где ошибка?

Спасибо.
Shmel_ вне форума Ответить с цитированием
Старый 26.05.2015, 17:33   #2
Вождь
Форумчанин
 
Аватар для Вождь
 
Регистрация: 29.09.2008
Сообщений: 378
По умолчанию

Почитайте про опцию Word "Вести учет форматирования", она как раз и служит для создания стилей автоматом: Ссылка
Макросы на заказ и готовый пакет - http://mtdmacro.ru/
Вождь вне форума Ответить с цитированием
Старый 27.05.2015, 10:16   #3
Shmel_
 
Регистрация: 26.05.2015
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Вождь Посмотреть сообщение
Почитайте про опцию Word "Вести учет форматирования", она как раз и служит для создания стилей автоматом: Ссылка
У меня не получилось чтобы стили создавались автоматически. Ворд лишь показывает фрагменты с локальным форматированием в списке стилей если включена опция "Отображать как стили: Форматирование текста". Впрочем он так себя ведёт даже если учет форматирования не ведётся.


Локальное форматирование (подчеркивание) есть в списке стилей, но это не стиль (нет значка стиля справа).
Shmel_ вне форума Ответить с цитированием
Старый 27.05.2015, 10:44   #4
Вождь
Форумчанин
 
Аватар для Вождь
 
Регистрация: 29.09.2008
Сообщений: 378
По умолчанию

Цитата:
Сообщение от Shmel_ Посмотреть сообщение
У меня не получилось чтобы стили создавались автоматически...
Они и не создаются, а только отображаются в списке как стили. Создавать надо ручками: выбрали в списке > изменить > ОК. Этот метот быстро и надлядно показывает все форматирование, что есть в документе.
Макросы на заказ и готовый пакет - http://mtdmacro.ru/
Вождь вне форума Ответить с цитированием
Старый 27.05.2015, 10:51   #5
Shmel_
 
Регистрация: 26.05.2015
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Вождь Посмотреть сообщение
Они и не создаются, а только отображаются в списке как стили. Создавать надо ручками: выбрали в списке > изменить > ОК. Этот метот быстро и надлядно показывает все форматирование, что есть в документе.
Тогда никакого профита. Нужны стили.
Shmel_ вне форума Ответить с цитированием
Старый 28.05.2015, 10:56   #6
Shmel_
 
Регистрация: 26.05.2015
Сообщений: 6
По умолчанию

Выяснил, что поиском (Ctrl+H) вообще невозможно задать всех свойств которые могут быть присущи тексту, например, "Selection.Font.Fill...", "Selection.Font.Glow..." и т.п. которые в форматировании текста указываются в "...Шрифт->Текстовые эффекты".

Единственное решение которое приходит мне в голову — написать пару функций одна из которых будет перебирая все свойства копировать один объект типа font в другой, а вторая таким же способом их сравнивать. Затем пользуясь ими проверять последовательно форматирование каждого символа и если оно отличается от всех обнаруженных ранее вариантов форматирования создавать новый стиль, а если совпадает с одинм из ранее обнаруженных вариантов то назначть тот стиль с которым совпадает.

Всё это представляется крайне медленным и, вероятно, не оптимальным. Может быть всё таки есть более разумный подход? Задача всё та же — назначить каждому варианту локального форматированя свой стиль.
Shmel_ вне форума Ответить с цитированием
Старый 28.05.2015, 13:12   #7
shanemac51
Участник клуба
 
Аватар для shanemac51
 
Регистрация: 12.08.2010
Сообщений: 1,079
По умолчанию

когда-то я делала стандарты предприятия(более 100 штук по 20-50 страниц)

---мне было проще------------
любой параграф был оформлен одним стилем, итого получилось около 40 стилей
---------------------------------
но если бы мне надо было ввести формулу воды Н2О или некоторые слова сделать жирными, у меня бы ничего не получилось
Имя-Галина== почта shanemac51@yandex.ru скайп shanemac51 c 8-15мск будни
Сфера интересов--word-excel-access-распознавание
shanemac51 вне форума Ответить с цитированием
Старый 01.06.2015, 18:03   #8
Shmel_
 
Регистрация: 26.05.2015
Сообщений: 6
По умолчанию

Так и не нашёл решения. Пока попробовал как написал выше — две функции, одна для сравнения, другая для копирования всех свойств. Расстраивает то, что приходится последовательно проверять форматирование каждого символа при том, что внутри ворда все эти данные уже есть: раззиповал сохранённый docx-документ. В нём — "document.xml", все отличия форматирования, естественно, начинаются с определённого тега ("<w:b/>", "<w:i/>", '<w:u w:val="single"/>' и т.п.).

Может быть можно как-то через объектную модель ворда добраться до этих данных (откуда начинается изменение формата)?
Shmel_ вне форума Ответить с цитированием
Старый 03.06.2015, 05:25   #9
Вождь
Форумчанин
 
Аватар для Вождь
 
Регистрация: 29.09.2008
Сообщений: 378
По умолчанию

Цитата:
Сообщение от Shmel_ Посмотреть сообщение
...приходится последовательно проверять форматирование каждого символа...
Посмотрите инструкцию
Код:
Selection.SelectCurrentFont
и команду
Код:
Application.Run "SelectSimilarFormatting"
Первая поможет организовать перебор кусков разного формата шрифта, вторая - выбрать сразу все куски.
Макросы на заказ и готовый пакет - http://mtdmacro.ru/

Последний раз редактировалось Вождь; 03.06.2015 в 06:49.
Вождь вне форума Ответить с цитированием
Старый 03.06.2015, 10:27   #10
Shmel_
 
Регистрация: 26.05.2015
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Вождь Посмотреть сообщение
Первая поможет организовать перебор кусков разного формата шрифта, вторая - выбрать сразу все куски.
Большое спасибо. Вы мне открыли целый мир встроенных макросов ворда : ). Буду пробовать.
Shmel_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
СТроковые стили ts-alan HTML и CSS 3 10.10.2013 16:14
Локальное подключение Fermervk Помощь студентам 2 30.10.2011 19:17
локальное и клиент-серверное приложения simka16 Помощь студентам 5 15.01.2011 16:15
[WinApi, Delphi] Как перехватить локальное нажатие клавиши в Edit? Moriarty Win Api 4 19.03.2010 16:29
Форматирование и стили Я_Алешко Microsoft Office Word 2 29.10.2009 11:51