1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
Sub СформироватьПроекты() ПутьШаблона = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, ИмяФайлаШаблона) НоваяПапка = NewFolderName & Application.PathSeparator Dim row As Range, pi As New ProgressIndicator r = Cells(Rows.Count, "A").End(xlUp).row: rc = r - 2 If rc < 1 Then MsgBox "Строк для обработки не найдено", vbCritical: Exit Sub pi.Show "Формирование проектов": pi.ShowPercents = True: s1 = 10: s2 = 90: p = s1: a = (s2 - s1) / rc pi.StartNewAction , s1, "Запуск приложения Microsoft Word" ' Dim WA As Word.Application, WD As Word.Document: Set WA = New Word.Application ' c подключением библиотеки Word Dim WA As Object, WD As Object: Set WA = CreateObject("Word.Application") ' без подключения библиотеки Word For Each row In ActiveSheet.Rows("3:" & r) With row АдресЖилогоДома = Trim$(.Cells(1)) Filename = НоваяПапка & АдресЖилогоДома & РасширениеСоздаваемыхФайлов pi.StartNewAction p, p + a / 3, "Создание нового файла на основании шаблона", АдресЖилогоДома Set WD = WA.Documents.Add(ПутьШаблона): DoEvents pi.StartNewAction p + a / 3, p + a * 2 / 3, "Замена данных ...", АдресЖилогоДома For i = 1 To КоличествоОбрабатываемыхСтолбцов FindText = Cells(1, i): ReplaceText = Trim$(.Cells(i)) ' так почему-то заменяет не всё (не затрагивает таблицу) 'WA.Selection.Find.Execute FindText, , , , , , , wdFindContinue, False, ReplaceText, True pi.line3 = "Заменяется поле " & FindText WA.Selection.WholeStory With WD.Range.Find .Text = FindText .Replacement.Text = ReplaceText .Forward = True .Wrap = 1 .Format = False: .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False .Execute Replace:=2 End With ' ЗДЕСЬ БЫЛ КОД ДЛЯ ПЕРВЫХ ВЕРХНИХ И НИЖНИХ КОЛОНТИТУТОЛОВ ' WA.ActiveWindow.ActivePane.View.SeekView = 5 ' активировать первый верхний колонтитул ' With WA.Selection.Find ' .Text = FindText ' .Replacement.Text = ReplaceText ' .Forward = True ' .Wrap = 1 ' .Format = False: .MatchCase = False ' .MatchWholeWord = False ' .MatchWildcards = False ' .MatchSoundsLike = False ' .MatchAllWordForms = False ' .Execute Replace:=2 ' End With ' WA.ActiveWindow.ActivePane.View.SeekView = 2 ' активировать первый нижний колонтитул ' With WA.Selection.Find ' .Text = FindText ' .Replacement.Text = ReplaceText ' .Forward = True ' .Wrap = 1 ' .Format = False: .MatchCase = False ' .MatchWholeWord = False ' .MatchWildcards = False ' .MatchSoundsLike = False ' .MatchAllWordForms = False ' .Execute Replace:=2 ' End With WA.ActiveWindow.ActivePane.View.SeekView = 9 ' активировать непервый верхний колонтитул With WA.Selection.Find .Text = FindText .Replacement.Text = ReplaceText .Forward = True .Wrap = 1 .Format = False: .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False .Execute Replace:=2 End With WA.ActiveWindow.ActivePane.View.SeekView = 10 ' активировать непервый нижний колонтитул With WA.Selection.Find .Text = FindText .Replacement.Text = ReplaceText .Forward = True .Wrap = 1 .Format = False: .MatchCase = False .MatchWholeWord = False .MatchWildcards = False .MatchSoundsLike = False .MatchAllWordForms = False .Execute Replace:=2 End With WA.ActiveWindow.ActivePane.View.SeekView = 0 ' вернуться в тело документа DoEvents Next i pi.StartNewAction p + a * 2 / 3, p + a, "Сохранение файла ...", АдресЖилогоДома, " " WD.SaveAs Filename: WD.Close False: DoEvents p = p + a End With Next row pi.StartNewAction s2, , "Завершение работы приложения Microsoft Word", " ", " " WA.Quit False: pi.Hide msg = "Сформировано " & rc & " проектов. Все они находятся в папке" & vbNewLine & НоваяПапка MsgBox msg, vbInformation, "Формирование ПРОЕКТОВ прошло успешно" End Sub |
Формулировка задачи:
Здравствуйте!
В ходе разработки проектов возникла необхоидмость создавать большое количество пояснительных записок. Иными словами — создание большого количества документов word по шаблону. Макрос ищет нужную комбинацию символов и заменяет его на заданное значение или текст из ячейки в экселе.
Однако возникла проблема:
дело в том, что в проекте используется колонтитул для описания проекта (таблица). В этой таблице так же есть значения, которые должны меняться, однако макрос этого не делает.
Подскажите пожалуйста, что необходимо добавить в макрос?
Код к задаче: «Замена текста в колонтитуле макросом»
textual
WA.ActiveWindow.ActivePane.View.SeekView = 9 ' активировать непервый нижний колонтитул With WA.Selection.Find ' ... End With WA.ActiveWindow.ActivePane.View.SeekView = 9 ' активировать непервый верхний колонтитул With WA.Selection.Find ' ... End With WA.ActiveWindow.ActivePane.View.SeekView = 0 ' вернуться в тело документа
Полезно ли:
12 голосов , оценка 3.833 из 5
Ну, если тупо переносить макрос из Word в Excel — скорее всего, не сработает. Я вот записал в Word макрос, подключил в Excel библиотеку, чуток подшаманил (может, чего лишнего оставил, но, тем не менее):
Код |
---|
Sub T() Dim objW As Word.Application'переменная для приложения Dim objWd As Word.Document 'переменная для документа Set objW = New Word.Application 'устанавливаем переменным значения Set objWd = objW.Documents.Add objW.Visible = True 'показываем созданную красоту objWd.Activate 'это вот фиг знает, надо или нет, скорее всего - надо 'дальше - тупо повторяю макрос из Word, только спереди указываю переменную документа objWd.ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader objWd.ActiveWindow.Selection.TypeText Text:="Это - новый колонтитул." objWd.ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument End Sub |
В результате макрос создает новый сеанс Word, создает в нем новый документ и в верхний колонтитул записывает многозначительную фразу. А потом переключается в обычный вид ввода текста.
Поиск и замена в колонтитулах
- kuksha
- Начинающий
- Сообщения: 23
- Зарегистрирован: 17.07.2006 (Пн) 11:27
Поиск и замена в колонтитулах
Запускаю автозапись макросов, ввожу условия для поиска и замены через стандартное меню ворда. Слова успешно заменяются и в основном тексте и в колонтитулах.
Запускаю отдельно полученный макрос — слова заменяются только в основном тексте, в колонтитулах замена не происходит…
Пробовал в условиях поиска задавать отдельно стили — верхний и нижний колонтитулы (там можно только поотдельности). Тоже отрабатывает как надо, но макросы которые получаются опять с колонтитулами не работают…
Как производить поиск и замену в колонтитулах?
- arvitaly
- Постоялец
- Сообщения: 485
- Зарегистрирован: 12.04.2009 (Вс) 0:30
- Откуда: Казань
-
- Сайт
- ICQ
Re: Поиск и замена в колонтитулах
arvitaly » 01.06.2009 (Пн) 13:40
Покажи код макроса и версию офиса.
Код ищет и удаляет в верхних и нижних колонтитулах в Word 2003
- Код: Выделить всё
ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "gggg"
.Replacement.Text = "aaaa"
.Forward = True
.Wrap = wdFindContinue
End With
Selection.Find.Execute Replace:=wdReplaceAll
ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageFooter
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "gggg"
.Replacement.Text = "aaaa"
.Forward = True
.Wrap = wdFindContinue
End With
Selection.Find.Execute Replace:=wdReplaceAll
- kuksha
- Начинающий
- Сообщения: 23
- Зарегистрирован: 17.07.2006 (Пн) 11:27
Re: Поиск и замена в колонтитулах
kuksha » 01.06.2009 (Пн) 16:34
Спасибо ОГРОМНОЕ! Заработало! А то у меня макрос-калека сейчас без этого…
У меня тоже 2003, и при выборе верхнего колонтитула в стилях в окне поиска-замены, автозаписывался вот такой код:
- Код: Выделить всё
Selection.Find.ClearFormatting
Selection.Find.Style = ActiveDocument.Styles("Верхний колонтитул")
Selection.Find.ParagraphFormat.Borders.Shadow = False
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "ааа"
.Replacement.Text = "ооо"
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
Кстати, если у меня этот код будет в цикле стоять, то точно замедление работы будет(около 8000 проходов, по словарю…) Может его для ускорения работы вынести в отдельный цикл? Ведь не всегда в документе есть колонтитулы… Как бы тогда проверку сделать на наличие колонтитулов в документе, прежде чем запускать цикл для колонтитулов?
- arvitaly
- Постоялец
- Сообщения: 485
- Зарегистрирован: 12.04.2009 (Вс) 0:30
- Откуда: Казань
-
- Сайт
- ICQ
Re: Поиск и замена в колонтитулах
arvitaly » 01.06.2009 (Пн) 16:37
Поищи пока ответ сам
- arvitaly
- Постоялец
- Сообщения: 485
- Зарегистрирован: 12.04.2009 (Вс) 0:30
- Откуда: Казань
-
- Сайт
- ICQ
Re: Поиск и замена в колонтитулах
arvitaly » 02.06.2009 (Вт) 1:14
Набросал функцию вроде должна работать
- Код: Выделить всё
Function isHColon(paneState As String) As Boolean
ActiveWindow.ActivePane.View.SeekView = paneState
Selection.ClearFormatting
If Selection.Words.Count > 0 Then
If Selection.Words(1) <> "" And Asc(Selection.Words(1)) <> 13 Then
isHColon = True
Else
isHColon = False
End If
Else
isHColon = False
End If
ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocumentEnd Function
Sub RUN_THIS()
MsgBox isHColon(wdSeekCurrentPageHeader)
End Sub
- viter.alex
- Бывалый
- Сообщения: 221
- Зарегистрирован: 27.07.2008 (Вс) 20:17
- Откуда: Montreal
-
- Сайт
- ICQ
Re: Поиск и замена в колонтитулах
viter.alex » 02.06.2009 (Вт) 20:48
Может быть автору темы понадобится мой вариант. Если работать с окном нет возможности (приложение не видно), то можно искать в колонтитулах другим способом. Сделал на скорую руку, но при необходимости можно усложнить и расширить.
- Код: Выделить всё
Sub SearchInHeadersFooters()
Dim oHeadFtr As HeaderFooter, oSec As Section
For Each oSec In ActiveDocument.Sections
'Поиск в верхних колонтитулах
For Each oHeadFtr In ActiveDocument.Sections(1).Headers
If SearchInRange(oHeadFtr.Range) Then MsgBox "Нашёл!"
Next
'Поиск в нижних колонтитулах
For Each oHeadFtr In ActiveDocument.Sections(1).Footers
If SearchInRange(oHeadFtr.Range) Then MsgBox "Нашёл!"
Next
Next
End Sub
Function SearchInRange(oRng As Range) As Boolean
With oRng.Find
.Text = "верхний колонтитул"
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
SearchInRange = .Execute
End With
End Function
Лучше день потерять — потом за пять минут долететь!
- kuksha
- Начинающий
- Сообщения: 23
- Зарегистрирован: 17.07.2006 (Пн) 11:27
Re: Поиск и замена в колонтитулах
kuksha » 15.06.2009 (Пн) 15:33
СПАСИБО всем, кто откликнулся!
Был занят, а сейчас вот руки дошли — буду разбираться и пробовать.
- kuksha
- Начинающий
- Сообщения: 23
- Зарегистрирован: 17.07.2006 (Пн) 11:27
Re: Поиск и замена в колонтитулах
kuksha » 23.06.2009 (Вт) 15:25
Всем спасибо. Получилось:
сначала прогон по основному содержимому документа,
потом переключение на верхний колонтитул wdSeekCurrentPageHeader , опять прогон
потом прогон по нижнему колонтитулу wdSeekCurrentPageFooter .
учитывая, что в цикле более 8000 проходов, времени тратится довольно много.
Вот сейчас ещё оказалось, что поиск/замена в ссылках тоже не срабатывает, как в колонтитулах раньше.
2 вопроса:
1) как искать в ссылках? (справка о WdSeekView у меня запорчена, если речь о ней — вижу дюжину WdSeek* и не могу прочесть что есть что…)
2) нельзя ли как-то объединить все эти прогоны? (если окажется, что в идеале нужно прогонять по всем WdSeek*, то… сколько же это времени займёт!)
- viter.alex
- Бывалый
- Сообщения: 221
- Зарегистрирован: 27.07.2008 (Вс) 20:17
- Откуда: Montreal
-
- Сайт
- ICQ
Re: Поиск и замена в колонтитулах
viter.alex » 23.06.2009 (Вт) 16:07
Что значит искать в ссылках? В сносках, наверное?
Вот WdSeekView Enumeration
- Код: Выделить всё
wdSeekCurrentPageFooter 10 The current page footer.
wdSeekCurrentPageHeader 9 The current page header.
wdSeekEndnotes 8 Endnotes.
wdSeekEvenPagesFooter 6 The even pages footer.
wdSeekEvenPagesHeader 3 The even pages header.
wdSeekFirstPageFooter 5 The first page footer.
wdSeekFirstPageHeader 2 The first page header.
wdSeekFootnotes 7 Footnotes.
wdSeekMainDocument 0 The main document.
wdSeekPrimaryFooter 4 The primary footer.
wdSeekPrimaryHeader 1 The primary header.
Кстати, так это дело можно и объединить, запусти цикл от 1 до 10, а затем в цикле меняй
- Код: Выделить всё
For i=1 to 10
ActiveWindow.ActivePane.View.SeekView = i
Next i
- kuksha
- Начинающий
- Сообщения: 23
- Зарегистрирован: 17.07.2006 (Пн) 11:27
Re: Поиск и замена в колонтитулах
kuksha » 23.06.2009 (Вт) 19:13
Спасибо, теперь вижу что есть что
Да, конечно я сноски имел ввиду, оговорился.
Пока в лоб сделаю, чтобы работало.
Насчёт вложенного цикла по перебору wdSeek* ВНУТРИ КАЖДОГО прохода основного цикла (в котором 8000 проходов) — получим 88000 проходов!
Я вообще-то имел ввиду оставить 8000, но наверное это единственный путь…
- viter.alex
- Бывалый
- Сообщения: 221
- Зарегистрирован: 27.07.2008 (Вс) 20:17
- Откуда: Montreal
-
- Сайт
- ICQ
Re: Поиск и замена в колонтитулах
viter.alex » 23.06.2009 (Вт) 20:35
Я не поленился и заглянул в справку на тему StoryRanges Collection Object. Там приведен пример, который полностью, как мне кажется, соответствует твоим запросам.
Тебе нужно искать что-то в разных структурных элементах документа: сносках, концевых сносках, колонтитулах и пр. Все эти структурные элементы, если они есть в документе, являются элементами коллекции StoryRanges. Задача состоит в том, чтобы искать в каждом из этих элементов.
То, что ты делаешь сейчас, это переключение между разными видами (переход по этим структурным элементам на экране) и поиск в Selection. Это не есть гуд. Чтобы получить элемент из документа в 99% случаев выбирать на экране его не нужно. К нему можно обратиться напрямую через объектную модель документа.
Вот немного измененный пример из справки. В нем перебираются все такие структурные элементы, которые есть в документе и в них ведется поиск. Этот метод будет работать пошустрее твоего с переключением видов, хотя бы потому, что не будет мелькат экран. Если не будет работать, пиши, разберемся.
- Код: Выделить всё
Sub FindInStories()
Dim myStoryRange As Range
For Each myStoryRange In ActiveDocument.StoryRanges
With myStoryRange
With .Find
.Text = "ааа"
.Replacement.Text = "ооо"
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
.Execute Replace:=wdReplaceAll
End With
While Not (.NextStoryRange Is Nothing)
Set myStoryRange = .NextStoryRange
With .Find
.Text = "ааа"
.Replacement.Text = "ооо"
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
.Execute Replace:=wdReplaceAll
End With
Wend
End With
Next myStoryRange
End Sub
Лучше день потерять — потом за пять минут долететь!
- Nickson
- Начинающий
- Сообщения: 1
- Зарегистрирован: 27.02.2012 (Пн) 15:45
Re: Поиск и замена в колонтитулах
Nickson » 27.02.2012 (Пн) 15:50
Re: Поиск и замена в колонтитулах
viter.alex » 23.06.2009 (Вт) 20:35
Добрый день!
Почему-то у меня этот пример не работает в цикле с разными именами файлов. Первый раз работает а потом нет. Среда VB6. Не подскажете, как правильно открывать, закрывать в данном случае файлы, может, какие-то объекты надо очищать. Спасибо.
- Shurrik
- Продвинутый пользователь
- Сообщения: 110
- Зарегистрирован: 20.05.2004 (Чт) 5:35
- Откуда: Керчь, Крым
Re: Поиск и замена в колонтитулах
Shurrik » 28.02.2012 (Вт) 10:05
Несколко лет назад тоже споткнулся об эти грабли, мне надо было заменять тект в надписях.
Пашел пример, уже не помню где, в котором замена происходит везде.
Теперь просто вставляю в программу функцию и пользуюсь.
- Код: Выделить всё
' WORD (WO) находит текст (p) и меняет его на (t)
' Dim WO As Object = CreateObject("Excel.Application")Private Sub ZamText(ByVal WO As Object, ByVal p As String, ByVal t As String)
Dim Story As Object
For Each Story In WO.Selection.Document.StoryRanges
Do
With Story.Find
.Text = p : .Replacement.Text = t
.Wrap = 1 : .Execute(Replace:=2)
End With
Story = Story.NextStoryRange
Loop While Not Story Is Nothing
Next
End Sub
Колесо: Хочешь жить? Умей вертеться.
Вернуться в VBA
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1
I’m trying to make a macro in Excel which opens a Word document, find a especify text, which is inside of footer in word doc, and replace it for a text.
At the moment, my macro opens the word doc but I couldn’t figure out how to get into footer and find those texts.
Dim objWord
Dim objDoc
Set objWord = CreateObject("Word.Application")
Set objDoc = objWord.Documents.Open(ThisWorkbook.Path & "/NotaPromissoriaAutomatica.docx")
objWord.Visible = True
The footer have two texts which have to be replaced
1 — VAR_CIDADE > Which will be replaced the current city (which is in A1 of my excel table)
2 — VAR_DATA > Which will be replaced the current date (which is in A2 of my excel table)
braX
11.5k5 gold badges20 silver badges33 bronze badges
asked Apr 5, 2019 at 13:22
5
I created a test document with a single page, header and footer, with the footer using the keyword «VAR_DATA». The example code below will search for all footers in the document and make the replacement. Notice that the code only searches in Section(1)
though. If you have more sections, you may have to create an outer loop to search for each footer in every section.
Option Explicit
Public Sub FixMyFooter()
Dim myWord As Object
Dim myDoc As Word.Document
Set myWord = CreateObject("Word.Application")
Set myDoc = myWord.Documents.Open("C:Tempfootertest.docx")
Dim footr As Word.HeaderFooter
For Each footr In myDoc.Sections(1).Footers
With footr.Range.Find
.Text = "VAR_DATA"
.Replacement.Text = Format(Now(), "dd-mmm-yyyy")
.Execute Replace:=wdReplaceAll, Forward:=True, Wrap:=wdFindStop
End With
Next footr
myDoc.Save
myWord.Quit
End Sub
You’ll need to expand the example to find your additional text with your own formatting.
answered Apr 5, 2019 at 15:04
PeterTPeterT
8,1671 gold badge17 silver badges38 bronze badges