我想“Unconcatenate”在Excel 2010中有一个字符串,我知道这是不是一个真正的字。 因此,相当多; 我有一个不能被分成多个列中的细胞是这样的细胞:
第1项,第2项,第3项
现在,这个小区可能有0-? 项目。 我想一个单元比较针对另一个工作表中的列。 我相信我会需要使用匹配函数来做到这一点,但我需要的是第一个单元格与分隔符为逗号被转换成一个阵列的功能。 到目前为止,我有= MATCH( 在小区内的每个项目 ,SHEET2答:A,0)
你能帮忙的话,我会很高兴。 我知道=左,右=的,但我不认为这会工作,因为项目在每个单元的数量可能不一样。 谢谢
编辑:
详细描述:在我的第一页我有一个下拉框。 当你选择的项目确实对这个项目表2 VLOOKUP。 当发生这种情况,我希望它也检查是否该行(第1项,第2项,第3项)的电池E在片材3配合在一列的任何各个单元的
下面的代码公开VBA的拆分功能表使用 - 它返回已使用指定分隔拆分项目的排阵。 例如,如果单元格A1包含文本“项目1,项目2”),爆炸(A1,“”)将返回的数组的元素“项目1”和“项目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
它是一个数组函数。 要使用在电子表格中返回的元素:
- 选择您想要的细胞中“爆炸”的项目显示
- 输入功能指定与源串(或参考,其包含源小区)的小区和在其上分裂将完成的分隔符
- 使用控制 ,完成条目- 转移 - Enter组合键。
可替换地,单个元件可以使用INDEX function--被选择=INDEX(EXPLODE(A1,1,2)
将返回“项目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,","))
它是一个数组式,需要与控制输入- 移位 - 输入 。 请注意,我用的细胞D1的内容代替您的查找值。 TRIM函数剔除与多个项目串的元件之间的任何多余的空格。
(不是一个真正的答案,只是想弄清楚的问题是什么)
片1具有与多个()在片材2在寻找一个表项中,所选择的项目是在VLOOKUP使用的下拉框。
片2具有2(+)列,其中一个是用于VLOOKUP的索引,并且其中包含分隔列表中的其他。
片3具有1(+)的列,每行有可对应于一个项目在分隔列表中的一个在片材2的值。
当在下拉框中选择上板1的项目我想查找在片2的对应列表(使用VLOOKUP),然后查看是否有任何在该列表中的项目的在片材3存在。
这是你的努力呢? 如果是的话,这是什么搜索结果?
- 布尔:真有些找到的匹配!假不匹配
- 编号:我发现这许多成果
没有? :(
更新
这样做,只有工作表函数将是相当棘手!
VBA是一个更好的选择。 (最后一步ATLEAST)
下面的代码添加到一个新的模块(未表或工作簿模块),这将是可作为对您的工作表一个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