用于搜索3个单词的公式" text"在不同细胞中的任何序列

时间:2018-05-22 23:24:32

标签: excel excel-vba vba

请查看附件图片。我有很长的项目列表,并且我已经创建了一个常用的关键字来搜索该列表。我使用这个公式:

=INDEX(A:A,MATCH((("*"&B2&"*")&("*"&C2&"*")&("*"&D2&"*")&("*"&E2&"*")&("*"&F2&"*")),A:A,0))

搜索与我输入的序列相同的问题。 如果单元格中的单词序列与我的公式中的顺序不同,则会出错。

有没有办法可以搜索任何序列中任何单元格中存在的3个或更多单词?

如果有必要,我愿意使用VBA。

我的搜索结果:

my search results

2 个答案:

答案 0 :(得分:1)

这是用户定义的功能:

Public Function indexMX(rng As Range, pat1 As Range, pat2 As Range, pat3 As Range, pat4 As Range, pat5 As Range) As Variant
    Dim r As Range, rngx As Range, s(1 To 5) As String, Kount As Long, j As Long

    s(1) = pat1.Value
    s(2) = pat2.Value
    s(3) = pat3.Value
    s(4) = pat4.Value
    s(5) = pat5.Value

    Set rngx = Intersect(rng, rng.Parent.UsedRange)

    For Each r In rngx
        v = r.Value
        Kount = 0
        For j = 1 To 5
            If InStr(1, v, s(j)) > 0 Or s(j) = "" Then Kount = Kount + 1
        Next j
        If Kount = 5 Then
            indexMX = v
            Exit Function
        End If
    Next r
    indexMX = "no luck"
End Function

以下是其用法示例:

enter image description here

如您所见,我们为UDF()提供列的地址和五个关键字的地址,UDF()查找包含所有五个单词的第一个项目。

如果关键字为空,则不使用。 (因此,如果您只想搜索两个关键字,请将其他三个关键字留空)。如果未找到匹配项,则会返回短语 no luck

用户定义函数(UDF)非常易于安装和使用:

  1. ALT-F11调出VBE窗口
  2. ALT-I ALT-M打开了一个新模块
  3. 粘贴内容并关闭VBE窗口
  4. 如果保存工作簿,UDF将随之保存。 如果您在2003年之后使用的是Excel版本,则必须保存 该文件为.xlsm而不是.xlsx

    删除UDF:

    1. 按上述方式调出VBE窗口
    2. 清除代码
    3. 关闭VBE窗口
    4. 从Excel使用UDF:

      = myfunction的(A1)

      要了解有关宏的更多信息,请参阅:

      http://www.mvps.org/dmcritchie/excel/getstarted.htm

      http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx

      有关UDF的详细信息,请参阅:

      http://www.cpearson.com/excel/WritingFunctionsInVBA.aspx

      必须启用宏才能使其生效!

      修改#1:

      删除区分大小写,请替换:

      If InStr(1, v, s(j)) > 0 Or s(j) = "" Then Kount = Kount + 1
      

      使用:

      If InStr(1, LCase(v), LCase(s(j))) > 0 Or s(j) = "" Then Kount = Kount + 1
      

答案 1 :(得分:1)

是的,单个单元格可以从不同的单元格返回三个匹配的单词。此示例中的答案使用公式返回6个匹配项。不使用VBA和特殊数组函数。

这是公式:

=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUMPRODUCT((IFERROR(SEARCH(FIRST,TARGET),0)>0)*100000+(IFERROR(SEARCH(SECOND,TARGET),0)>0)*20000+(IFERROR(SEARCH(THIRD,TARGET),0)>0)*3000+(IFERROR(SEARCH(FOURTH,TARGET),0)>0)*400+(IFERROR(SEARCH(FIFTH,TARGET),0)>0)*50+(IFERROR(SEARCH(SIXTH,TARGET),0)>0)*6),"1",FIRST&DELIM),"2",SECOND&DELIM),"3",THIRD&DELIM),"4",FOURTH&DELIM),"5",FIFTH&DELIM),"6",SIXTH&DELIM),"0","")

您是否注意到指定的范围? FIRST,SECOND,THIRD等是单个细胞,每个细胞都有一个单词。我们正试图在TARGET中找到这些词。如果我们找到了这些单词,那么我们将在这个单元格中写下这个单词并且每个单词将被DELIM分隔

范围是可选的。在下图中,您将看到单元格A2包含单词"名为"。这是我们要找到的六个单词中的第一个,它可以表示为FIRST =" A2" ="命名为"在公式中,您会看到FIRST出现两次。你可以用"命名"替换它。并且单元格A2将变为空白,但公式的功能不会改变。

甚至TARGET也是可选的。它可以写成E1或逐字逐句输出。  我不知道为什么有人会这样做......但这是可能的。

DELIM在B2单元格,它是一个双倍空间

enter image description here

现在解释它的工作原理

SEARCH(搜索什么?,搜索在哪里?)这有助于确定是否存在匹配。如果您了解命名区域的内容,那么您已经弄清楚了语法是什么。返回TARGET中匹配的第一个字母的位置。在此公式中,它始终为1如果未找到,则数字为0

IFERROR(值,值)尝试执行操作。如果成功,则显示结果。如果出现错误,则显示第二个结果。此公式中的每个IFERROR实际上都是相同的:IFERROR(SEARCH(FIRST,TARGET),0)它在TARGET内部搜索,试图找到第一个单词。如果找到的结果为1且未找到的结果为0

从这里开始变得有点复杂,所以让我们回顾一下。我们打电话搜索了6次。对于我们想要找到的每个单词,我们一直在寻找TARGET。如果找到匹配,则结果为1,否则结果为0。具有讽刺意味的是,我们人类可以将它们放在一起并查看匹配,但公式无法确定哪些单词已经匹配而没有更多信息

SUMPRODUCT取两个或多个数组的乘积(乘法)的总和(加法)。

将两个数组相乘以获得产品 a, b, c * e, f, g = ae, bf, cg takethe sum of the product to get the SUMPRODUCT ae + bf + cg`

在考虑价格和数量时,这是最简单的。如果一个数组是一组商品的价格而另一个是同一组商品的数量,那么将两个数组相乘将创建一个新数组,其中每个元素是购买该组中该类型所有商品的成本。总计,并添加所有这些数字可以为您支付所有项目的总费用

这里我们将两个数组相乘:

Qty    Price
12.0    0.3
70.0    0.1
20.0    0.4

将它们相乘得到产品:

Qty    Price    Total
12.0    0.3     3.8
70.0    0.1     7.0
20.0    0.4     8.0

获取产品的总和:

Qty    Price    Total       
12.0    0.3     3.8     
70.0    0.1     7.0     
20.0    0.4     8.0     
                18.8 SUMPRODUCT 

让我们看一下公式的一部分:

SUMPRODUCT((IFERROR(SEARCH(FIRST,TARGET),0)&0)* 100000 + IFERROR(SEARCH(SECOND,TARGET),0)&0)* 20000 + ...

很容易看到这个细分市场正在寻找两个单词。我们知道SUMPRODUCT希望增加并添加数组。如果您认为(IFERROR(SEARCH(FIRST,TARGET),0)>0)是一个数组,那么您是对的!它不是技术意义上的数组,但它确实评估为单个值,可以将其视为1x1数组或单元格。敏锐的眼神和敏捷的机智,可能已经注意到我们提到的这个阵列上有一些东西。它最终的不平等!很多人都知道你可以通过用不等式测试它们来获取数值并将它们变成布尔值。所以让我们评估....在TARGET = 1内搜索FIRST因为FIRST ="命名为"在后面的TARGET waaaaaaay里面,因为我们不能保持1的错误。接下来我们做不等式1> 0 = TRUE一个大于零并且计算结果为TRUE

这就是我们现在所拥有的

SUMPRODUCT((TRUE*100000+IFERROR(SEARCH(SECOND,TARGET),0)>0)*20000+....

你现在可以识别阵列吗?我们知道TRUE是一个数组,1x1。你知道IFERROR位一直到不等式也是一个数组。让我们评估一下IFERROR ....数学上我们应该仍然从左到右工作但是相信我,如果我们让它滑动一次,我们就可以了。

IFERROR(SEARCH(SECOND,TARGET),0)>0)    SECOND = "array" = 1 = TRUE

你跟着我的空手吗?没关系,如果你没有在第一次做好准备,直到你理解为止。

插入值给我们这样的东西

SUMPRODUCT(TRUE*100000+TRUE*20000+...

SUMPRODUCT是PRODUCT的SUM(加法)(乘法) 所以我们正在添加我们繁殖的东西

SUMPRODUCT = (TRUE * 100000) +  (TRUE * 20000)

请记住,从1>开始是多么容易0到TRUE。我们已经全部进入布尔值TRUE"等于1这是一个有趣的事实,-1也等于TRUE。如果你曾经见过一个带有双重否定的公式,就像这个STUFF( - (MORESTUFF)那只是一些Excel向导的人确保他们获得+1而不是-1 ...好的,让我们回到正轨并进行评估

SUMPRODCUT = 1 * 100000 + 1 * 20000+....
SUMPRODCUT =  100000 + 20000+....
SUMPRODCUT =  120000+.....

我知道你一直在询问这些数字。十万?什么十万?我一直故意无视,直到讨论它变得方便。现在很方便。去看看whoooole公式,你就会找到一个模式。这些数字正在递减。任何做过按位逻辑的人都可以看到它的发展方向。我的时间不够,所以我会切入追逐。假设一个假设的情况,每个单词都匹配。你最终得到了

SUMPRODUCT = 100000 + 20000 + 3000 + 400 + 50 + 6
SUMPRODCUT = 123456
你正拉着我的腿123456?不我不是。我们几乎已经这样做了,如果你还在我身边,那么你就会把它开回家。

我们在前面有一大群SUBSTITUTE教师,我们必须摆脱它们。

我们还要与:"1",FIRST&DELIM),"2",SECOND&DELIM),"3",THIRD&DELIM),"4",FOURTH&DELIM),"5",FIFTH&DELIM),"6",SIXTH&DELIM),"0","")

抗衡

值得庆幸的是,他们是同一个问题的一部分。我们从中间开始工作。

SUBSTITUTE(SUBSTITUTE(text, old text, new text)
SUBSTITUTE(SUBSTITUTE("123456","1", FIRST & DELIM),"2",SECOND & DELIM)....

请记住,顶部DELIM指向一个持有双倍空格的单元格。每个DELIM都可以替换为" "或者你想要的任何其他分隔符。

SUBSTITUTE(SUBSTITUTE("123456","1", "named" & "  "),"2",SECOND & DELIM)...
SUBSTITUTE("named  23456","2",SECOND & DELIM)...
SUBSTITUTE("named  23456","2","array"& "  ")...
("named  array  3456")... and so on.

有问题吗?

好的,上课被解雇了!