Vba 创建Excel用户定义函数以匹配列表中的同义词

Vba 创建Excel用户定义函数以匹配列表中的同义词,vba,excel,match,user-defined-functions,Vba,Excel,Match,User Defined Functions,在我的工作中,我们管理着几处租赁物业。这些属性中的每一个都可能有不同的名称。例如,一个属性可能被称为琥珀网关、白金网关、网关等。我们可能有500-600个Excel工作簿,其中包含不同类型的信息&可能会要求我从不同的工作簿中提取信息 由于缺乏一致的命名方法,我无法使用标准的索引/匹配函数来查找数据。我不确定这是否是最好的解决方案,但这一直是我解决问题的方法 我创建了一个工作表,其中包含a列中所有属性名称的列表。所有相关名称都列在B列、C列等的同一行的右侧。为了简单起见,假设只有5个属性,我所有的

在我的工作中,我们管理着几处租赁物业。这些属性中的每一个都可能有不同的名称。例如,一个属性可能被称为琥珀网关、白金网关、网关等。我们可能有500-600个Excel工作簿,其中包含不同类型的信息&可能会要求我从不同的工作簿中提取信息

由于缺乏一致的命名方法,我无法使用标准的索引/匹配函数来查找数据。我不确定这是否是最好的解决方案,但这一直是我解决问题的方法

我创建了一个工作表,其中包含a列中所有属性名称的列表。所有相关名称都列在B列、C列等的同一行的右侧。为了简单起见,假设只有5个属性,我所有的数据都是A1:E5。然后说我感兴趣的属性是F1,我想“匹配”它的属性列表是G1:G5。因此,我的数据如下所示:

River          Stream         Creek         Brook          Rivulet
Apple          Fruit          
Rock           Boulder        Stone         Slab
Candy          Dessert        Sweets
Forest         Trees    
给出“巨石”一词和以下列表:

Candy
Fruit
Creek
Slab
Forest
我的目标是返回同义词“slab”的列表位置,在本例中为4。 我想我可以用下面的数组公式来代替Match函数。要做到这一点:

{=SUMPRODUCT(--(INDEX(A1:E5,SUMPRODUCT(--(A1:E5=F1)*ROW(A1:E5)),)
=G1:G5)*IF(G1:G5<>"",MATCH(G1:G5,G1:G5,0)))}
{=SUMPRODUCT(-)(索引(A1:E5,SUMPRODUCT(-)(A1:E5=F1)*行(A1:E5)),)
=G1:G5)*如果(G1:G5“”,匹配(G1:G5,G1:G5,0))}
现在这个公式有点笨拙,我希望把它转换成一个UDF,让它更容易使用。虽然我不熟悉VBA,但在进行了一些搜索之后,我意识到VBA逻辑的工作方式与Excel公式逻辑的工作方式大不相同。具体地说,我不认为我可以像在SUMPRODUCT函数中那样,在VBA中使用=强制我的查找网格为真/假值。我必须学习VBA才能将其作为UDF实现,还是有其他解决方案?实际上,我的查找网格(A1:E5)将位于外部工作簿中

如果我的尝试完全偏离了目标,我愿意接受其他解决方案。我知道Match-formula函数支持通配符,但在名称截然不同的情况下它不起作用,所以我希望有更全面的功能


这是我第一次在这里提问,所以请告诉我这是否属于其他地区,或者我忽略了什么礼仪问题。

听起来你需要使用字典反对者,或者可能不需要。您的代码必须是这样的。。。。找到“巨石”并记下行。。。。从行中提取每个值,并使用它在列表中进行搜索提供更多示例,说明您将传递给UDF的参数以及您希望得到的结果get@AndreTerra我将向UDF传递两个参数。单个字符串和未知长度的1D范围,包含空白值和字符串,但不重复。单个字符串将有多个关联字符串,但这些字符串不会传递给UDF。如果单个字符串或其任何关联字符串在1D范围内,我想返回第一个匹配的相对位置。如果没有匹配项,则首选错误值。@jsotola我在实现类似的内容时遇到困难。我想我可以用谷歌搜索如何查找另一个工作簿&如何使用Find来定位行,但我遇到的问题是搜索列表。你对如何实施有什么建议吗?