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

Выделить абзац с наибольшим количеством найденных слов

28.09.2017, 15:21. Показов 1840. Ответов 11
Метки vba (Все метки)

Студворк — интернет-сервис помощи студентам
Эта программа позволяет по нажатию на CommandButton1 найти в документе Word заданное слово и выделить его.
Но как сделать так чтоб слов можно было вводить несколько? чтоб они записывались в массив получается.. и определить абзац с наибольшим количеством таких слов? (поменять шрифт например)

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
36
Private Sub CommandButton1_Click()
 
    Dim counter As Integer
    Dim word As String
 
    word = InputBox("Type words: ")
 
    If word = Empty Then Exit Sub
 
    For Each i In ActiveDocument.Paragraphs()
    With Selection.Find
      .Text = word
      .Replacement.Text = ""
      .Forward = True
      .Wrap = wdFindContinue
      .Format = True
      .MatchCase = False
      .MatchWholeWord = True
      .MatchWildcards = False
      .MatchSoundsLike = False
      .MatchAllWordForms = False
    End With
    Selection.Find.Execute
    If Not Selection.Font.ColorIndex = wdGreen Then
      counter = counter + 1
      Selection.Font.ColorIndex = wdGreen
      Selection.Font.Size = 20
      Selection.Font.Name = "Arial"
      Selection.Font.Bold = True
      Selection.MoveRight Unit:=wdWord, count:=1
    Else
        MsgBox "Quantity of searched words: " & counter & ""
    Exit Sub
    End If
    Next i
End Sub
Помогите пожалуйста кто как может, буду очень благодарен
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.09.2017, 15:21
Ответы с готовыми решениями:

Выделить в файле слово с наибольшим количеством гласных букв
Доброго времени суток. В данной программе мне нужно подсчитать количество слов в тексте после удаления лишних пробелов (это я уже...

Напечатайте строку с наибольшим количеством слов
Tекстовый файл t. Слова не переносятся с одной строки на другую. Слова разделены одним или несколькими пробелами. Напечатайте строку с...

Напечатайте строку файла с наибольшим количеством слов
Дан текстовый файл f. Слова не переносятся с одной строки на другую. Слова разделены одним или несколькими пробелами. Напечатайте строку с...

11
Модератор
Эксперт .NET
 Аватар для Yury Komar
4357 / 3427 / 512
Регистрация: 27.01.2014
Сообщений: 6,258
28.09.2017, 15:23
вы разделом форума ошиблись.
Тут ребята обсуждают VB.NET, а не VB6
1
0 / 0 / 0
Регистрация: 07.10.2016
Сообщений: 20
28.09.2017, 15:24  [ТС]
оой простите, перепутал
я нашел форум VBA, можете удалить тему, если это возможно
0
141 / 119 / 29
Регистрация: 12.02.2017
Сообщений: 308
29.09.2017, 08:01
Лучший ответ Сообщение было отмечено look123 как решение

Решение

Возможное решение,
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
Private Sub CommandButton1_Click()
    Dim counter&, i&, l&, counters() As Long
    Dim s$, words() As String
    Dim ll&
    s = InputBox("Type words")
    If Len(s) Then Else Exit Sub
    words = Split(s, " ")
    With ActiveDocument
        ll = .Paragraphs.Count
        ReDim counters(1 To ll)
        For i = 1 To ll
            s = .Paragraphs(i).Range
            For Each v In words
                If Len(v) Then
                    l = InStr(1, s, v, vbTextCompare)
                    Do While l
                        l = l + 1
                        counter = counter + 1
                        l = InStr(l, s, v, vbTextCompare)
                    Loop
                    counters(i) = counters(i) + counter
                    counter = 0
                End If
            Next
        Next
        l = 0
        For i = 1 To ll
            If counters(i) > l Then l = counters(i): counter = i
        Next
        .Paragraphs(counter).Range.HighlightColorIndex = wdYellow
        MsgBox "Paragraph No " & counter & vbCrLf & "Finded: " & l
    End With
End Sub
Добавлено через 5 минут
Да, чуть не пропустил, искомые слова вводите через пробел, регистр символов не учитывается, найденный абзац выделяется желтым.
0
0 / 0 / 0
Регистрация: 07.10.2016
Сообщений: 20
29.09.2017, 14:05  [ТС]
Цитата Сообщение от Homarty Посмотреть сообщение
Возможное решение
Да благодарю, но не очень разобрался с этим циклом

Цитата Сообщение от Homarty Посмотреть сообщение
Visual Basic
1
2
3
4
5
6
7
8
9
10
If Len(v) Then
l = InStr(1, s, v, vbTextCompare)
 Do While l
l = l + 1
 counter = counter + 1
l = InStr(l, s, v, vbTextCompare)
 Loop
counters(i) = counters(i) + counter
 counter = 0
 End If
Для чего вообще два счетчика l и counter?

Добавлено через 23 минуты
Ещё..не выходит что-то выделить найденные слова, пробовал так, выделяются не все, из-за чего это может быть?

Писал в цикле
Visual Basic
1
For Each v In words
Visual Basic
1
2
3
4
5
            For Each m In ActiveDocument.words
                    If LCase(m) = v Then
                        m.Font.ColorIndex = wdRed
                    End If
                Next m
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4357 / 3427 / 512
Регистрация: 27.01.2014
Сообщений: 6,258
29.09.2017, 14:33
блин.тема не местная... Перенесите ее по адресу
0
0 / 0 / 0
Регистрация: 07.10.2016
Сообщений: 20
29.09.2017, 16:03  [ТС]
https://www.cyberforum.ru/vba/thread2045913.html
0
141 / 119 / 29
Регистрация: 12.02.2017
Сообщений: 308
29.09.2017, 17:17
Лучший ответ Сообщение было отмечено look123 как решение

Решение

Переменная l отслеживает позицию поиска в абзаце, а counter подсчитывает число вхождений искомого слова.
Что касается выделения слов, то, цитата:"...и определить абзац с наибольшим количеством таких слов? (поменять шрифт например)".
Т.к. заранее неизвестно какой шрифт будет использоваться в документе то я сделал выделение маркером.
Для того чтобы выделить найденные слова нужно немного переделать макрос, попробуйте сами, у меня, пока, сейчас нет возможности работать с ПК (поиск происходит в цикле do...loop).
П.С. Использование words collection не позволяет производить поиск по абзацам.

Добавлено через 3 минуты
Уважаемые модераторы, нельзя ли перенести эту тему в раздел VBA?
0
141 / 119 / 29
Регистрация: 12.02.2017
Сообщений: 308
01.10.2017, 15:22
Лучший ответ Сообщение было отмечено look123 как решение

Решение

Вот, выделяет слова в найденном абзаце
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
36
37
38
39
Private Sub CommandButton1_Click()
    Dim counter&, i&, l&, counters() As Long
    Dim s$, words() As String
    Dim ll&
    s = Trim$(InputBox("Type words"))
    If Len(s) Then Else Exit Sub
    words = Split(s, " ")
    With ActiveDocument
        ll = .Paragraphs.Count
        ReDim counters(1 To ll)
        For i = 1 To ll
            For Each v In words
                If Len(v) Then
                    For Each vv In .Paragraphs(i).Range.words
                        If UCase(Trim$(vv)) = UCase(v) Then counter = counter + 1
                    Next
                    counters(i) = counters(i) + counter
                    counter = 0
                End If
            Next
        Next
        For i = 1 To ll
            If counters(i) > l Then l = counters(i): counter = i
        Next
        If counter Then
            For Each v In words
                If Len(v) Then
                    For Each vv In .Paragraphs(counter).Range.words
                        If UCase(Trim$(vv)) = UCase(v) Then vv.HighlightColorIndex = wdBrightGreen
                    Next
                End If
            Next
            s = "Paragraph No " & counter & vbCrLf & "Finded: " & l
        Else
            s = "Find is missed!"
        End If
    End With
    MsgBox s
End Sub
0
0 / 0 / 0
Регистрация: 07.10.2016
Сообщений: 20
02.10.2017, 10:17  [ТС]
Цитата Сообщение от Homarty Посмотреть сообщение
Вот, выделяет слова в найденном абзаце
Большое спасибо за помощь
Но вот ещё пару вопросов:
почему counter&, i&, l&, counters() типа Long, а не Integer?
почему ll& без типа? д
ля чего Trim$ для vv?
и ф-ция Len(v) в блоке If проверяет, что строка есть, всмысле что длина строки больше нуля?
0
141 / 119 / 29
Регистрация: 12.02.2017
Сообщений: 308
02.10.2017, 15:08
1) ll имеет тип long,
2) тип integer вместо long здесь, в принципе, можно использовать, так что, если есть желание, вам это никто не запрещает.
3) использование trim и len обусловлено программными нюансами, которые выявляются в процессе практического программирования, вместо объяснений попробуйте удалить их и протестеруйте.
4) если желаете чему-то научиться то, лучше всего, самостоятельно писать код, читать комментарии и пояснения к чужой программе - не лучший вариант.

Добавлено через 18 минут
Функция Len используется из-за того, что возможны пустые строки, она отсекает такие значения.
Trim применяется по той причине, что vv помимо самого слова может содержать и пробел в конце, а это совсем ненужно.
Вообще-то, во второй части макроса можно использовать вместо двух вложенных циклов for всего один, с применением стандартной функции поиска и замены. Возможно позже я ее выложу, но строк в ней будет больше.
И еще относительно long, здесь он использован по привычке, он может принимать большее максимальное значение, чем integer.

Добавлено через 1 час 16 минут
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
Private Sub CommandButton1_Click()
    Dim counter&, i&, l&, counters() As Long
    Dim s$, words() As String
    Dim ll&, lOldHighLight&
    s = Trim$(InputBox("Type words"))
    If Len(s) Then Else Exit Sub
    words = Split(s, " ")
    With ActiveDocument
        ll = .Paragraphs.Count
        ReDim counters(1 To ll)
        For i = 1 To ll
            For Each v In words
                If Len(v) Then
                    For Each vv In .Paragraphs(i).Range.words
                        If UCase(Trim$(vv)) = UCase(v) Then counter = counter + 1
                    Next
                    counters(i) = counters(i) + counter
                    counter = 0
                End If
            Next
        Next
        For i = 1 To ll
            If counters(i) > l Then l = counters(i): counter = i
        Next
        If counter Then
            .Paragraphs(counter).Range.Select
            lOldHighLight = Options.DefaultHighlightColorIndex
            Options.DefaultHighlightColorIndex = wdBrightGreen
            With Selection.Find
                .ClearFormatting
                With .Replacement
                    .ClearFormatting
                    .Highlight = True
                End With
                .Replacement.Text = ""
                .Forward = True
                .Wrap = wdFindStop
                .Format = True
                .MatchCase = False
                .MatchWholeWord = True
                .MatchWildcards = False
                .MatchSoundsLike = False
                .MatchAllWordForms = False
                For Each v In words
                    .Text = v
                    .Execute Replace:=wdReplaceAll
                Next
            End With
            Selection.Collapse
            Options.DefaultHighlightColorIndex = lOldHighLight
            s = "Paragraph No " & counter & vbCrLf & "Finded: " & l
            ActiveWindow.ScrollIntoView .Paragraphs(counter).Range
        Else
            s = "Find is missed!"
        End If
    End With
    MsgBox s
End Sub
0
0 / 0 / 0
Регистрация: 07.10.2016
Сообщений: 20
02.10.2017, 15:54  [ТС]
Спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.10.2017, 15:54
Помогаю со студенческими работами здесь

Вывести строки файла с наибольшим количеством слов
Необходима программа для поиска в текстовом файле строки с найбольшим количеством слов в ней, если таких несколько вывести три первых...

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

Файлы. Вывести строку с наибольшим количеством слов из файла
Надо вывести на экран строку с наибольшим количеством слов из файла. Program qwerty; Var f: text; s,p: string; a,b:integer; Begin...

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

Выделить предложение с наименьшим количеством слов
Задача№5: Выделить предложение с наименьшим количеством слов. Вывести на печать подряд (без пробелов) все слова этого предложения. ...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru