我试图在Excel 2010中“Unconcatenate”一个字符串。是的,我知道这不是一个真正的单词。非常好;我有一个单元格无法拆分成多个列,单元格如下所示:
第1项,第2项,第3项
现在这个细胞可能有0-?项目。我想将一个单元格与另一个工作表中的列进行比较。我相信我需要使用匹配函数来执行此操作,但我需要将第一个单元转换为函数中的数组,并使用分隔符作为逗号。 到目前为止,我有= MATCH( 单元格中的每个项目 ,SHEET2!A:A,0)
任何帮助都会很好。我知道= Left和= Right,但我不认为这些会起作用,因为每个单元格中的项目数可能不一样。感谢
编辑:
详细说明: 在我的第一张纸上,我有一个下拉框。当您选择项目时,它会在此项目的表格2上执行vlookup。当发生这种情况时,我希望它还检查该行中的单元格E(第1项,第2项,第3项)是否与工作表3中列中的任何单个单元格匹配
答案 0 :(得分:3)
以下代码公开了VBA的Split函数以供工作表使用 - 它返回使用指定分隔符拆分的项的行数组。例如,如果单元格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
这是一个数组函数。要在电子表格中使用返回的元素:
或者,可以使用INDEX函数选择单个元素 - =INDEX(EXPLODE(A1,1,2)
将使用前面的示例返回“Item 2”。 (给定范围或数组,INDEX函数返回第i行和第j列中的值。)此用法不要求将公式作为数组公式输入。
对于您的用例,将与其他功能组合。你有一个字符串,其中包含多个“aa,bb,cc”形式的项目(VLOOKUP的结果),并且想要确定该字符串的任何元素是否可以作为A列中任何单元格中的单个项目找到如果找到所有元素,你想要一个返回True的函数,否则返回False。以下公式实现了这一结果:
=SUM(SIGN(IFERROR(MATCH(TRIM(EXPLODE(D1,",")),$A:$A,0),0)))=COUNTA(EXPLODE(D1,","))
这是一个数组公式,需要输入 Control - Shift - Enter 。请注意,我使用了单元格D1的内容来代替您的查找值。 TRIM函数用多个项删除字符串元素之间的任何无关空格。
答案 1 :(得分:0)
(不是真正的答案,只是想弄清楚问题是什么)
工作表1有一个包含许多项目的下拉框,所选项目用于查看工作表2中的表格的vlookup()。
表2有2(+)列,一列是用于vlookup的索引,另一列是包含分隔列表。
工作表3有1(+)列,每行的值可能对应于工作表2中某个分隔列表中的项目。
当在工作表1的下拉框中选择了一个项目时,我想在工作表2中查找相应的列表(使用vlookup),然后查看该工作表中是否存在该工作表中的任何项目。
这是你想要做的吗?如果是,这次搜索的结果是什么?
没有? :(
<强>更新强>
只使用工作表函数执行此操作会非常棘手!
VBA是一个更好的选择。 (最后一步至少)
将以下代码添加到新模块(不是工作表或工作簿模块)中,它将在工作表中以UDF形式提供。
这个函数接受一个字符串(这是你的分隔列表)它在函数内爆炸,所以你不必担心这样做。
我没有对它进行测试,但理论上它应该允许你传递一个列表。然后,该功能应该为您检查表3,并根据天气的发现返回真/假。
我知道你找到了答案,但这是我的功能的一个有效且稍快的版本。
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