Есть ли способ использовать подстановочные знаки для поиска точного соответствия?

#excel #vba

#excel #vba

Вопрос:

Я понимаю, что подстановочный знак можно использовать для поиска дополнительных символов поверх слова при фильтрации. Например, если я фильтрую по слову «Продажи», я могу заменить свой фильтр на «Продажи *», чтобы найти дополнительные символы помимо первых пяти. Есть ли способ использовать символ для остановки и фильтрации именно по «продажам», т. Е. Так, чтобы результаты «Операций продажи» не были включены?

Я попробовал это, и я думал, что это работает, но понял, что это не так.

 With Thisworkbook.Sheets("Sheet1")
    If .Range("A2").Value = "Sales" Then
        .Range("A2").Replace "Sales", "Sales?"
    End If
End With
  

Комментарии:

1. У вас есть какой-нибудь VBA, над которым вы уже работаете для «Продаж *»? Пожалуйста, опубликуйте это, чтобы мы могли поработать

2. Когда вы выполняете поиск в Excel, есть возможность сопоставить все содержимое ячейки . У VBA был бы эквивалент этому свойству.

3. * обозначает все, что предшествует слову или после него, ? обозначает один символ. «Продажи ?????????» Нашел бы операции продаж, если бы больше не было слов с такой длиной

4. * не означает «предшествующий», это означает любую последовательность символов с этой позиции.

5. Энди, говоря «Предшествующий», я имею в виду, *Sales предшествующий слову «Продажи» Sales* после слова «Продажи».

Ответ №1:

Вам не нужно использовать функцию подстановочных знаков. Если вы записываете макрос, используйте функцию замены, выберите Параметры и отметьте Match entire cell contents , вы увидите код, подобный этому.

 Sub Macro2()

    Cells.Find(What:="Sales", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
        :=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
        False, SearchFormat:=False).Activate
    ActiveCell.Replace What:="Sales", Replacement:="Foo", LookAt:=xlWhole, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Cells.FindNext(After:=ActiveCell).Activate
End Sub
  

Это LookAt:=xlWhole то, что обеспечивает полное совпадение.

Ответ №2:

Проблема с заменой

Вы нигде не сказали этого явно, но я предполагаю, что вы использовали свой код:

 With Thisworkbook.Sheets("Sheet1")
    If .Range("A2").Value = "Sales" Then
        .Range("A2").Replace "Sales", "Sales?"
    End If
End With
  

и в результате он заменил, например, Sales Operations на Sales? Operations , что вы не хотели, чтобы произошло.

Replace Метод имеет 8 аргументов, в то время как вы использовали только очевидные первые два:

What и Replacement

Причина вашего огорчения заключалась в том, что из-за последней выполненной вами операции Find or Replace 3-м аргументу LookAt было присвоено значение xlPart , что означает, что он найдет или заменит любое вхождение в ячейке, содержащей ваш What параметр «Sales». Это легко исправить, изменив вашу строку на:

 .Range("A2").Replace "Sales", "Sales?", xlWhole
  

Теперь, как LookAt , есть еще два важных аргумента, которые сохраняются каждый раз, когда выполняется замена или поиск:

SearchDirection и MatchCase

которые также лучше всего задавать при каждом выполнении Replace или Find .

Вам следует внимательно изучить эти два метода, потому что они не так просты, как можно подумать.