Excel“UnCONCATENATE”/在函数中爆炸/将单元格转换为数组

我试图在Excel 2010中“不一致”一个string。是的,我知道这不是一个真正的单词。 非常非常 我有一个单元格,不能被分成多个列单元格看起来像这样:

项目1,项目2,项目3

现在这个小区可能有0-? 项目。 我想比较一个单元格与另一个表单中的列。 我相信我需要使用匹配function来做到这一点,但我需要第一个单元格被转换成一个数组在一个函数中的分隔符为逗号。 到目前为止,我有= MATCH( 单元格中的每个项目 ,SHEET2!A:A,0)

你能帮忙的话,我会很高兴。 我知道=左和右,但我不认为这些将工作,因为每个单元格中的项目数可能不一样。 谢谢

编辑:

详细的描述:在我的第一个工作表中,我有一个下拉框。 当你select物品时,它会在这个物品的表单2上进行查找。 当发生这种情况时,我希望它也检查该行(项目1,项目2,项目3)中的单元格E是否与表单3中列中的任何单个单元格匹配

下面的代码公开了用于工作表的VBA的分割函数 – 它返回已经使用指定的分隔符分割的项目的行数组。 例如,如果单元格A1包含文本“Item 1,Item 2”,则EXPLODE(A1,“,”)将返回一个包含元素“Item 1”和“Item 2”的数组。

Function EXPLODE(str As String, Optional delimiter As Variant) As Variant If IsMissing(delimiter) Then delimiter = " " End If EXPLODE = Split(str, delimiter) End Function 

这是一个数组函数。 在电子表格中使用返回的元素:

  • select您想要“爆炸”项目显示的单元格
  • input用源string指定单元格的函数(或对包含源的单元格的引用)以及将要完成分割的分隔符
  • 使用ControlShiftEnter组合键完成input

或者,可以使用INDEX函数来select各个元素 – =INDEX(EXPLODE(A1,1,2)将使用前面的示例返回“Item 2”(给定一个范围或数组,INDEX函数返回第i行和第j列)。此用法不要求将公式作为数组公式input。

对于你的用例,与其他function的组合将是有序的。 您有一个stringforms为“aa,bb,cc”(VLOOKUP的结果)的多个项目,并且想要确定是否可以在列A中的任何单元格中find此string的任何元素。如果find所有的元素,你需要一个返回True的函数,否则返回False。 以下公式可以达到这个结果:

  =SUM(SIGN(IFERROR(MATCH(TRIM(EXPLODE(D1,",")),$A:$A,0),0)))=COUNTA(EXPLODE(D1,",")) 

这是一个数组公式,需要用ControlShiftEnterinput 。 请注意,我使用单元格D1的内容来代替查找值。 TRIMfunction可以消除string元素与多个项目之间的多余空间。

(不是一个真正的答案,只是想弄清楚问题是什么)

工作表1有一个包含多个项目的下拉框,所选项目用于查看工作表2中的表格的vlookup()中。

工作表2有2(+)列,一个是用于查找的索引,另一个是包含分隔列表的索引。

工作表3具有1(+)列,每行都有一个值, 可能对应于工作表2中的一个分隔列表中的项目。

当在表格1的下拉框中select一个项目时,我想查找表格2中的相应列表(使用vlookup),然后查看表格3中是否存在该列表中的任何项目。

这是你想要做什么? 如果是的话,这个search的结果是什么?

  • 布尔:真 – 一些匹配find!,假 – 没有匹配
  • 数量:我发现了很多结果

没有? 🙁

更新

这样做只是工作表function将是相当棘手!

VBA是一个更好的select。 (最后一步至less)

将下面的代码添加到一个新的模块(而不是工作表或工作簿模块),它将作为工作表上的UDF可用。

这个函数需要一个string(这是你的分隔列表),它是在函数内部爆炸,所以你不必担心这样做。

我没有testing过,但理论上它应该允许你通过一个列表。 该function然后应该检查表3为您并返回真/假取决于天气项目被发现与否。

我知道你已经find了答案,但这是一个工作,稍微快一点的我的function版本。

 Public Function ValidateList(ByVal Target As Range) As Boolean Dim Sheet As Worksheet: Set Sheet = ThisWorkbook.Worksheets("Sheet3") ' Check Sheet3 is the correct sheet Dim List As Variant: List = Sheet.UsedRange.Columns("A").Value2 ' Set Column(A) to correct column Dim Items() As String: Items = Split(Target.Value2, ",") Dim Item As Long Dim Key As String Dim Result As Boolean: Result = False Dim Search As Object: Set Search = CreateObject("Scripting.Dictionary") For Item = LBound(Items) To UBound(Items) Search.Add Trim(Items(Item)), False Next Item If Search.Count > 0 Then ' Target List has 1+ Items For Item = LBound(List, 1) To UBound(List, 1) Key = Trim(List(Item, 1)) If Search.Exists(Key) = True Then Search.Remove Key End If If Search.Count = 0 Then Result = True Exit For End If Next Item Else ' Target List is Empty ' Optionally set result to True here if empty list should return True ' Defaults to False End If ValidateList = Result End Function