VBA尝试将完整字符串与部分字符串匹配以查找相应的值

VBA尝试将完整字符串与部分字符串匹配以查找相应的值,vba,excel,lookup,Vba,Excel,Lookup,所以我知道,根据标题,你们中的大多数人可能坐在那里想知道我在说什么 基本上,我有一个大约30000个项目的列表,其中有300多个办公室的办公室代码,我需要按区域进行细分。不幸的是,我在实际查找它们时遇到了问题 为了让你们知道我在说什么,这里有一个我模拟的例子。公司名称已明显更改,所有代码都是随机生成的 我遇到的问题与这些名称的格式有关 所有办公室都由公司名称、办公室代码、一串字母/数字,甚至是识别其他事物的句子来标识 不幸的是,这些代码高度不一致。我玩弄了vlookup和搜索函数来返回特定的整数

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

基本上,我有一个大约30000个项目的列表,其中有300多个办公室的办公室代码,我需要按区域进行细分。不幸的是,我在实际查找它们时遇到了问题

为了让你们知道我在说什么,这里有一个我模拟的例子。公司名称已明显更改,所有代码都是随机生成的

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

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

不幸的是,这些代码高度不一致。我玩弄了vlookup和搜索函数来返回特定的整数,但由于数据的排列方式,结果不可靠。许多办公室代码是3个字符长,而有些是6个字符,有些甚至用破折号分隔(不幸的是,这使我无法使用搜索、左键和vlookup组合使用破折号进行查找)

因此,我试图找出如何在VBA中创建一个函数,以查看数据并在办公室列表中找到最佳匹配

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

基本上,我试图找出一些方法,根据可用办公室列表搜索每一行,并根据第一系列字符顺序选择最适合的

因此,IKEA-OEE-ZOPJSK不会与IKEA-ZOP-OEE匹配,因为它正在查找的条目不是IKEA-OEE


谢谢你的建议

所以假设数据从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一样工作,但是它将评估表数组,看看它是否是最早在查找值中找到的搜索值,并返回其中的一个

它也适用于部分字符串,所以使用上面的示例IKEA-ZOP-OEE和表数组OEE,ZOP。ZOP将作为字符串中最早的一个返回:

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
公共函数fxFirstReturn(查找值作为范围,表数组作为范围,列索引作为长度)作为字符串
尺寸i等于长度,j(0到2)等于长度
对于表_array.Rows.Count的i=1
j(2)=InStr(1,表数组单元格(i,1),查找值)
如果(j(2)0,那么
j(0)=j(2)
j(1)=i
如果结束
下一个
如果j(1)=0,则
fxFirstReturn=“错误”
其他的
fxFirstReturn=table_array.Cells(j(1),column_index_num)
如果结束
端函数

heh,聚合是什么时候引入的?我还没有使用过它,而且它似乎非常有用,因为我经常使用数组公式a{=sum(iferror(A1:A2,0))}来制作等价物。关于聚合,需要记住的是,它是数组类型的公式,所以所有相同的限制都适用,但它不需要CSE输入。而且,只有少数选项允许像上面这样的数组条目。虽然您的sum示例可以使用:
=AGGREGATE(9,6,A1:A2)
AGGREGATE是在Excel 2010中引入的。这非常出色,几乎可以完美地工作!我甚至不知道聚合命令的存在(尽管如果我完全诚实的话,我永远不会想到这样使用它)。最重要的是,这将在不需要另存为启用宏的文档的情况下工作,而在某些无法启用宏的公司计算机上工作时,这将是非常宝贵的。再次感谢!这似乎将是非常有用的,不幸的是,我有一些麻烦,让它工作。它不断返回#值!当我尝试使用它时。假设完整的办公室名称在A2:A10中,我的查找值在C2:C5中,区域在D2:D5中,那么当我将函数输入单元格时,该函数不应该是这样的吗=fxFirstReturn(c2:c5,a2:a10,2)还是列索引数应该是4,因为D是第四列?我用两种方式运行它,但我仍然得到一个#值!很遗憾,Excel无法一步一步地计算公式。