#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
.
Вам следует внимательно изучить эти два метода, потому что они не так просты, как можно подумать.