我需要对字符串**Mod*
(后跟特定字符**)应用文本过滤,例如"H"
,如下所示:
(一米二氮一x)、(一米三氮一x)、(一米四氮一x)、(一米五氮一x)、(一米六氮一x)等等。
- 但是**:结果中包含一些不需要的单元格,因为它包含字符串
"Moderate"
,例如:
- 但是**:结果中包含一些不需要的单元格,因为它包含字符串
(Moderate , Moderately)
.
因此,我添加了第二个过滤器来排除特定的字符串"<>*Moderate*"
- 问题**:一些单元格可能包含
“Moderate”
和Mod
,后面跟一个字符,例如:
- 问题**:一些单元格可能包含
Moderate xxx Mod H
,并且随后不包括在过滤的数据中。
尽管我需要这些细胞来产生预期的结果。
这是一个测试样本:
| ID描述|
| - ------|
| 东侧化学模块h旁|
| 所有中等水平的H & B和北部|
| 适度更换C & B型和北部|
| 型号A和型号H之间|
| 五中h管|
这是预期的结果
| ID描述|
| - ------|
| 东侧化学模块h旁|
| 所有中等水平的H & B和北部|
| 型号A和型号H之间|
这是我的代码,我需要克服这个障碍。
Option Explicit
Option Compare Text
Sub Filter_Critr()
Const critr1 As String = "*Mod*H*"
Const critr2 As String = "<>*Moderat*"
Dim ws As Worksheet, LRow As Long, rng As Range
Set ws = ActiveSheet
LRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
Set rng = ws.Range("A2:J" & LRow) 'Source Range to apply Filter on it
If Not ws.AutoFilterMode Then rng.AutoFilter 'Set AutoFilter if not already set
ws.AutoFilter.ShowAllData
rng.AutoFilter Field:=3, Criteria1:=critr1, Operator:=xlAnd, Criteria2:=critr2
ActiveWindow.ScrollColumn = 1
ActiveWindow.ScrollRow = 1
End Sub
4条答案
按热度按时间l3zydbqr1#
使用自动筛选时,除了完全匹配之外,无法使用2个以上的条件。那么,使用帮助器列如何?例如,使用正则表达式可以非常明确。以下是一个示例:
在工作表级别使用以下命令调用:
\b
-Assert后面的内容之前没有其他单词字符的单词边界;[Mm]od
-大写/小写“m”后跟“od”;(?!erate)
-Assert位置的负前瞻不跟“erate”;.*
-除换行符以外的任何(0+,贪婪)字符;\b[hH]\b
-匹配大写/小写字母“h”,并Assert它是具有单词边界的单个字母子字符串。现在你可以在你的自动过滤器中引用这些布尔值了。
eoxn13cs2#
我也认为
Autofilter
不能做你需要的。但是AdvancedFilter
应该做...AdvancedFilter
的一个缺点是它需要一个条件Range
,这个条件不能用数组来代替,但是基于数组,这样的范围可以被创建,设置和删除,请尝试下面的代码:上面的代码假定标题行是第二行!
u5i3ibmn3#
正如我所评论的,这也可以使用Power Query来完成,Windows Excel 2010+和Excel 365(Windows或Mac)中提供
使用增强查询的步骤
Data => Get&Transform => from Table/Range
或from within sheet
Home => Advanced Editor
Applied Steps
以了解算法tf7tbtn24#
这并不是一个完美的解决方案,因为它涉及到在过滤源数据之前编辑源数据。但是,如果您同意在数据中将“C&H”更改为“C & H”(这样H总是被空格包围或位于字符串的末尾)