我想知道是否有人可以通过浓缩/缩短这个公式来启发我:
=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
的结果。
如果不能简化这一点,那就不用担心了。它会在更大的工作中为我节省大量工作,并带来更多可能的结果。
答案 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计算进入实际数组)
现在你有了这个数组,我使用为行参数提供0的索引来返回所有行,这样我就可以一次只对一个列。
IF(ISNUMBER(SEARCH(INDEX(Towns,0,2),B2)),INDEX(Towns,0,1))
由于这是一个数组公式,每个行都是单独评估的,结果(找到匹配时的第一列 - 数组的索引)作为数组返回,如下所示:{FALSE;FALSE;3;FALSE;FALSE;FALSE;FALSE}
然后我使用SMALL()
来捕获最低数字或第一个匹配来为第三列提供另一个索引。