Друзья прошу помощи. Подскажите как выделить через макрос текст Wordа который допустим распологается между "Слово1" и "Слово2". Возможно ли это осуществить?
Нужно просто чтобы выделился текст чтобы потом копировать ctrl+c. Проблема решена. Однако текст выделяет с пробелами между Словом1 и словом2. Как теперь сделать чтобы выделить лишь текст без пробелов. В данный момент получается так: слово1__пробел до__АБЗАЦ__пробел после__слово2 ====> пробел__АБЗАЦ__пробел, а нужно чтобы было просто АБЗАЦ
Код
Sub Выделить_между()
Dim MyRange As Range, rStart&, rEnd&
Set MyRange = ActiveDocument.Content
With MyRange
With .Find
.ClearFormatting
.Text = "Слово1"
.Forward = True
.Wrap = wdFindStop
.Format = False
.MatchCase = False
.MatchWholeWord = True
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
.Execute
If .Found Then rStart = MyRange.End: rEnd = rStart
End With
End With
Set MyRange = ActiveDocument.Content
With MyRange
With .Find
.Text = "Слово2"
.Execute
If .Found Then rEnd = MyRange.Start
End With
End With
If rEnd > rStart Then
ActiveDocument.Range(rStart, rEnd).Select
Selection.Copy
End If
End Sub
Как вариант без оптимизации и с учетом нескольких пробелов но не неразрывных, но есть чуствительность к регистру
Скрытый текст
Код
Sub Выделить_между1()
Dim MyRange As Range, rStart&, rEnd&
Set MyRange = ActiveDocument.Content
With MyRange
With .Find
.ClearFormatting
.Text = "<слово1> @<"
.Forward = True
.Wrap = wdFindStop
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = True
.MatchSoundsLike = False
.MatchAllWordForms = False
.Execute
If .Found Then rStart = MyRange.End: rEnd = MyRange.End
End With
End With
Set MyRange = ActiveDocument.Content
With MyRange
With .Find
.Text = "> @<слово2>"
.MatchWildcards = True
.Execute
If .Found Then rEnd = MyRange.Start
End With
End With
If rEnd > rStart Then
ActiveDocument.Range(rStart, rEnd).Select
Selection.Copy
End If
End Sub
но в целом можно сперва найти по маске диапазон <слово1>*<слово2> и если найдено то в нем также искать начало и конец.
Скрытый текст
Код
Sub Выделить_между2()
Dim MyRange As Range, rStart&, rEnd&
Set MyRange = ActiveDocument.Content
With MyRange
With .Find
.ClearFormatting
.Text = "<слово1> @* @<слово2>"
.Forward = True
'.Wrap = wdFindStop
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = True
.MatchSoundsLike = False
.MatchAllWordForms = False
.Execute
If .Found And MyRange.Words.Count > 2 Then
rStart = MyRange.Words(2).Start
rEnd = MyRange.Words(MyRange.Words.Count - 1).Start + Len(Trim(MyRange.Words(MyRange.Words.Count - 1)))
ActiveDocument.Range(rStart, rEnd).Select
Selection.Copy
End If
End With
End With
End Sub
Спасибо большое, буду пробовать. По маске не получится, потому что будет постоянно меняться содержимое текста- Абзац. В моем случае получается выделение самого текста- Абзац и одного пробела сверху и несколько пустых строк снизу. Поэтому дальнейшая вставка текста-Абзац выходит некорректно. Приходится вручную убирать эти пробелы.
evgenij_sar, все можно сделать, Дали б пример реальный, а не условный , было б проще. Маска не учитывает что между слово 1 и 2 разве что чуствительна к регистру даже если отказаться от этого то сперва ищем слово1. потом берем регион от старта найденного и до последнего в документе, ищем слово2. получаем Start и End нужного фрагмента а далее в зависимости от того что нужно , по словам или иными путями найти в нем начало нужного и конец - дело техники.
К сожалению ни один из примеров не работает. Попробую немного по другому обьяснить. Есть документ в ворде, типа акта с таким таким содержимым один в один с жирным шрифтом и подчеркиванием: ЗАКЛЮЧЕНИЕ ТЕКСТ ТЕКСТ ТЕКСТ
Подпись
Нужно чтобы копировался только ТЕКСТ ТЕКСТ ТЕКСТ без одного пробела сверху и пустых строк снизу.
выводите на печать, запускаете макрос, который удаляет лишнее, выделяет все оставшееся, копирует. Закрываете файл без сохранения, получаете в буфере нужный текст, Т.е то, что вы реализовали своим макросом но более просто
С этим понятно) В прочем так и делаю, однако в с буфера приходится вставлять данные с документа в другую программу, а там вставляется с пробелами. Приходится удалять вручную. Просто если не будет слов заключение и подпись, все равно перед и после другие слова стоят. Просто то что хочу скопировать это всего лишь мелкий фрагмент который стоит где то по середине документа на 10 странице из 20.
Там переводы строк. Сверху одна и снизу строки 4. Больше там ничего нет. Просто нужно чтобы выделялся только ТЕКСТ ТЕКСТ ТЕКСТ без пустых строк Сам текст внутри он может быть разным абсолютно каждое заключение.
Sub Выделить_между2()
Dim MyRange As Range, rStart&, rEnd&
Set MyRange = ActiveDocument.Content
With MyRange
With .Find
.ClearFormatting
.Text = "<ЗАКЛЮЧЕНИЕ>*<Подпись>"
.Forward = True
.Wrap = wdFindStop
'.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = True
.MatchSoundsLike = False
.MatchAllWordForms = False
.Execute
If .Found And MyRange.Words.Count > 2 Then
rStart = MyRange.Sentences(2).Start
With MyRange.Sentences(MyRange.Sentences.Count - 1)
rEnd = .Words(.Words.Count - .Paragraphs.Count + 1).End
End With
ActiveDocument.Range(rStart, rEnd).Select
Selection.Copy
'ActiveDocument.Range(rStart, rEnd).Copy
End If
End With
End With
End Sub
а так и пробелы до и после проигнорит
Скрытый текст
Код
Sub Выделить_между3()
Dim MyRange As Range, MyRange2 As Range, rStart&, rEnd&
Set MyRange = ActiveDocument.Content
With MyRange
With .Find
.ClearFormatting
.Text = "<ЗАКЛЮЧЕНИЕ>*<Подпись>"
.Forward = True
.Wrap = wdFindStop
'.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = True
.MatchSoundsLike = False
.MatchAllWordForms = False
.Execute
If .Found And MyRange.Words.Count > 2 Then
rStart = MyRange.Start: rEnd = MyRange.End
With MyRange
With .Find
.ClearFormatting
.Text = "<ЗАКЛЮЧЕНИЕ>*<"
.Forward = True
.Wrap = wdFindStop
.MatchWildcards = True
.Execute
If .Found Then
rStart = MyRange.End
Set MyRange = ActiveDocument.Range(rStart, rEnd)
With MyRange
With .Find
.ClearFormatting
.Text = ">*<Подпись>"
.Forward = False
.Wrap = wdFindStop
.MatchWildcards = True
.Execute
If .Found Then
rEnd = MyRange.Start
ActiveDocument.Range(rStart, rEnd).Select
Selection.Copy
'ActiveDocument.Range(rStart, rEnd).Copy
End If
End With
End With
End If
End With
End With
End If
End With
End With
End Sub
Да конечно. Самое интересное то когда я вставляют свой текст за место вашего в файле Example, то ничего не получается. Например убираю ЗАКЛЮЧЕНИЕ ТЕКСТ ТЕКСТ ТЕКСТ
Подпись И потом вставляю свои данные и уже не работает. Само собой слова заключение и подпись также вставляются с другого документа Да еще заметил что с 3 макросом в файле не выделяется последняя точка.
Спасибо... буду копаться дальше до истины) Итог тот же. При удалении текста и вставки своего в документ макросы не работают, конечно кроме моего первого, который выделяет и пустые строки и текст. Не понятно что мешает работать макросу с одними и теми же замыкающими текст словами. Шрифт тот же, подчёркивания. Разница только в методе ввода. От руки или вставка.
На примере по маске не ищется слово ЗАКЛЮЧЕНИЕ. Стоит его ввести в ручную и все корректно отрабатывает. Маску если заменить на <Заключение>, все работает. В XML видно что там кроме первой литеры все прописные, <w:u w:val="single"/></w:rPr><w:t>Заключение</w:t></w:r></w:p><w:p w:rsidR="00616EF3" w:rsidRDefault="00616EF3" w:rsidP="00616EF3"><w:pPr><w:widowControl w:val="0"/>
Есть программа которая формирует на основании введенных данных итоговый документ и открывает его для печати. Потом сохраняет его в своей базе. Шрифт всего документа Arial и заключение и подпись подчеркнуты всегда. Самый первый макрос прекрасно по волшебству с ним отрабатывает причём при любом шрифте, размере, прописных или заглавных, подчеркнутых и нет, но минус выделяет пустые строки, а вот последующие Вами предоставленные ругаются. Что в них общего и какая разница...