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

时间:2013-04-10 00:12:01

标签: excel concatenation excel-2010

我试图在Excel 2010中“Unconcatenate”一个字符串。是的,我知道这不是一个真正的单词。非常好;我有一个单元格无法拆分成多个列,单元格如下所示:

第1项,第2项,第3项

现在这个细胞可能有0-?项目。我想将一个单元格与另一个工作表中的列进行比较。我相信我需要使用匹配函数来执行此操作,但我需要将第一个单元转换为函数中的数组,并使用分隔符作为逗号。 到目前为止,我有= MATCH( 单元格中的每个项目 ,SHEET2!A:A,0)

任何帮助都会很好。我知道= Left和= Right,但我不认为这些会起作用,因为每个单元格中的项目数可能不一样。感谢

编辑:

详细说明: 在我的第一张纸上,我有一个下拉框。当您选择项目时,它会在此项目的表格2上执行vlookup。当发生这种情况时,我希望它还检查该行中的单元格E(第1项,第2项,第3项)是否与工作表3中列中的任何单个单元格匹配

2 个答案:

答案 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 

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

  • 选择要在其中展示“爆炸”项目的单元格
  • 输入指定具有源字符串的单元格的函数(或对包含源的单元格的引用)和将在其上进行拆分的分隔符
  • 使用 Control - Shift - Enter 组合键完成输入。

或者,可以使用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),然后查看该工作表中是否存在该工作表中的任何项目。

这是你想要做的吗?如果是,这次搜索的结果是什么?

  • 布尔值:True - 找到一些匹配项!,False-No Matches
  • 号码:我发现了很多结果

没有? :(

<强>更新

只使用工作表函数执行此操作会非常棘手!

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