我有一个正在 Excel 中开发的搜索工具。在列“EU”中,我有一些单元格,每个单元格包含一个 124 位数字的字符串。这些字符串由 0 和 1 组成。我有 124 个产生 1 或 0... 的特征,用户可能想要搜索 1、2、3、4、5 等特征。为简单起见,假设 EU1 有字符串 0100100011.....我想找到任何包含 0100100000 或可能包含 0000100010 等的单元格。换句话说,我想找到任何在特定数字位置包含“1”的字符串,可能是在几个数字位置包含几个 1..........例如我想测试这 3 种组合中的任何一种.....
00000100000000010000000000000010010000010000000100000010010000000001001000000000010110010000010000000000000000000000000000000000100 000000000010100010000000100100100100000000100000010010000000010010000000100100000100000100000100000100000100000100000100000100000000000000000000000001000100 000000000000110000010000010001001010000010000010000001001001000000000010010000000001001000010001000010000100000100000000000000000000000001000100
这些位置有 1......
1000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000001000100000000000000000000000000
如果其他位置有 1,那就没问题,但如果测试条件中有 1 而测试位置的该数字中有零,那就不行。
换句话说,使用更容易理解的例子,假设我的字符串只有 5 个字符长,并且我的前 5 个字符串是
EU1 10000
EU2 10001
EU3 11000
EU4 11011
EU5 00001
我想搜索指定字符位置列表中所有包含1
s 的字符串,方法是将每个字符串与包含1
我想要的所有位置的变量搜索字符串进行比较1
。变量中的零是通配符。另一种说法是,搜索字符串充当掩码。
例如,要查找前两位数字为1
s 的字符串(不关心其余数字),我需要指定11000
并获取与字符串 EU3 和 EU4 的匹配项。(这可能表示搜索A角和乙搜索10000
(所有对象都是Angular) 应该匹配所有第一个数字为 的字符串1
,即 EU1、EU2、EU3 和 EU4。
11100
(所有对象都是A角和乙卢和Circular)应该不会产生匹配,因为没有字符串包含1
在第三位数字的位置。相反,00000
应该匹配所有字符串,因为全零搜索字符串是通配符。
以表格形式:
搜索字符串:11000 10000 11100 00000 ↓↓ ↓ ↓↓↓ 欧盟1 10000 →10000 10000 → 10000 欧盟2 10001 →10001 10001 → 10001 欧盟3 →11000 →11000 11000 → 11000 欧盟4 →11011 →11011 11011 → 11011 EU5 00001 00001 00001 → 00001 (无)(全部)
答案1
为简单起见,我将数据放入E
第 2 行开始的列中。我将搜索字符串放入单元格中D2
。(当然D2
,列E
必须格式化为文本,或者必须'
在每个数字前键入单引号 ( )。)
我选择了使用 Excel 的原生搜索功能。搜索字符串表示11000
我们正在寻找第一位数字为1
、第二位数字为1
、第三至第五个字符为任意值的值。正如您所说,变量(搜索字符串)中的零是通配符。
此通配符的标准表示是11???
- 因此我将单元格设置D3
为
=SUBSTITUTE(D2, "0", "?")
问题没有指定结果应如何呈现。一种方法是,对于 Column 中的每个值E
,指示它是否匹配。我们可以通过以下方式做到这一点搜索查找通配符字符串的每个E
值。如果找到,SEARCH
则返回 1,否则返回错误。因此,我们可以TRUE
通过FALSE
将
=NOT(ISERROR(SEARCH($D$3, E2)))
放入F2
,然后向下拖动以覆盖所有E
数据。(请注意FIND
不允许使用通配符。)
但拥有匹配值的索引列表可能会更方便。我们可以通过使用MATCH
搜索列来获取它。我在单元格中输入 1 G1
,然后
=MATCH($D$3, INDEX($E$2:$E$99, G1):$E$99, 0) + G1
到单元格中G2
(调整99
s 以对应最后一个数据行)并向下拖动/填充。这将在列中搜索通配符字符串(位于 中D3
)E
,从上一个匹配点开始。这将返回排匹配的数量;例如,“字符串 D”(11011
,位于单元格中E5
)报告为 5。如果您希望将“字符串 D”报告为 4,这是一个简单的调整。
以下是您所建议的样本数据的结果:
当然,单元格D3
和G1
可以隐藏。而且,如果您确实需要在第一行开始数据,也可以安排。
PS:我已经用 124 个字符长的值对此进行了测试,答案的两个部分似乎都有效。
答案2
假设我们在列中有数据欧洲联盟从欧盟1到欧盟100。要查找与模式匹配的单元格,请使用:
Sub Finderr()
For i = 1 To 100
v = Cells(i, "EU").Text
If Mid(v, 1, 1) = "1" And Mid(v, 70, 1) = "1" And Mid(v, 91, 1) = "1" Then
MsgBox i
End If
Next i
End Sub
将输出包含匹配的行。