Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Word VBA

Автор: svs123456789
Дата сообщения: 29.08.2016 15:27
не видел ли ктонибудь процедуры для
применения всем таблицам в файле свойств выравнивание по ширине окна + установить заголовки ?
Автор: tezarius
Дата сообщения: 06.09.2016 11:23
Кто сможет помочь:
Есть документ, он изменяется в течении года вручную. Необходимо сравнить документ с предыдущим и занести изменения в базу данных (допустим Access) и с датой изменения.

С чего начать? какие функции использовать?
Автор: Dronton2
Дата сообщения: 06.09.2016 13:20
tezarius
сначала нужно понять, что вы подразумеваете под изменениями:
- поменяли что-то в тексте документа (т.е., изменения в последовательности букв)
- поменяли что-то в стилях + где-то в тексте поменяли размер шрифта, интервал, отступы и т.п.
- документ является формой, изменять можно только значения в полях формы.

и в каком виде изменения должны храниться в базе данных.

Исходники программ сравнения документов можно посмотреть на http://winmerge.org/ или http://kdiff3.sourceforge.net/
Автор: tezarius
Дата сообщения: 08.09.2016 14:09
Dronton2
1) загрузили документ Word.
2) сравнили с базой ( если база пустая, то добавили эталон для сравнения)
3) сохранили изменения для будущих сравнений.

- поменяли что-то в тексте документа (т.е., изменения в последовательности букв, слов) - Да.
- поменяли что-то в стилях + где-то в тексте поменяли размер шрифта, интервал, отступы и т.п. -Нет
- документ является формой, изменять можно только значения в полях формы. - Нет

Хранить в базе должны только изменения. Хранить абзацами ( они определяются по началу - типа 1.1 , 1.2, 1.1.1), другим полем добавлять дату сохранения.

Как часть решения можно взять отсюда http://www.cyberforum.ru/vba/thread615562.html

P.S. http://winmerge.org/ это с++, хотелось бы все таки реализация на VBA.
Автор: Dronton2
Дата сообщения: 08.09.2016 15:28
tezarius
Ну, если минимальный кусок равен абзацу (и нумерация абзацев упорядочена), то тогда WinMerge - излишне сложный инструмент. Но посмотреть общую логику их алгоритма нужно обязательно.

Цитата:
С чего начать? какие функции использовать?
Начать нужно не с поиска функций, а с составления алгоритма.
Представьте, что каждый абзац - это строка. Тогда документ представляет из себя список строк. Значит, вам нужно сравнить два списка строк и определить, какие строки были изменены, какие - удалены, и какие добавлены.
Если в документе не может быть одинаковых абзацев - задача проста:
1. Каждый абзац старого документа сравниваете с каждым абзацем нового документа. Если они равны, устанавливаете для этих абзацев флаг "равно".
2. Последовательно проходите по абзацам старого документа. Находите подряд идущие абзацы, без флага "равно". Сравниваете их количество с количеством соответствующих абзацев из нового документа. Если количество равно, то каждый из этих абзацев был изменён на соответствующий абзац из нового документа. Если в старом документе количество этих абзацев меньше, чем в новом, значит, часть абзацев была изменена, а часть - удалена. Если больше - значит, часть абзацев была изменена, а часть добавлена.
Таким образом, для каждого абзаца из старого документа установлен один из признаков:
- равен абзацу из нового документа
- изменён в новом документе (и указатель на соответствующиё абзац в новом документе)
- удалён
в новом документе нужен только один признак:
- добавлен

И сохраняете в базу данных: для всех абзацев из старого документа, у которых не установлен признак "равен" добавляете записи с указанием признака и:
- для удалённых: порядкового номера абзаца в старом документе
- для изменённых: порядкового номера абзаца в старом документе и текста соответствующего нового абзаца
- для добавленных: порядкового номера абзаца в старом документе, после которого добавляется новый абзац и его текста.

Это приблизительно и вкратце.

Если в документе может быть несколько одинаковых абзацев - задача сравнения существенно усложнится.
Автор: Dronton2
Дата сообщения: 09.09.2016 09:20
tezarius
Похоже, что я сильно погорячился с простотой алгоритма.
Рассмотрим примитивный пример:
Пусть документ состоит из 4 абзацев. Каждый абзац - из 1 буквы:

Код: A
B
C
D

Страницы: 1234567891011121314151617181920212223242526

Предыдущая тема: Кластеризация изображений


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.