Автор Тема: Excel VBA Макросы: Поиск в переменной определенного значения с последующем выполнением условия.  (Прочитано 228 раз)

Оффлайн Rengame113

  • Посетитель форума
  • Сообщений: 71
Файл имеет имя 01_21_5-1_топ.xls. Не хитрыми способами извлекаем имя в переменную NameFile1 (получаем: 01_21_5-1_топ). Вопрос, каким образом задать условия чтобы если в переменной встречается топ выполнялось условие 1, в противном случае условие2.

Оффлайн Администратор

  • Administrator
  • Сообщений: 1637
Представленный ниже макрос ищет не просто 'топ', а '_топ.'. Это связано  с тем, что буквосочетание 'топ' может быть частью другого более длинного слова, например 'потоп'.

Данный макрос ищет с учётом регистра (больших/маленьких букв). Чтобы искать без учёта регистра, есть два варианта:
1) в самом верху модуля напишите: Option Compare Text
2) добавьте параметр в функцию 'InStr': InStr(1, text, "_топ.", vbTextCompare)
В этом случае нужно ещё указать начало поиска (в данном случае 1 - то есть поиск с первого символа);
3) приведение сравниваемых фрагментов к одному регистру с помощью LCase: InStr(LCase(text), "_топ."). LCase переводит текст в маленькие буквы, второй фрагмент у нас маленькими буквами, поэтому нет необходимости заключать второй фрагмент внутрь LCase.

Макрос
Sub Макрос()

    Dim text As String
   
    ' Запись в переменную 'text' анализируемого текста.
    text = " 01_21_5-1_топ.xls"
   
    ' Если есть текст '_топ.'.
    If InStr(text, "_топ.") <> 0 Then
    ' Если нет текста '_топ.'.
    Else
    End If

End Sub

Оффлайн Администратор

  • Administrator
  • Сообщений: 1637
Если нужно искать 'топ' в конце строки.

В этом макросе поиск с учётом регистра (больших/маленьких букв). Чтобы искать без учёта регистра, есть такие варианты:
1) в самом верху модуля напишите: Option Compare Text;
2) приведите сравниваемые фрагменты к одному регистру с помощью LCase: LCase(text) Like "*_топ". LCase переводит текст в маленькие буквы, второй фрагмент у нас маленькими буквами, поэтому нет необходимости заключать второй фрагмент внутрь LCase.

Макрос
Sub Макрос()

    Dim text As String
   
    ' Запись в переменную 'text' анализируемого текста.
    text = " 01_21_5-1_топ"
   
    ' Если есть текст '_топ'.
    If text Like "*_топ" Then
    ' Если нет текста '_топ'.
    Else
    End If

End Sub

Оффлайн Администратор

  • Administrator
  • Сообщений: 1637
Поиск по целому слову с помощью 'Split'.

В этом макросе поиск с учётом регистра (больших/маленьких букв). Чтобы искать без учёта регистра, есть такие варианты:
1) в самом верху модуля напишите: Option Compare Text;
2) приведите сравниваемые фрагменты к одному регистру с помощью LCase: LCase(text(i)) = "топ". LCase переводит текст в маленькие буквы, второй фрагмент у нас маленькими буквами, поэтому нет необходимости заключать второй фрагмент внутрь LCase.

Макрос
Sub Макрос()
   
    ' У переменной 'text' делаем тип данных 'Variant'. Если не указывать тип данных, то переменной
        ' будет назначен тип данных 'Variant'.
    Dim text, found As Boolean, i As Long
   
    ' Запись в переменную 'text' анализируемого текста.
    text = " 01_21_5-1_топ"
   
    ' Разбивка текста на слова по символу '_'.
    text = Split(text, "_")
   
    ' Просмотр всех слов. Функция 'Split' создаёт массив, у которого порядковый номер
        ' первого элемента 0.
    ' Ищем от последнего слова к первому, т.к. предполагается, что искомый текст
        ' находится в конце слова. Чтобы ускорить макрос.
    For i = UBound(text) To 0 Step -1
        If text(i) = "топ" Then
            ' Делаем пометку, что есть искомый текст.
            found = True
            ' Остальные слова не просматриваем, т.к. искомый текст найден.
            Exit For
        End If
    Next i
   
    ' Если есть текст 'топ'.
    If found = True Then
    ' Если нет текста 'топ'.
    Else
    End If

End Sub

Оффлайн Rengame113

  • Посетитель форума
  • Сообщений: 71
Спасибо, все работает. Выбрал 3-й способ LCase.