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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.11.2016, 04:10   #1
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию Подстановка в колонтитулы документов сложной структуры

Приветствую, коллеги

Не получается выполнить замены по всему документу Word, если он сложный (колонтитулы с надписями, несколько Sections) при выполнении макроса из Excel
Не выполняется замена внутри колонтитула на 3 и 4 страницах (где в рамке документа присутствует текст в виде надписей)

Макрос рабочий, но работает он только если:
- запущен из Word (применительно к текущему документу)
- запущен из Excel ВТОРОЙ раз в режиме ТОЛЬКО ЧТЕНИЕ (первый раз макрос открывает с диска Word документ - макрос видит только 6 StoryRanges (не все). Когда, не закрыв ранее открытый шаблон Word, запускаем макрос снова, - в Word выскакивает окошко, - типа, документ уже открыт, - "открыть только для чтения?" И вот когда мы в окне Word нажимаем «открыть только для чтения» - вот только тогда цикл видит все 12 StoryRanges)

За основу взят код отсюда (вариант Step3)
http://word.mvps.org/faqs/customizat...ceAnywhere.htm

когда макрос находит всё, он выводит в окне Immediate следующие типы StoryType:
Цитата:
1;5;5;6;7;7;8;9;9;9;10;10;10;10;11; 11;11;11;12;13;15;16;
когда макрос находит не всё, он выводит в окне Immediate следующие типы StoryType:
Цитата:
1;5;5;12;13;15;16;
причем, если отключить выполнение замен (строку WordReplacements myStoryRange, Key$, txt$),
то тогда он находит все объекты Range и выполняет замену внутри колонтитулов

Вот мой макрос:
Код:
Sub ToStartFromWord()
    Replace_Text ThisDocument, "{Номер объекта}", "111"
End Sub

Sub ToStartFromExcel()
    Filename$ = "c:\test.docx"
    Set WA = CreateObject("word.application"): WA.Visible = True
    Set word_document = WA.documents.Open(Filename$)
    Replace_Text word_document, "{Номер объекта}", "111"
End Sub

Sub Replace_Text(ByRef doc, ByVal Key$, ByVal txt$)
    Dim myStoryRange As Object, lngJunk As Long
    lngJunk = doc.Sections(1).Headers(1).Range.StoryType    'Fix the skipped blank Header/Footer problem
    
    For Each myStoryRange In doc.StoryRanges
        Do
            ' если следующую строку отключить - то находит все StoryRange
            WordReplacements myStoryRange, Key$, txt$

            Debug.Print myStoryRange.StoryType & ";";
            On Error Resume Next
            Select Case myStoryRange.StoryType
                Case 6, 7, 8, 9, 10, 11
                    'Debug.Print myStoryRange.StoryType, "shapes=" & myStoryRange.ShapeRange.Count
                    If myStoryRange.ShapeRange.Count > 0 Then
                        For Each oShp In myStoryRange.ShapeRange
                            If oShp.TextFrame.HasText Then WordReplacements oShp.TextFrame.TextRange, Key$, txt$
                        Next
                    End If
                Case Else
                    'Do Nothing
            End Select
            On Error GoTo 0
            
            Set myStoryRange = myStoryRange.NextStoryRange    'Get next linked story (if any)
        Loop Until myStoryRange Is Nothing
    
    Next myStoryRange
End Sub

Sub WordReplacements(ByVal rng As Object, ByVal FindText As String, ByVal ReplaceText As String)
    On Error Resume Next: rng.Find.Execute FindText:=FindText, ReplaceWith:=ReplaceText, Replace:=2
End Sub

Кто-нибудь с таким сталкивался?
Почему при открытии файла только для чтения, всё работает?
(если в коде открытия шаблона Word прописать ReadOnly = TRUE, файл откроется только для чтения БЕЗ ПОЯВЛЕНИЯ ДИАЛОГОВОГО ОКНА, и замены выполнятся не все. Т.е. появление этого диалогового окна что-то обновляет в документе, после чего все работает.)

Последний раз редактировалось EducatedFool; 16.11.2016 в 01:44.
EducatedFool вне форума Ответить с цитированием
Старый 15.11.2016, 19:50   #2
Step_UA
Форумчанин
 
Аватар для Step_UA
 
Регистрация: 09.06.2011
Сообщений: 388
По умолчанию

почему не знаю ...
Такие "сбои" не редки при изменении диаппазона из перечисления - на что Вы и сами указали, причем работа с их дубликатами не устраняет проблему.
Понимаю что костыль, но можно собрать диаппазоны например в коллекцию, а затем пройти по ним
Код:
    Dim rangeColl As New Collection
    For Each myStoryRange In doc.StoryRanges
        rangeColl.Add myStoryRange
    Next
    
    For Each myStoryRange In rangeColl 
       ...
на неконкретные вопросы даю неконкретные ответы ...
Step_UA вне форума Ответить с цитированием
Старый 15.11.2016, 22:22   #3
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Спасибо большое, я как-то и не подумал про такой простой способ
Сделал, всё получилось

Последний раз редактировалось EducatedFool; 16.11.2016 в 01:43.
EducatedFool вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Конструирование файлов с элементами сложной структуры andrey_b Паскаль, Turbo Pascal, PascalABC.NET 1 04.12.2013 09:46
Разработка программы сложной структуры(исправить) Stellar_light Помощь студентам 0 20.05.2011 18:01
Передача сложной структуры пользовательским сообщением? Johnson Общие вопросы Delphi 15 27.12.2010 21:55
Создание сложной структуры XML artemavd Общие вопросы Delphi 24 19.11.2010 19:57
Сохранение в файл сложной динамической структуры _Инженер_ Общие вопросы Delphi 24 20.10.2008 09:38