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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.03.2013, 15:27   #1
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,069
По умолчанию Поиск-Find

Здравствуйте, когда в документе имеется два слова
"проверка,"
тогда код считает
TextError = "слово повторяется"
TextError1 = 0
если удалить одно слово "проверка," и оставить одно слово
"проверка,"
тогда код считает также само, вот код:

Код:
Private Sub CommandButton1_Click()

 'проверка повторяемости слова
            With ActiveDocument.Range.Find
                .Text = "<проверка,"    'поиск в начале слова
                .Wrap = wdFindStop    'поиск остановить, остановит поиск по достижении конца
                .MatchWildcards = True    'эта опция отвечает за поиск с использованием подстановочных знаков, не работает когда установлено в положение False, или её нет вообще, если установлена в положение True, тогда работает
               If Not ActiveDocument.Range.Find.Execute Then TextError = "слово повторяется"
            End With
            
             'проверка повторяемости слова
            With ActiveDocument.Range.Find
                .Text = "<проверка,"    'поиск в начале слова
                .Wrap = wdFindStop    'поиск остановить, остановит поиск по достижении конца
                .MatchWildcards = True    'эта опция отвечает за поиск с использованием подстановочных знаков, не работает когда установлено в положение False, или её нет вообще, если установлена в положение True, тогда работает
                Счётчик = 0
                Do While ActiveDocument.Range.Find.Execute = True
                '.Parent.Select 'выделит искомые слова
                Счётчик = Счётчик + 1
                Loop
               TextError1 = Счётчик
            End With
            
            End Sub
Подскажите пожалуйста, что не так???
Ципихович Эндрю на форуме Ответить с цитированием
Старый 21.03.2013, 16:16   #2
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

Пункт 1

Эта строка кода:
Код:
If Not ActiveDocument.Range.Find.Execute Then
уже ничего не ищет, т.к. вы заново создали объект поиска.

Путаница из-за того, что поиск с использованием "Selection" и "Range" по-разному работает и нельзя с "Range" в данном случае работать так же, как и с "Selection".

Правильно вот так сделать:
Код:
If Not .Execute Then

Пункт 2

Здесь:
Код:
Do While ActiveDocument.Range.Find.Execute = True
то же, что и в первом пункте.


Пункт 3

Когда есть результат поиска, то затем поиск ведётся в найденном. В вашем случае используется ".Wrap = wdFindStop". Это означает: не продолжать поиск в оставшейся части документа. Т.е. допустим было что-то найдено. Затем поиск снова осуществляется в этом же месте, а затем останавливается.


Примечание

Работа с объектом "Find" сложная в программе "Word" и путаница сильная ещё из-за того, что в VBA-справке мало описано про поиск с помощью "Range", и с тем, что люди путают работу с "Selection" и "Range".

Последний раз редактировалось Скрипт; 22.03.2013 в 07:36.
Скрипт вне форума Ответить с цитированием
Старый 25.03.2013, 10:44   #3
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,069
По умолчанию

переделал:
Код:
Private Sub CommandButton1_Click()

 'проверка повторяемости слова
            With ActiveDocument.Range.Find
 'поиск в начале слова
                .Text = "<проверка,"   
               'не продолжать поиск в оставшейся части документа
               'то есть, допустим было что-то найдено
               'затем поиск снова осуществляется в этом же месте, а затем останавливается
               .Wrap = wdFindStop
'эта опция отвечает за поиск с использованием подстановочных знаков
'не работает когда установлено в положение False, или её нет вообще 
'если установлена в положение True, тогда работает
                .MatchWildcards = True   
               If Not .Execute Then TextError = "слово повторяется"
            End With
            
             'проверка повторяемости слова
            With ActiveDocument.Range.Find
                'поиск в начале слова
                .Text = "<проверка,"   
               'не продолжать поиск в оставшейся части документа
               'то есть, допустим было что-то найдено
               'затем поиск снова осуществляется в этом же месте, а затем останавливается
               .Wrap = wdFindStop
'эта опция отвечает за поиск с использованием подстановочных знаков
'не работает когда установлено в положение False, или её нет вообще
'если установлена в положение True, тогда работает
                .MatchWildcards = True   
                Счётчик = 0
                Do While .Execute = True
                '.Parent.Select 'выделит искомые слова
                Счётчик = Счётчик + 1
                Loop
               TextError1 = Счётчик
            End With
            
            End Sub
результат:
TextError = "" - плохо
TextError1 = 2 - хорошо
и ???

Последний раз редактировалось Ципихович Эндрю; 25.03.2013 в 10:47.
Ципихович Эндрю на форуме Ответить с цитированием
Старый 25.03.2013, 10:54   #4
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

Разобью код на две части.
Вот первая часть. Эта часть ищет в документе фразу "проверка," в начале слова.
Если находит, то в переменную "TextError" помещается текст "слово повторяется".

Ципихович Эндрю, напишите, что вас не устраивает в этом коде:
Код:
Private Sub CommandButton1_Click()

    Dim TextError As String

    'проверка повторяемости слова
    With ActiveDocument.Range.Find
    
        'поиск в начале слова
        .Text = "<проверка,"
        'не продолжать поиск в оставшейся части документа
            'то есть, допустим было что-то найдено, 
            'а затем поиск останавливается
        .Wrap = wdFindStop
        'эта опция отвечает за поиск с использованием подстановочных знаков
            'не работает когда установлено в положение False,
            'или её нет вообще 'если установлена в положение True, тогда работает
        .MatchWildcards = True
        
        If .Execute = True Then
            TextError = "слово повторяется"
        End If
    
    End With
    
End Sub

Последний раз редактировалось Скрипт; 25.03.2013 в 11:04.
Скрипт вне форума Ответить с цитированием
Старый 25.03.2013, 11:17   #5
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,069
По умолчанию

спасибо
теперь то всё верно, но всё же в строке If .Execute = True Then - точка это сокращение, и что же там должно быть если не сокращать?
И как сделать чтобы TextError = "слово повторяется" только в случае когда слов не менее двух - два и более?
Ципихович Эндрю на форуме Ответить с цитированием
Старый 25.03.2013, 11:31   #6
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

Цитата:
Ципихович Эндрю: теперь то всё верно, но всё же в строке If .Execute = True Then - точка это сокращение, и что же там должно быть если не сокращать?
чтобы не сокращать при использовании "Range" при поиске, нужно создать объектную переменную. В коде, который ниже, объектная переменная "myFind". Но надо ещё и учитывать диапазон, в котором будет вестись поиск. В моём случае используется ещё переменная "rngSearch".
Код:
Private Sub CommandButton1_Click()

    Dim rngSearch As Word.Range
    Dim myFind As Word.Find
    Dim TextError As String
    Dim myCount As Long
    
    '1. Создаём виртуальную закладку. С помощью этой
        'закладки будем перемещаться по документу.
    Set rngSearch = ActiveDocument.Range(Start:=0, End:=0)
    
    '2. В оперативной памяти компьютера создаём объект,
        'который будет заниматься поиском и даём этому объекту VBA-имя "myFind".
    'Объект поиска будет связан с виртуальной закладкой "rngSearch".
    Set myFind = rngSearch.Find
    
    '3. Устанавливаем параметры у объекта поиска.
    '3.1. поиск в начале слова
    myFind.Text = "<проверка,"

    '3.2. не продолжать поиск в оставшейся части документа
        'то есть, допустим было что-то найдено
        'затем поиск снова осуществляется в этом же месте, а затем останавливается
    myFind.Wrap = wdFindStop
    
    '3.3. эта опция отвечает за поиск с использованием подстановочных знаков
        'не работает когда установлено в положение False,
        'или её нет вообще 'если установлена в положение True, тогда работает
    myFind.MatchWildcards = True

    '4. Осуществляем поиск.
    Do While myFind.Execute = True
        '5. Подсчитываем, сколько раз встречается искомый текст.
        myCount = myCount + 1
        '6. Если искомый текст будет найден, то виртуальная
            'закладка окружит найденный текст и затем поиск
            'продолжится в найденном фрагменте документа.
            'Поэтому нужно переместить закладку в конец найденного текста,
            'чтобы поиск пошёл дальше по документу.
        rngSearch.Collapse Direction:=wdCollapseEnd
    Loop
    
    '7. Делаем пометку: есть повторения или нет.
    If myCount > 1 Then
        TextError = "слово повторяется"
    End If
    
End Sub

Последний раз редактировалось Скрипт; 25.03.2013 в 11:33.
Скрипт вне форума Ответить с цитированием
Старый 25.03.2013, 11:35   #7
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,069
По умолчанию

ясно
"И как сделать чтобы TextError = "слово повторяется" только в случае когда слов не менее двух - два и более?"
строго через Do While ... Loop??
Ципихович Эндрю на форуме Ответить с цитированием
Старый 25.03.2013, 11:37   #8
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

Ципихович Эндрю, да, только с помощью цикла можно узнать: повторяется слово или нет. В VBA-Word нет инструмента, который определяет, сколько раз встречается искомый текст.
Скрипт вне форума Ответить с цитированием
Старый 25.03.2013, 11:40   #9
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,069
По умолчанию

ясно, спасибо!!!
Ципихович Эндрю на форуме Ответить с цитированием
Старый 25.03.2013, 17:49   #10
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию Похожие темы

http://programmersforum.ru/showthread.php?t=114149
http://programmersforum.ru/showthread.php?t=146988
Цитата:
Сообщение от Скрипт Посмотреть сообщение
В VBA-Word нет инструмента, который определяет, сколько раз встречается искомый текст.
Word, однако, это определяет — если при замене (Ctrl-h) нажать "Заменить все"!
Sasha_Smirnov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Метод Find Trimbl Microsoft Office Excel 4 10.01.2023 17:40
Find next & Find previous NeedLess Общие вопросы C/C++ 0 08.07.2012 13:42
Cant Find mistake dikabraz Паскаль, Turbo Pascal, PascalABC.NET 10 19.10.2010 20:17
метод find kate158 Общие вопросы Delphi 4 15.12.2009 16:09