冷凝大配方

时间:2018-05-07 09:19:34

标签: excel excel-formula

我想知道是否有人可以通过浓缩/缩短这个公式来启发我:

=IF(ISNUMBER(SEARCH("Kirkintilloch",B2)),"BRN01",IF(ISNUMBER(SEARCH("Tweacher",B2)),"BRN01",IF(ISNUMBER(SEARCH("Lenzie",B2)),"BRN01",IF(ISNUMBER(SEARCH("Bishopbrigg",B2)),"BRN03",IF(ISNUMBER(SEARCH("Torrance",B2)),"BRN03",IF(ISNUMBER(SEARCH("Bearsden",B2)),"BRN04",IF(ISNUMBER(SEARCH("Milngavie",B2)),"BRN04")))))))

B列将包含一个来自这七个城镇之一的地址。 我没有IF然后Lookup的原因是我想要返回的结果并不是唯一的,即I.e. Kirkintilloch& Torrance都需要返回BRN01的结果。

如果不能简化这一点,那就不用担心了。它会在更大的工作中为我节省大量工作,并带来更多可能的结果。

2 个答案:

答案 0 :(得分:0)

我已经制作了一个可以使用的VBA功能。它也很好,因为它可以在Cell中运行(参见链接图像)

如果您有更多城镇名称:代码匹配,您可以继续添加相同结构的字典

https://i.stack.imgur.com/Xl4Z6.png

Public Function TownCode(ByVal keyValue As String) As Variant

Dim dict As New Scripting.Dictionary
    Set dict = New Scripting.Dictionary

    dict.CompareMode = vbTextCompare
    dict.Add "Kirkintilloch", "BRNO1"
    dict.Add "Tweacher", "BRNO1"
    dict.Add "Lenzie", "BRNO1"
    dict.Add "Bishopbrigg", "BRN03"
    dict.Add "Torrance", "BRN03"
    dict.Add "Bearsden", "BRN04"
    dict.Add "Milngavie", "BRN04"

    Dim returnValue As Variant
        returnValue = dict(keyValue)

    TownCode = returnValue
End Function

答案 1 :(得分:0)

这是一个数组公式 - 使用 Ctrl + Shift + 输入确认,同时仍在公式栏中:

=INDEX(Towns,SMALL(IF(ISNUMBER(SEARCH(INDEX(Towns,0,2),B2)),INDEX(Towns,0,1)),1),3)

打破这个局面:

首先,您需要创建一个命名范围(我称之为我的"城镇"),其中包含索引数组,城镇名称和所需的回报"BRN**"(您可以将其设为简单的范围,只是参考,但我通过选择公式中的范围,突出显示它并使用F9计算进入实际数组)

enter image description here

现在你有了这个数组,我使用为行参数提供0的索引来返回所有行,这样我就可以一次只对一个列。

IF(ISNUMBER(SEARCH(INDEX(Towns,0,2),B2)),INDEX(Towns,0,1))

由于这是一个数组公式,每个行都是单独评估的,结果(找到匹配时的第一列 - 数组的索引)作为数组返回,如下所示:{FALSE;FALSE;3;FALSE;FALSE;FALSE;FALSE}

然后我使用SMALL()来捕获最低数字或第一个匹配来为第三列提供另一个索引。

enter image description here