1

Тема: Поиск в Ворде

Часто пользуюсь поиском по документу, но как то мне понадобилось реализовать программную вставку примечаний через поиск (те самые, что на вкладке "рецензирование").
Макрос написал без проблем, но поиск через объект Range.Find работает не так, как ожидалось.
Суть в следующем, поясню на интерфейсе пользователя:
1. Допустим в документе есть фраза "блабабла"
2. Добавим к "баб" примечание, отобразится сноска сбоку.
3. Попробуем найти "бабла", штатными средствами, ворд все прекрасно выдает.
4. Перейдем в расширенный поиск и включим "подстановочные знаки"
5. Попробуем найти "бабла" с подстановочными знаками, ворд говорит что ничего не найдено.
Как так то? "бабла" вот оно? А ворд говорит, что нет!

В макросе еще хуже "бабла" не выдает ни в какую.

Оказывается, примечания ворд помечает специальным "якорем", который по сути не должен участвовать в поиске, что собственно частично наблюдается в интерфейсе пользователя, но не на программном уровне. При копировании текста с якорем в другую программу, можно увидеть, что якорь превращается в пробел и в макросах доступно уже слово "блабаб ла", что явно не соответствует "бабла".

Вопрос знатокам, как программно найти "бабла" и заставить ворд не видеть "якори" при поиске?
Задача усложняется тем, что якори могут быть в любом месте (работаю с китайским текстом), а слово найти надо.

2

Re: Поиск в Ворде

tyrbonit пишет:

Часто пользуюсь поиском по документу, но как то мне понадобилось реализовать программную вставку примечаний через поиск (те самые, что на вкладке "рецензирование").
Макрос написал без проблем, но поиск через объект Range.Find работает не так, как ожидалось.
Суть в следующем, поясню на интерфейсе пользователя:
1. Допустим в документе есть фраза "блабабла"
2. Добавим к "баб" примечание, отобразится сноска сбоку.
3. Попробуем найти "бабла", штатными средствами, ворд все прекрасно выдает.
4. Перейдем в расширенный поиск и включим "подстановочные знаки"
5. Попробуем найти "бабла" с подстановочными знаками, ворд говорит что ничего не найдено.
Как так то? "бабла" вот оно? А ворд говорит, что нет!

В макросе еще хуже "бабла" не выдает ни в какую.

Оказывается, примечания ворд помечает специальным "якорем", который по сути не должен участвовать в поиске, что собственно частично наблюдается в интерфейсе пользователя, но не на программном уровне. При копировании текста с якорем в другую программу, можно увидеть, что якорь превращается в пробел и в макросах доступно уже слово "блабаб ла", что явно не соответствует "бабла".

Вопрос знатокам, как программно найти "бабла" и заставить ворд не видеть "якори" при поиске?
Задача усложняется тем, что якори могут быть в любом месте (работаю с китайским текстом), а слово найти надо.

Корочи, дело такое... Я хз, тут Господа-Магистры может знают как по-хитрому сделать через "Section" или "content" или ещё как. Или можно комменты внести в область поиска... В общем, если кто знает как реализовать такой поиск иначе - я буду сам рад узнать другое решение.
Я подписал таким образом - находит часть слова, затем расширяем область и, если расширенная область = искомому слову, то вот оно перед нами.

Sub БлаблаБоженькаДайБабла()
Dim myRange As Range
Dim ComRange As Range
Set myRange = ActiveDocument.Content
myRange.Find.Text = "бло"
myRange.Find.Wrap = wdFindContinue
Do While myRange.Find.Execute = True
    myRange.Select
    Set ComRange = Selection.Range.Characters.First
        ComRange.SetRange Start:=ComRange.Start, End:=Selection.Characters.Last.End
        Selection.Collapse direction:=wdCollapseEnd
        Selection.Expand Unit:=wdWord
        stext = Selection.Range.Text
        If stext = "блоков" Then
            MsgBox "Busted!"
        Else
            MsgBox "Фигню какую-то нашли... сам посмотри ---> " & stext
        End If
    Selection.Collapse direction:=wdCollapseEnd
Loop
End Sub
Post's attachments

Блабла дай бабла.docm 21.39 Кб, 1 скачиваний с 2017-01-20 

You don't have the permssions to download the attachments of this post.
Спасибо можно перевести на WebMoney-кошелёк R378231864568 или на Яндекс-деньги 410015093172871

3

Re: Поиск в Ворде

Ща посмотрел - много кода лишнего. Хотел сам сначала искать по Content, но текст в комментариях и текст вне комментариев всё равно вместе не ищет. Но макрос работает.

Спасибо можно перевести на WebMoney-кошелёк R378231864568 или на Яндекс-деньги 410015093172871

4

Re: Поиск в Ворде

Не, не вариант, у меня текст вообще без пробелов, только иероглифы, следовательно область расширяется аж до конца абзаца.
Рабочим вариантом был поиск с постановочными знаками, но в офисе эта технология сделана очень коряво, уж лучше бы реализовали нормальные регулярные выражения, как Javascript, Python и других языках. Даже регулярки в макросах на низком уровне, пробовал и с ними ничего не ищет.

В подстановочных знаках невозможно задать {0;1} для знака перед ним, а @ является знакозаменителем 0 или более предыдущего знака, рабочим вариантом было подстановка * в промежутки перед символами, находил все, но проблема в том, что не ограничивается жадность.

Также заметил, что есть сделать Debug.Print ActiveDocument.Content.Text в местах примечаний нет никаких знаков, а регулярки все равно не видят искомый текст.

Думал временно убирать примечания с записью информации о них, то есть .Scope.Start, .Scope.End и .Text, выполнить поиск и вернуть все на место, но проблема в том, что при выполнении вставки .Comments.Add ..., меняются координаты Start, End  диапазона, так как якорь примечания учитывается.

Есть вариант вызывать скрытое окошко поиска, которое обычно открывается пользователем, заполнять поля и отлавливать результаты, но не ясно как добраться до этого окна.

5

Re: Поиск в Ворде

tyrbonit пишет:

Не, не вариант, у меня текст вообще без пробелов, только иероглифы, следовательно область расширяется аж до конца абзаца.
Рабочим вариантом был поиск с постановочными знаками, но в офисе эта технология сделана очень коряво, уж лучше бы реализовали нормальные регулярные выражения, как Javascript, Python и других языках. Даже регулярки в макросах на низком уровне, пробовал и с ними ничего не ищет.

В подстановочных знаках невозможно задать {0;1} для знака перед ним, а @ является знакозаменителем 0 или более предыдущего знака, рабочим вариантом было подстановка * в промежутки перед символами, находил все, но проблема в том, что не ограничивается жадность.

Также заметил, что есть сделать Debug.Print ActiveDocument.Content.Text в местах примечаний нет никаких знаков, а регулярки все равно не видят искомый текст.

Думал временно убирать примечания с записью информации о них, то есть .Scope.Start, .Scope.End и .Text, выполнить поиск и вернуть все на место, но проблема в том, что при выполнении вставки .Comments.Add ..., меняются координаты Start, End  диапазона, так как якорь примечания учитывается.

Есть вариант вызывать скрытое окошко поиска, которое обычно открывается пользователем, заполнять поля и отлавливать результаты, но не ясно как добраться до этого окна.

Тогда я не понял, как это у вас выглядит. Присылайте документ и какие символы вам надо искать. Не понятны ваши требования. Макрос делает как вы сказали, если надо иначе - шлите пример (текст, чё искать...). На крайняк - проверьте как смещается диапазон. Ворд вам может посчитать кол-во комментариев. А вообще делайте с конца документ и тогда надо будет учитывать только текущее смещение и это скорее всего 1 символ (максимум 2). Для этого используется Step -1, например.

Спасибо можно перевести на WebMoney-кошелёк R378231864568 или на Яндекс-деньги 410015093172871

6

Re: Поиск в Ворде

В общем суть такова:

Есть база терминов, макрос берет слово из базы и ставит в примечаниях перевод термина (как в тексте выше)
Иногда термины являются составными, с удалением вложенных терминов проблем нет, но вот более широкие термины попросту не находятся.

Итак, конкретная задача:
1. Дано:
Текст -
!根据主油泵压增的不同配置不同扬程的高压电动油泵。对于0.97MPa主油泵(出口油压),启动高压电动油泵后,高压油压力应不超过0.95MPa,如超过此压力,可利用高压电动油泵后的截止阀来调整
Условия - В тексте, после предыдущей итерации, вставлены примечания для терминов 电动 и 泵.
2. Найти:
Макросом найти 电动油泵, проверить есть ли у найденного диапазона примечания, удалить их если они полностью входят в диапазон и поставить новое примечание с текстом «电动油泵 – Электроприводной маслонасос»

П.С.
В редакторе VBA русской версии офиса не возможно набрать какие либо символы, кроме английского и русского (с путями также фигня), поэтому перед запуском макроса искомый текст выделяется вручную и затем берется через selection.text.

Post's attachments

миф проблема.docm 19.35 Кб, 1 скачиваний с 2017-01-20 

You don't have the permssions to download the attachments of this post.

7

Re: Поиск в Ворде

Задачу частично решил предварительной вставкой закладок, которые уже в конце списка терминов преобразуются в примечания.

8

Re: Поиск в Ворде

Прощу прощенья, в предыщий пост приложил малость не тот файл

Post's attachments

миф проблема.docm 21.56 Кб, 1 скачиваний с 2017-01-20 

You don't have the permssions to download the attachments of this post.

9

Re: Поиск в Ворде

tyrbonit пишет:

Прощу прощенья, в предыщий пост приложил малость не тот файл

Ну ладушки. Вот мой ответ (вызов был принят): Разумеется, вам нужно дописать сюда процедуру, которая будет брать из стороннего документа переменную sTxt. (В вашем документе я её просто выделял и в режиме отладки прогонял ту строку, которая ответственна за назначение переменной текста в Селекшион ренж.) + к этому вам самому придётся думать, как удалять два предыдущих комментария, которые были на этом месте. Суть в том, что макрос находит вхождение комментария в ту строку, что вы ищете и, если находит - расширяет область выделения до кол-ва символов искомой строки, ну а дальше я просто добавил в выделенной области новый комментарий.

Sub Поменял()
Dim iCom, i, ComNumb As Integer
Dim sTxt, sComTxt, sExpTxt As String
iCom = ActiveDocument.Comments.Count
sTxt = Selection.Range.Text
For i = 1 To 11 Step 1
ActiveDocument.Comments(i).Scope.Select
sComTxt = ActiveDocument.Comments(i).Scope.Text
If InStr(sTxt, sComTxt) >= 1 Then
MsgBox "Вот она, вот она - на 8 лет намотана!"
    Selection.Collapse Direction:=wdCollapseStart
    Selection.MoveRight Unit:=wdCharacter, Count:=Len(sTxt), Extend:=wdExtend
    If Selection.Range.Text = sTxt Then
        Selection.Range.Comments.Add Range:=Selection.Range, Text:=sTxt
    End If
Else
MsgBox "Чёт не то"
End If
Next i
End Sub
Спасибо можно перевести на WebMoney-кошелёк R378231864568 или на Яндекс-деньги 410015093172871

10

Re: Поиск в Ворде

Задача довольно популярная, так как всяких скрытых символов, мешающих поиску стандартными методами, в документах Word масса. Думаю, удобнее всего искать в Document.Content. То есть в строке. Останется увязать найденное с областью документа. Еще, при поиске в строке, вы сможете использовать полноценные регулярные выражения. С помощью объекта VBScript.RegExp. Получится что-то типа:

Sub A()
Dim R As Range, S As String
    Set R = ActiveDocument.Range ' область поиска
    S = "текст" ' искомый текст
    i = InStr(1, R.Text, S, vbBinaryCompare)
    If i <= 0 Then Exit Sub
    If RangeOfText(R, i, Len(S)) <> True Then Exit Sub
    R.Select
End Sub

Function RangeOfText(tRange As Range, tStart As Long, tLength As Long) As Boolean
' сузить область до фрагмента ее же текста
' tRange - вход: начальная область
' tStart - вход: позиция начала текста (в tRange.Text)
' tpLength - вход: длина текста (в tRange.Text)
' возврат: True при успехе
...
Макросы под заказ и готовый пакет - mtdmacro.ru

11

Re: Поиск в Ворде

Странные дела творятся, сегодня Ворд чудным образом нашел текст штатными средствами yikes
Прошу проверить на пустом документе данный скрипт, может у меня только заработало.

Sub Babla()
    ActiveDocument.Range.Text = "блабабла бабла блабабла" 'Вставляем содержимое
    a = MyFinde("баб", "Нет бабла") 'Расставляем комментарии "баб"
    b = MyFinde("бабла", "Держи бабла") 'Ищем "бабла" не обращая на комментарии "баб"
End Sub
Function MyFinde(S As String, commentTxt As String) As Boolean
    Dim R As Range
    Set R = ActiveDocument.Range
    MyFinde = False
    With R.Find
        .ClearFormatting
        .Text = S
        .Forward = True
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
        Do While .Execute = True
            MyFinde = True
            ActiveDocument.Comments.Add Range:=R, Text:=commentTxt
        Loop
    End With
End Function

12

Re: Поиск в Ворде

tyrbonit пишет:

Странные дела творятся, сегодня Ворд чудным образом нашел текст штатными средствами yikes
Прошу проверить на пустом документе данный скрипт, может у меня только заработало.

Прошу прощения, но вам уже предложили 2 варианта. Мой работал у меня, в Вожде я тоже не сомневаюсь. Если у вас работает другой - можете и другой использовать (пока работает - зачем трогать?)

Спасибо можно перевести на WebMoney-кошелёк R378231864568 или на Яндекс-деньги 410015093172871