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

Поиск и замена с Wildcard и условием If / Then

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

Студворк — интернет-сервис помощи студентам
Привет всем, очень нужен модуль для VBA-макроса в MS Word, который бы производил следующие замены в таблице с текстом:

1) Найти в ячейках определенного столбца таблицы предложение с помощью Wildcard find (с подстановочными знаками), т.к. там в середине или перед искомым текстом могут быть названия месяцов и предметов, вместо них, соответственно, "*".
Например, Find "*Class2*Student Number Change"
2) Далее, нужно перед этим найденным текстом вставить перевод (не изменяя найденный текст):
"Изменение числа студентов в классе№2 / § ".
Символ "§" вставляем, чтобы потом использовать его в дополнительной проверке условий: Если этот символ уже есть в строке (ячейке) с найденным текстом, то пропускаем ячейку, т.к. там перевод произведен.
Вот что примерно у меня наметилось:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    Dim oRng As Range
    Dim oCell As Cell
    For Each oCell In Selection.Tables(1).Columns(3).Cells
      Set oRng = oCell.Range
      With oRng.Find
        .Text = "*Class2*Student Number Change"
        .Wrap = wdFindContinue
        .MatchWildcards = True
        While .Execute
           With Selection.Find
              .Text = "/ §"
              .Forward = True
              .Wrap = wdFindContinue
           End With
           Selection.Find.Execute
               If Selection.Find.Found = False Then _
               .InsertBefore "Изменение числа студентов в классе№2 / § " 'вот тут не совсем уверен как вставлять в начале текста.
               End If
        Wend
      End With
    Next
Файл с таблицей для тестирования приложен
Вложения
Тип файла: doc Таблица для замены Wildcard.doc (33.0 Кб, 48 просмотров)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.01.2010, 21:21
Ответы с готовыми решениями:

Visual Basic Используя условный оператор if…then, if…then…else или if…then…elseif, разработайте проект для решения следующих заданий:
Пройдет ли кирпич со сторонами а, b и с сквозь прямоугольное отверстие со сторонами p и q? Стороны...

Проверка условия при использовании If Then
Попробовал два варианта использования модуля if Then В первом случае выводит присваивает результат...

Пустые ячейки и условие If Not IsEmpty(.Cells(i, 1)) Then
не могу понять в чем дело в программе стоит условие If Not IsEmpty(.Cells(i, 1)) Then в первом...

18
 Аватар для Toxa33rus
3924 / 925 / 125
Регистрация: 16.04.2009
Сообщений: 1,974
15.01.2010, 20:36
Цитата Сообщение от Victor_V_V Посмотреть сообщение
IF Selection.Find.Found = False THEN _
.InsertBefore "Изменение числа студентов в классе№2 / § " 'вот тут не совсем уверен как вставлять в начале текста.
END IF
Тут нет ошибки? После THEN идет символ продолжения строки и тогда END IF не надо писать.
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
16.01.2010, 06:36
Victor_V_V,
В других столбцах и вообще в документе могут встречаться искомые фразы?

У тебя поиск происходит там, где курсор стоит. Надо сначала выделить то, что нашёл.
Visual Basic
1
2
WHILE .Execute
           With Selection.Find
Visual Basic
1
.Parent.Select
0
0 / 0 / 0
Регистрация: 14.01.2010
Сообщений: 20
16.01.2010, 15:47  [ТС]
Цитата Сообщение от Busine2009 Посмотреть сообщение
Victor_V_V,
В других столбцах и вообще в документе могут встречаться искомые фразы?

У тебя поиск происходит там, где курсор стоит. Надо сначала выделить то, что нашёл.
Visual Basic
1
2
WHILE .Execute
           With Selection.Find
Visual Basic
1
.Parent.Select
Спасибо за комментарий,Toxa33rus, Busine2009, искомые фразы могут повторяться, но только в указанном столбце таблицы.

А где именно надо вставить .Parent.Select ?
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
16.01.2010, 17:09
Victor_V_V,
тогда не нужно просматривать ячейки таблицы, если такого рода информация содержится только в столбцах, где ты ищешь. Веди поиск по всему документу, так будет быстрее (хотя точно не знаю, просто так написал).
Visual Basic
1
2
3
WHILE .Execute
.parent.select
With Selection.Find
Только не цитируй, и так понятно, что тебе надо. А то очень много цитирования получается.
0
0 / 0 / 0
Регистрация: 14.01.2010
Сообщений: 20
16.01.2010, 22:32  [ТС]
ok, попробовал вот так сделать, поиск по всему тексту, но вставка текста в конце модуля не производится
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    With Selection.Find
        .ClearFormatting
        .Text = "*Class2*Student Number Change"
        .Replacement.Text = ""
        .Forward = True
        .Format = False
        .MatchWildcards = True
        .Wrap = wdFindContinue
           While .Execute
           .Parent.Select
           With Selection.Find
              .Text = "/ §"
              .Forward = True
              .Wrap = wdFindContinue
           End With
           Selection.Find.Execute
              If Selection.Find.Found = False Then _
                 Selection.HomeKey Unit:=wdLine
                 .Text = "Изменение числа студентов в классе№2 / § "
           Wend
    End With
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
16.01.2010, 23:06
Victor_V_V
сделай комментарии к своему коду и убери знак переноса на следующую строчку, о котором тебе писали здесь.
И нет
Visual Basic
1
end if
Искать нужно во всём документе, у тебя ищет только там, где курсор стоит:
Visual Basic
1
With ActiveDocument.Range.find
Добавлено через 11 минут
Victor_V_V,
и вот это что такое?
Visual Basic
1
.Text
0
0 / 0 / 0
Регистрация: 14.01.2010
Сообщений: 20
17.01.2010, 22:20  [ТС]
Busine2009, вот я сделал еще 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
    With ActiveDocument.Range.Find
        .ClearFormatting
        Do While .Execute(FindText:="*Class2*Student Number Change", _
        Format:=False, MatchWildcards:=True, Wrap:=wdFindContinue, Forward:=True) = True  'находим искомый текст
            .Parent.Select
            With Selection.Find
               .ClearFormatting
               'проверяем условие, был ли уже произведен перевод (вставка текста)
               .Execute FindText:="/ §", Format:=False, Forward:=True    
            End With
            If .Found = False Then    
               'если перевод и символы / § ещё не были вставлены, 
               'то производится вставка перевода в начале текста
            .Parent.Select
            With Selection
            .HomeKey Unit:=wdLine
            .Collapse Direction:=wdCollapseStart
            .TypeText Text:="Изменение числа студентов в классе№2 / § "
            End With
            End If
        Loop
    End With
Второй вариант производит вставку текста там где надо, но не выходит из цикла, вставка продолжается бесконечно…
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
    With ActiveDocument.Range.Find
        .ClearFormatting
        .Text = "*Class2*Student Number Change" 'находим искомый текст
        .Replacement.Text = ""
        .Forward = True
        .Format = False
        .MatchWildcards = True
        .Wrap = wdFindContinue
           While .Execute
             .Parent.Select
               'проверяем условие, был ли уже произведен перевод (вставка текста)
             With Selection.Find
              .Text = "/ §"
              .Forward = True
              .Wrap = wdFindContinue
             End With
               'если перевод и символы / § ещё не были вставлены, 
               'то производится вставка перевода в начале текста
                 If Selection.Find.Found = False Then
                 Selection.HomeKey Unit:=wdLine
                 Selection.TypeText Text:="Изменение числа студентов в классе№2 / § "
                 End If
           Wend
    End With
опять же, не знаю в чем еще ошибки...
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
18.01.2010, 07:45
Victor_V_V,
я сейчас тоже не понимаю ничего: выпил 0,5 л балтики 9 и 0,5 л Охоты.
У тебя задача искать во всём документе или в определенной таблице?

Добавлено через 6 часов 32 минуты
Victor_V_V,
Вот так попробуй:
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
Sub m()
 
With ActiveDocument.Range.find
        .ClearFormatting
        .Text = "*Class2*Student Number Change" 'находим искомый текст
        .Replacement.Text = ""
        .Forward = True
        .Format = False
        .MatchWildcards = True
        .Wrap = wdFindStop
        
           While .Execute
             .Parent.Select
               'проверяем условие, был ли уже произведен перевод (вставка текста)
             With Selection.find
              .Text = "/ §"
              .Forward = True
              .Wrap = wdFindStop
              .Execute
             End With
               'если перевод и символы / § ещё не были вставлены,
               'то производится вставка перевода в начале текста
                 If Selection.find.Found = False Then
                 Selection.HomeKey Unit:=wdLine
                 Selection.TypeText Text:="Изменение числа студентов в классе№2 / § "
                 End If
           Wend
    End With
End Sub
0
0 / 0 / 0
Регистрация: 14.01.2010
Сообщений: 20
18.01.2010, 15:37  [ТС]
Busine2009, спасибо огромное, так всё работает, не догадался поставить
Visual Basic
1
.Wrap = wdFindStop
0
0 / 0 / 0
Регистрация: 14.01.2010
Сообщений: 20
02.02.2010, 06:47  [ТС]
Опять нужна помощь по макросу для Word:
В 4-м столбце таблицы расположены даты, но цифры стоят после названий месяцев, надо поменять их местами.
Этот фрагмент макроса ищет в 4-м столбце таблицы с текстом название месяца с последующей цифрой - датой, потом удаляет название месяца перед цифрами и помещает аналогичное название после цифр (в конце текста данной ячейки таблицы).

Вот пример, но тут какая-то ошибка, приводит к бесконечному циклу.
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
    Dim t As Table
    Dim oCell As Cell
    Dim oRng As Range
    Dim vrange As Range
    Set t = ActiveDocument.Tables(1)
    For Each oCell In t.Columns(4).Cells
      Set oRng = oCell.Range
      With oRng.Find
        .Text = "янв. [0-9]"  'находим название месяца, сопровождамое любой цифрой
        .Wrap = wdFindStop
        .Format = False
        .MatchWildcards = True
        While .Execute
          Set vrange = Selection.Range
           vrange.Select   'здесь какая-то ошибка
           With Selection 'уменьшаем выделение с левой стороны, чтобы не удалить цифры
            .MoveLeft Unit:=wdCharacter, Count:=2, Extend:=wdExtend
            .Delete          'удаляем название месяца
            .EndKey Unit:=wdLine
            .TypeText Text:=" янв." 'перепечатываем название месяца в конце текста
           End With
        Wend
      End With
    Next
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
02.02.2010, 08:21
Victor_V_V,
через parent выделяй. wrap можешь удалить.
0
0 / 0 / 0
Регистрация: 14.01.2010
Сообщений: 20
03.02.2010, 07:00  [ТС]
Цитата Сообщение от Busine2009 Посмотреть сообщение
Victor_V_V,
через parent выделяй. wrap можешь удалить.
Появляется сообщение Runtime Error 438
Object doesn't support this property or method


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
    
    Dim t As Table
    Dim oCell As Cell
    Dim oRng As Range
    Dim vrange As Range
    Set t = ActiveDocument.Tables(1)
    For Each oCell In t.Columns(4).Cells
      Set oRng = oCell.Range
      With oRng.Find
        .Text = "янв. [0-9]"
        .Format = False
        .MatchWildcards = True
        While .Execute
          Parent.Select  'здесь останавливается и появляется ошибка
          With Selection
           .MoveLeft Unit:=wdCharacter, Count:=2, Extend:=wdExtend
           .Delete
           .EndKey Unit:=wdLine
           .TypeText Text:=" янв."
          End With
        Wend
      End With
    Next
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
03.02.2010, 08:29
Victor_V_V,
я setы вообще не использую и не умею ими пользоваться, расскажи мне, зачем ты это делаешь? Это просто вопрос, а не что-то там.
0
0 / 0 / 0
Регистрация: 14.01.2010
Сообщений: 20
03.02.2010, 19:54  [ТС]
Да просто в одном примере было. Иногда использование range удобнее, чем Selection, но наверное не в этом случае...
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
03.02.2010, 22:04
Victor_V_V,
set - это создание объектной переменной.
Обоснуй использование set в твоём случае: для чего ты это делаешь?
Объектная переменная - это область в оперативной памяти, имеющая имя - аналог файл, находящийся на жёстком диске.
0
0 / 0 / 0
Регистрация: 14.01.2010
Сообщений: 20
06.02.2010, 22:10  [ТС]
Да ладно, мне на самом деле пофигу что там какие-то областя создаются, у меня памяти много, и я в этом не разбираюсь. В примере было 2 варианта поиска: через select и через range, и я их оба использую как в шаблонах показано.
А тут на самом деле просто точку пропустил в начале строки (.Parent.Select ), так что спасибо!

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    
    Dim t As Table
    Dim oCell As Cell
    Dim oRng As Range
    Set t = ActiveDocument.Tables(1)
    For Each oCell In t.Columns(4).Cells
      Set oRng = oCell.Range
      With oRng.Find
        .Text = "янв. [0-9]"
        .Format = False
        .MatchWildcards = True
        While .Execute
          .Parent.Select  'сейчас работает
          With Selection
           .MoveLeft Unit:=wdCharacter, Count:=2, Extend:=wdExtend
           .Delete
           .EndKey Unit:=wdLine
           .TypeText Text:=" янв."
          End With
        Wend
      End With
    Next
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
07.02.2010, 07:20
Victor_V_V,
Без сетов, но не проверял этот код, т.к.не хочу даже вникать, что ты там ищешь.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Sub someone()
Dim oCell As Cell
    For Each oCell In ActiveDocument.Tables(1).Columns(4).Cells
        With oCell.Range.Find
            .Text = "янв. [0-9]"
            .Format = False
            .MatchWildcards = True
                While .Execute
                    .Parent.Select  'здесь останавливается и появляется ошибка
                        With Selection
                            .MoveLeft Unit:=wdCharacter, Count:=2, Extend:=wdExtend
                            .Delete
                            .EndKey Unit:=wdLine
                            .TypeText Text:=" янв."
                        End With
                Wend
        End With
    Next
End Sub
1
0 / 0 / 0
Регистрация: 14.01.2010
Сообщений: 20
07.02.2010, 16:30  [ТС]
Busine2009, спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.02.2010, 16:30
Помогаю со студенческими работами здесь

добавление условия в оператор If then
Есть часть кода, нужно чтобы при n = 3, он копировал не следующую строку а предыдущую, как это...

Что означают слова INPUT,THEN и.д
Что означают слова INPUT,THEN и.д

Оператор if...then
Как это записать покомактней? ' ... IF (a < 0 AND b < 0 AND c = 0) OR (a < 0 AND b = 0 AND c < 0)...

If-Then-Else или Select Case: что предпочтительнее использовать
В чем их разница ? Когда применять эффективна (точнее в каких задачах) If....Then...Else. И когда...

If /Then/Else
Помогите, пожалуйста. Создать функцию пользователя z(x) с использованием оператора условного...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
BOINC: 22 года — и всё ещё работает
Programma_Boinc 12.03.2026
BOINC: 22 года — и всё ещё работает Дэвид Андерсон написал ретроспективу. Кратко: в 2001 году он ушёл из United Devices, где был CTO, и за несколько месяцев написал ядро BOINC — клиент, сервер,. . .
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru