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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.05.2013, 21:37   #11
Vadim39
Пользователь
 
Регистрация: 19.05.2013
Сообщений: 24
По умолчанию

Скрипт, большое спасибо. Как всегда - исчерпывающе.
Vadim39 вне форума Ответить с цитированием
Старый 29.05.2013, 22:43   #12
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

Цитата:
Vadim39: 2. Возможно ли в строке замены вернуть весь найденный текст (то, что в Word делается с помощью "^&").
Вот такой вариант можно попробовать для замены:
Код:
Sub Procedure_1()
    
    'Код работает с подключением библиотеки:
        'Tools - References... - Microsoft VBScript Regular Expressions 5.5.
    
    Dim myRegExp As VBScript_RegExp_55.RegExp
    Dim myMatchCollection As VBScript_RegExp_55.MatchCollection
    Dim myArray() As String
    Dim myString As String
    Dim i As Long
    
    
    '1. помещаем в переменную текст, который нужно анализировать.
    myString = "текст текст"
    
    '2. Создаём объект "RegExp" и даём ему VBA-имя "myRegExp".
        'Через это имя можно обращаться к этому объекту.
    Set myRegExp = CreateObject(Class:="VBScript.RegExp")
    
    '3. Поиск по всему тексту, а не до первого найденного фрагмента
    myRegExp.Global = True
    
    '4. Что ищем.
    myRegExp.Pattern = "текст"
    
    '5. Выполняем поиск. Результатом поиска будет
        'объект "MatchCollection".
    Set myMatchCollection = myRegExp.Execute(myString)
    
    '6. Если ничего не найдено, то переходим в нужную часть кода.
    If myMatchCollection.Count = 0 Then
        GoTo metka
    End If
    
    '7. Перемещаем данные в массив.
    ReDim myArray(0 To myMatchCollection.Count - 1)
    For i = 0 To myMatchCollection.Count - 1 Step 1
        myArray(i) = myMatchCollection.Item(i)
    Next i
    
    '8. Делаем поиск только до первого вхождения.
    myRegExp.Global = False
    
    '9. Замена. При замене текст должен изменяться,
        'чтобы при следующем витке цикла этот же текст уже не находился.
    For i = 0 To UBound(myArray) Step 1
        'Ищется то, что указано в п. 4.
        'Ищется в переменной "myString".
        'Искомый текст - это текст из массива, который был раньше найден.
        myRegExp.Replace myString, myArray(i)
    Next i
    
    '10. Смотрим, что в переменной в View - Immediate Window.
    Debug.Print myString
    
metka:
    
End Sub

Последний раз редактировалось Скрипт; 30.05.2013 в 07:55.
Скрипт вне форума Ответить с цитированием
Старый 30.05.2013, 01:08   #13
Vadim39
Пользователь
 
Регистрация: 19.05.2013
Сообщений: 24
По умолчанию

Спасибо, это работает. Правда, из-за использования метода .Execute, довольно медленно, особенно, если вхождений много.
А что вы скажете о таком "паллиативе": поскольку символ "$" в строке замены объекта "RegExp" все же предусмотрен, можно в паттерне взять искомое выражение в одни большие скобки, после чего "$1" в строке замены вернет его целиком. Верно?
Vadim39 вне форума Ответить с цитированием
Старый 30.05.2013, 08:27   #14
Вождь
Форумчанин
 
Аватар для Вождь
 
Регистрация: 29.09.2008
Сообщений: 378
По умолчанию

Цитата:
Сообщение от Скрипт Посмотреть сообщение
...нужно подключить библиотеку...
Можно и не подключать, но если уж, то правильно так:
Код:
Dim RE As RegExp ' Variant
Dim COL As MatchCollection ' Variant
Dim S As String
    
    S = "текст текст"
    Set RE = New RegExp ' CreateObject("VBScript.RegExp")
    RE.Global = True
    RE.Pattern = "((т)(е)(к)(с)(т))"
    Set COL = RE.Execute(S)
    MsgBox COL.Count
В комментариях версия, когда библиотека не подключена.
Макросы на заказ и готовый пакет - http://mtdmacro.ru/
Вождь вне форума Ответить с цитированием
Старый 30.05.2013, 08:31   #15
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

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


Цитата:
Вождь: то правильно так:
ошибки то в моём случае нет. Просто это какие-то мелочи.
Скрипт вне форума Ответить с цитированием
Старый 30.05.2013, 08:38   #16
Вождь
Форумчанин
 
Аватар для Вождь
 
Регистрация: 29.09.2008
Сообщений: 378
По умолчанию

Цитата:
Сообщение от Скрипт Посмотреть сообщение
...подключаю, чтобы было удобно...
Полностью поддерживам и одобрям

По поводу метасимволов в строке замены читаем здесь:
http://msdn.microsoft.com/en-us/libr...(v=vs.84).aspx
И, судя по официальной доке, ничего кроме $ нет.
Кстати, там же все родная дока по RegExp.
Макросы на заказ и готовый пакет - http://mtdmacro.ru/
Вождь вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создать класс "Фигура", от него наследованием создать 3 класса ("треугольник", "четырехугольник", "окружность") funnyy Помощь студентам 3 17.10.2012 17:40
Вывести название соответствующей карты вида "шестерка бубен", "дама червей","туз треф" и т.п. воваава Помощь студентам 3 01.12.2011 12:50
Visual Basic, использование операторов "for..next" и "if.. end if" Dieza Помощь студентам 0 27.10.2010 20:46
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04