Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/60: Рейтинг темы: голосов - 60, средняя оценка - 4.93
0 / 0 / 0
Регистрация: 27.11.2009
Сообщений: 11

Поиск слов в тексте

28.11.2009, 18:21. Показов 11241. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пожалуйста, помоги с макросом. Нужно чтобы он выводил диалоговое окно, где мы бы указывали массив символов. Это первый массив. Затем запрашивается второй массив. После чего макрос ищет в тексте сочетания символов, идентичные первому массиву и, если это не конец слова, ищет конец слова и вставляет метку: {XE "второй массив"}.
Для чего это нужно: макрос поможет пометить все однокоренные слова именем второго массива, у которых корень - первый массив.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.11.2009, 18:21
Ответы с готовыми решениями:

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

Поиск слов в тексте
Мне нужно составить программу которая ищет слова в тексте. Я уже составлял такую, используя re. Но появилась проблема - мне нужно, чтобы...

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

11
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
28.11.2009, 19:06
Ну ты блин даёшь. Я бы никогда тебе не смог бы помочь, прочитав твой вопрос.
Вот макрос
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Sub Indexes()
Dim x As String
Dim y As String
Dim oStory As Range
Dim oWord As Range
x = InputBox("Введите корень, для отображение нужного слова в Указателе")
y = InputBox("Введите слово, которое должно быть в Указателе")
Application.ScreenUpdating = False
ActiveWindow.ActivePane.View.ShowAll = False
For Each oStory In ActiveDocument.StoryRanges
    For Each oWord In oStory.Words
        If InStr(oWord, x) > 0 Then
            oWord.Select
            ActiveDocument.Indexes.MarkEntry Range:=Selection.Range, Entry:=y
            Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend
            Selection.MoveRight Unit:=wdCharacter, Count:=1
        End If
    Next oWord
Next oStory
Application.ScreenUpdating = True
End Sub
Если ты работаешь в режиме отображения Непечатаемых символов, то надо будет добавить ещё одну строчку.
Сам указатель вставишь вручную.

Добавлено через 13 минут
Последний вариант. Перед применением макроса сделай копию документа на всякий пожарный.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Sub Indexes()
Dim x As String
Dim y As String
Dim oWord As Range
x = InputBox("Введите корень, для отображение нужного слова в Указателе")
y = InputBox("Введите слово, которое должно быть в Указателе")
Application.ScreenUpdating = False
ActiveWindow.ActivePane.View.ShowAll = False
    For Each oWord In ActiveDocument.Words
        If InStr(oWord, x) > 0 Then
            oWord.Select
            ActiveDocument.Indexes.MarkEntry Range:=Selection.Range, Entry:=y
        End If
    Next oWord
Application.ScreenUpdating = True
End Sub
Этот макрос применим только к Основному документу, т.е. Колонтитулы, Сноски, Надписи - ну учитываются.
2
0 / 0 / 0
Регистрация: 27.11.2009
Сообщений: 11
29.11.2009, 12:26  [ТС]
А как ворд ищет слова?
Я представлял, что он будет перебирать все символы подряд, пока не наткнется на: пробел, дефис, точку, запятую, ¤, знак ввода. Может еще, что забыл
А такая схема походу не корректно работает. Вот пример файла

И, насколько я понял, InputBox имеет стандартную форму, и кнопка OK означает записать, а Cancel - записать пустую строку. То есть отменить выполнение макроса уже нельзя
Вложения
Тип файла: doc Предприниматель.doc (24.0 Кб, 45 просмотров)
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
29.11.2009, 13:48
krendel34rus,
В этом варианте учитываются Сноски. А для Колонтитулов и Надписей Указатели не предусмотрены. Этот Макрос чувствителен к регистру, поэтому макрос для одного Корня должен применяться 2 раза: 1 раз вводишь корень с Большой буквы, 2 - с маленькой.
Visual Basic
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
Sub Indexes()
Dim x As String
Dim y As String
Dim oWord As Range
Dim oFootnote As Footnote
x = InputBox("Введите корень", "Производим пометку")
у = InputBox("Введите слово, которое должно быть в Указателе", "Производим пометку")
Application.ScreenUpdating = False
ActiveWindow.ActivePane.View.ShowAll = False
For Each oWord In ActiveDocument.Words
    If InStr(oWord, x) > 0 Then
        oWord.Select
        ActiveDocument.Indexes.MarkEntry Range:=Selection.Range, Entry:=у
    End If
Next oWord
For Each oFootnote In ActiveDocument.footnotes
    For Each oWord In oFootnote.Range.Words
        If InStr(oWord, x) > 0 Then
            oWord.Select
            ActiveDocument.Indexes.MarkEntry Range:=Selection.Range, Entry:=у
        End If
    Next oWord
Next oFootnote
Application.ScreenUpdating = True
End Sub
Про InputBox сейчас почитаю.
Да, и тебе это надо для профессиональной деятельности или 1-2 раза применить? Если 1-2 раза, то этого достаточно.

Добавлено через 18 минут
krendel34rus,
Вот нашёл кое-что. Вставь это
Visual Basic
1
2
If x = Empty Then Exit Sub
If y = Empty Then Exit Sub
после
Visual Basic
1
2
x = InputBox("Введите корень", "Производим пометку")
у = InputBox("Введите слово, которое должно быть в Указателе", "Производим пометку")
соответственно после х вставь про х, после y про y.
При нажатии на Cancel InputBox принимает значение Empty. Также выход из программы будет происходить, если ты ничего не введёшь в поле и нажмёшь Ок.

Добавлено через 30 минут
krendel34rus,
А как ворд ищет слова?
Я представлял, что он будет перебирать все символы подряд, пока не наткнется на: пробел, дефис, точку, запятую, ¤, знак ввода. Может еще, что забыл
Я честно говоря, плохо представляю, как и что работает, я просто складываю различные строчки кодов вместе, находя их в Справке, на др. Форумах, записав их с помощью Макрорекордера.
Вот эта строчка мне и самому не понята
Visual Basic
1
For Each oWord In ActiveDocument.Words
т.к. здесь oWord является
Visual Basic
1
Dim oWord As Range
диапазоном, а на самом деле я подразумеваю под oWord одно любое слово в данном документе.
Если абстрагироваться и не вдаваться в подробности, то эта строка
Visual Basic
1
For Each oWord In ActiveDocument.Words
означает: для каждого слова в данном документе. Т.е. мы просматриваем все слова в документе, начиная с первого и заканчивая последним.
Вот эта строка
Visual Basic
1
If InStr(oWord, x) > 0 Then
означает следующее.
InStr является функцией VBA, с помощью которой можно выяснить, есть ли в данном фрагменте, нужный нам фрагмент. oWord - это слово в документе, а x - фрагмент который мы ищем, в данном случае x является Корнем. Если в oWord есть x, то вот это выражение InStr(oWord, x) будет больше нуля, если нету, то будет равно 0. И соответственно данная строка
Visual Basic
1
If InStr(oWord, x) > 0 Then[
читается: если в данном слове есть корень, то.
Затем я просто выделяю это слово и помечаю его. Пометку я записал с помощью Макрорекордера, а затем из полученного кода удалил то, что посчитал ненужным.
1
0 / 0 / 0
Регистрация: 27.11.2009
Сообщений: 11
29.11.2009, 15:26  [ТС]
Спасибо за подробное разъяснение. В программе были некоторые недостатки.
Visual Basic
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
Sub Indexes()
Dim x As String
Dim y As String
Dim oWord As Range
Dim oFootnote As Footnote
x = InputBox("Введите корень", "Производим пометку")
    ' <---
    If x = Empty Then
        Exit Sub
    End If
    ' <---
у = InputBox("Введите слово, которое должно быть в Указателе", "Производим пометку")
    ' <---
    If y <> Empty Then
        Exit Sub
    End If
    ' <---
Application.ScreenUpdating = False
ActiveWindow.ActivePane.View.ShowAll = False
For Each oWord In ActiveDocument.Words
    If InStr(oWord, x) <> 0 Then ' <---
        oWord.Select
        ActiveDocument.Indexes.MarkEntry Range:=Selection.Range, Entry:=у
    End If
Next oWord
For Each oFootnote In ActiveDocument.Footnotes
    For Each oWord In oFootnote.Range.Words
        If InStr(oWord, x) <> 0 Then ' <---
            oWord.Select
            ActiveDocument.Indexes.MarkEntry Range:=Selection.Range, Entry:=у
        End If
    Next oWord
Next oFootnote
Application.ScreenUpdating = True
End Sub
Всё это было отслежено пошагово - F8.
Конечно же закрыл If. Далее, y почему-то действует наоборот: поставил не равно. oWord действует замечательно. Он реально ищет отдельные слова и символы. Но только функция InStr возвращает порядковый номер вхождения первого элемента x в oWord. Если х входит в oWord, значит его номер любой, кроме ноля.

Вот. Busine2009, огромное спасибо за помощь!
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
29.11.2009, 15:32
krendel34rus,
Visual Basic
1
2
3
If x = Empty Then
        Exit Sub
    End If
Так нельзя делать, у меня этот фрагмент то работает, то не работает. Оставь так, как я написал - это не была ошибка. Вот наверное y у тебя и действовал наоборот, потому что ты закрыл if.
0
0 / 0 / 0
Регистрация: 27.11.2009
Сообщений: 11
29.11.2009, 15:44  [ТС]
Visual Basic
1
2
3
4
x = InputBox("Введите корень", "Производим пометку")
If x = Empty Then Exit Sub
у = InputBox("Введите слово, которое должно быть в Указателе", "Производим пометку")
If y = Empty Then Exit Sub
При пошаговой компиляции программа заканчивается там, где я подчеркнул. Попробуйте сами.
А If действительно не обязательно закрывать. Но у меня нет практики в VBA, поэтому пока работало и с закрытым
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
29.11.2009, 15:58
krendel34rus,
я к тому, что тоже раньше использовал end if при закрытии в этом случае, но у меня почему-то код неправильно работал, точно не помню что, кажется не выходил из программы.

Добавлено через 6 минут
krendel34rus,
да ты прав, я видимо забыл протестировать до конца.
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
29.11.2009, 18:28
krendel34rus,
Может я ошибаюсь и не учитываю каких-нибудь факторов, но если x и y заменить на переменные с другими именами, например, xIndex и yIndex, то end if не нужен, а y можно сделать равным 0.
0
0 / 0 / 0
Регистрация: 27.11.2009
Сообщений: 11
30.11.2009, 02:10  [ТС]
Мне тоже не понятно почему, но это так
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
30.11.2009, 05:17
krendel34rus,
а у меня макрос с другого форума не работает, у меня очень много пометок появляется.
0
0 / 0 / 0
Регистрация: 27.11.2009
Сообщений: 11
01.12.2009, 23:57  [ТС]
У меня сначала работал, причем отлично (в четыре раза быстрее поиска по каждому слову) Но когда принес на работу, почему-то тоже стал делать кучу меток на одно и то же слово, и пришлось его просто прервать. Не могу это объяснить...пока.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.12.2009, 23:57
Помогаю со студенческими работами здесь

Поиск слов в тексте
Здравствуйте. Помогите разобраться в задаче. Необходимо разработать Windows Form приложение позволяющее искать все слова начинающиеся с...

Поиск слов в тексте
нужно написать программу которая ищет в тексте и вставляет в конец документа слова содержащие определенную букву. подскажите как это...

Поиск слов тексте.
Нужно с помощью регулярных выражений выделить в тексте все предложения, в которых упоминается слово &quot;круто&quot; и &quot;класс&quot;. ...

Поиск слов в тексте.
Дан текст.Найти все слова, начинающиеся с приставки при-. Перепробывал все, что смог. Помагите!

поиск слов в тексте
вот задача: открыть текстовый файл(.txt) при помощи opendialog в поле memo где можно пометь шрифт текста и затем при нажатии кнопки поиск...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Проблемы с Kotlin и Wasm при создании игры
GameUnited 03.07.2025
В современном мире разработки игр выбор технологии - это зачастую балансирование между удобством разработки, переносимостью и производительностью. Когда я решил создать свою первую веб-игру, мой. . .
Создаем микросервисы с Go и Kubernetes
golander 02.07.2025
Когда я только начинал с микросервисами, все спорили о том, какой язык юзать. Сейчас Go (или Golang) фактически захватил эту нишу. И вот почему этот язык настолько заходит для этих задач: . . .
C++23, квантовые вычисления и взаимодействие с Q#
bytestream 02.07.2025
Я всегда с некоторым скептицизмом относился к громким заявлениям о революциях в IT, но квантовые вычисления - это тот случай, когда революция действительно происходит прямо у нас на глазах. Последние. . .
Вот в чем сила LM.
Hrethgir 02.07.2025
как на английском будет “обслуживание“ Слово «обслуживание» на английском языке может переводиться несколькими способами в зависимости от контекста: * **Service** — самый распространённый. . .
Использование Keycloak со Spring Boot и интеграция Identity Provider
Javaican 01.07.2025
Два года назад я получил задачу, которая сначала показалась тривиальной: интегрировать корпоративную аутентификацию в микросервисную архитектуру. На тот момент у нас было семь Spring Boot приложений,. . .
Содержание темы с примерами на WebGL
8Observer8 01.07.2025
Все примеры из книги Мацуды и Ли в песочнице JSFiddle Пример выводит точку красного цвета размером 10 пикселей на WebGL 1. 0 и 2. 0 WebGL 1. 0. Передача координаты точки из главной программы в. . .
Основы WebGL. Простой треугольник
8Observer8 01.07.2025
Простой треугольник без трансформаций. Для трансформаций можно использовать glMatrix, как в примере: https:/ / plnkr. co/ edit/ qT6ZTwvncLPRamK5?preview На русском: . . .
Полиглотные микросервисы на C# и .NET
ArchitectMsa 30.06.2025
Полиглотная архитектура появилась не из желания усложнить жизнь разработчикам. Она родилась из практической необходимости решать разные задачи наиболее эффективным способом. В одном из проектов. . .
Стратегии кеширования
Javaican 29.06.2025
Кеширование — это хранение часто запрашиваемых данных в быстром хранилище (обычно в памяти), чтобы не обращаться к более медленному первоисточнику. Казалось бы, все просто. Но за этой простотой. . .
Наблюдаемость приложений ASP.NET Core с OpenTelemetry, Prometheus и Grafana
ArchitectMsa 29.06.2025
Наблюдаемость (observability) – это ключевое свойство современной системы, позволяющее понимать её внутреннее состояние на основе внешних данных. Если мониторинг отвечает на вопрос "что случилось?",. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru