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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.03.2013, 18:06   #1
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,039
По умолчанию Проход по всем словам, находящимся в переменной

Здравствуйте, в переменную s текст попадает по коду:

Код:
Dim s As String
    'обрабатываемый текст в переменную
    s = Selection.Text
обрабатываю слова, находящиеся в переменной так:
Код:
 Dim Обрабатываемый_текст As Range
    'создать объект согласно обрабатываемому тексту в документе
    Set Обрабатываемый_текст = ActiveDocument.Range(Start:=Начало_обрабатываемого_текста_в_документе, End:=Конец_обрабатываемого_текста_в_документе)
 
    Dim Количество_обрабатываемых_слов_в_документе As Long
    Количество_обрабатываемых_слов_в_документе = Обрабатываемый_текст.Words.Count
  For u = 1 To Количество_обрабатываемых_слов_в_документе
......
Знаю, что

'последовательный проход по коллекции итератором быстрее, чем обращение к произвольному элементу по индексу
'For x In — переменная x называется итератором, объектом, в котором содержится ссылка на очередной элемент коллекции/массива
'For x = — переменная x называется индексом, порядковым номером произволного элемента коллекции/массива
1. Это так?
2. Как пройтись в данном случае по словам переменной? через For Each u In каков код?
Спасибо
Ципихович Эндрю вне форума Ответить с цитированием
Старый 10.03.2013, 18:38   #2
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

Ципихович Эндрю, с помощью команды "Find" по идее быстро должно быть и в самом Word-документе, без помещения данных в переменную.
Сделать условие: "<*>" - поиск слова и поставить флажок "Подстановочные знаки".
Скрипт вне форума Ответить с цитированием
Старый 10.03.2013, 19:02   #3
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,039
По умолчанию

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

Ципихович Эндрю, ну вот циклом и вести поиск.

Поиск быстрее работает, чем просмотр каждого Word-слова. Я предполагаю, что Word-документ состоит из двух частей: одной части, которая видима пользователю, вторая часть - это просто сплошной текст - что-то вроде HTML-кода. Вот команда "Find", мне так кажется, и ищет в этом HTML-тексте.

Можно попробовать использовать библиотеку "Microsoft VBScript Regular Expressions" для поиска в переменной. Может в этой библиотеке есть выражение для поиска слов и не надо ничего выдумывать, а воспользоваться уже готовым.

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

может быть... такого не встречал, но пока хоть заменить
For u = 1 To Количество_обрабатываемых_слов_в_до кументе
на
For x In хх
как? что вместо х и хх?
Ципихович Эндрю вне форума Ответить с цитированием
Старый 10.03.2013, 20:12   #6
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

Представленный код не считает частью слова знак подчёркивания "_", дефис (может ещё чего не считает). Поэтому нужно корректировать код.
Код:
Sub Procedure_1()

    Dim myRange As Word.Range
    Dim myFind As Word.Find
    
    '1. Можно попробовать ускорить работу кода:
        '1) перейтие в режим "Черновик";
        '2) отключить проверку правописания.
    
    '2. Создаём виртуальную закладку (аналогична обычной Word-закладке,
        'только виртуальная закладка существует только во время работы кода).
    'С помощью этой закладки будем передвигаться
        'в документе для поиска искомого.
    'С помощью виртуальной закладки удобно вести поиск, если
        'виртуальная закладка представлена точкой вставки, а не фрагментом
        'документа. Точка вставки - это аналогично мигающему курсору на мониторе.
    Set myRange = ActiveDocument.Range(Start:=0, End:=0)
    
    '3. Создаём объект, который будет искать.
    'Привязываем этот объект поиска к нашей виртуальной закладке.
    Set myFind = myRange.Find
    
    '4. Настраиваем объект поиска.
    '4.1. Выражение "<*>" означает: найти любое слово.
    'Кавычки, скобки, пробелы, знаки препинания игнорируются.
    myFind.Text = "<*>"
    
    '4.2. Включаем флажок "Подстановочные знаки".
    myFind.MatchWildcards = True
    
    '5. Делаем команды, пока есть результат поиска.
    Do While myFind.Execute = True
    
        '6. Если есть результат поиска, то виртуальная закладка "myRange"
            'окружит найденный текст.
        'Можно доступ так получить к найденному слову.
        'Вывод результата в View - Immediate Window.
        Debug.Print myRange.Text
        
        '7. Превращаем виртуальную закладку снова в точку вставки.
            'А именно: перемещаем виртуальную закладку в конец
            'найденного фрагмента и поиск продолжится оттуда.
        myRange.Collapse Direction:=wdCollapseEnd
    
    Loop
    
    '8. Сообщение, что работа кода завершена.
    MsgBox "Работа кода завершена.", vbInformation

End Sub
Скрипт вне форума Ответить с цитированием
Старый 10.03.2013, 20:24   #7
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,039
По умолчанию

замурно, надо с этим переспать...
Ципихович Эндрю вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проход по дереву на c++ Skilluser Помощь студентам 18 20.11.2010 19:34
С++. Отыскать проход по лабиринту Romer9999 Помощь студентам 1 17.06.2009 23:33
Проход по дереву. Ozerich Общие вопросы Delphi 1 05.10.2008 17:33
Повторный проход по записям в TIBQuery novicer Компоненты Delphi 0 19.06.2007 18:58