2

我正在尝试在 Excel 2010 中“取消连接”一个字符串。是的,我知道这不是一个真实的词。差不多;我有一个无法拆分为多列的单元格,该单元格如下所示:

第 1 项、第 2 项、第 3 项

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

你能帮忙的话,我会很高兴。我知道 =Left 和 =Right,但我认为它们不会起作用,因为每个单元格中的项目数可能不一样。谢谢

编辑:

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

4

2 回答 2

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 函数用多个项目去除字符串元素之间的任何无关空格。

于 2013-04-10T01:06:58.980 回答
0

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

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

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

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

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

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

  • 布尔值:真 - 找到一些匹配!,假 - 没有匹配
  • 编号:我找到了这么多结果

不?:(

更新

仅使用工作表函数来做到这一点将相当棘手!

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
于 2013-04-10T01:19:27.573 回答