Excel – 在列A中search单词。在行中find匹配项时,报告列B中的单词,然后在列A中search任何报告的单词

我想知道如何在列A中search一个string,报告列B中find的相应的string,然后再次search列A中的那些报告的string等。重复直到不再有匹配find。

我正在尝试创build一个用户友好的工作表或macrosinput框,它将search2300行的Excel工作表并生成报告。 我希望用户能够select将被search的“string”(我将使用下拉菜单执行此操作)。 表格/程序将然后:

  1. 在列A中search与所选string相匹配的所有匹配项;
  2. 报告在列B中find的相应的string(同一行作为匹配);
  3. 在列B中find所有报告的string,再次search列A;
  4. 重复步骤2)和3)直到找不到更多匹配。

目前在列A和列B上使用简单的filter。用户首先在列A中select他们希望过滤的string。然后他们必须手动确定列B中是否存在列A中的任何结果,如果是,则添加他们到列A的过滤标准。在某些情况下,这可能需要此过程的多次迭代,并可能变得相当耗时。

我的目标是消除用户需要手动完成这些迭代的需要。

这里是我正在看的一个简化的版本(实际的名字是更复杂的)。

Equipment Contents Box 1 Box 2 Box 1 Box 3 Box 1 Box 4 Box 1 Tool 1 Box 1 Tool 2 Box 1 Tool 3 Box 2 Box 5 Box 2 Tool 4 Box 2 Tool 5 Box 3 Box 6 Box 3 Tool 6 Box 3 Tool 7 Box 4 Tool 8 Box 5 Tool 9 Box 6 Tool 10 

例如“框2”包含“框5”,“工具4”和“工具5”。 “框5”包含“工具9”。 因此,如果用户select“框2”,则报告将生成四行报告; “框5”,“工具4”,“工具5”和“工具9”(不一定按此顺序)。

我开始这个任务,认为我可以在隐藏工作表中使用简单的索引匹配代码,然后在用户表上报告重要的值。 这是我用来search第一列的代码,并从第二列中检索结果(注意引用不对应于上面的示例表):

=IF(ISERROR(INDEX('All Inclusive Tab'!D:F,SMALL(IF('All Inclusive Tab'!D:D=$A$2,ROW('All Inclusive Tab'!D:D)),ROW(1:1)),2)),"",INDEX('All Inclusive Tab'!D:F,SMALL(IF('All Inclusive Tab'!D:D=$A$2,ROW('All Inclusive Tab'!D:D)),ROW(1:1)),2))

我已经把这个代码input到多个单元格中。 工作表上的其他单元格包含相似的代码,然后search此代码报告的值。 等这种方法可以find多个匹配。 但是,由于我的Excel工作表的复杂性(特别是大量的订单项),我发现它是有限的。 一旦我开始创build多个“工作”单元,它也很慢。 我确定必须有更好的方法来做到这一点。

我被告知创build一个macros,并使用“for”或“while”循环。 我不是很熟悉VBA,我正在寻找任何build议。 什么search代码将是有用的这个应用程序,他们将如何parsing? 我也玩弄使用Microsoft Access这个项目的想法,并且想知道如果这会使事情变得更容易或更复杂。

编辑:这里是所需的输出的两个例子。 如果从下拉菜单中select“框2”,输出将如下所示:

 Equipment Contents Box 2 Box 5 Box 5 Tool 9 Box 2 Tool 4 Box 2 Tool 5 

如果从下拉列表中select“框3”,输出将如下所示:

 Equipment Contents Box 3 Box 6 Box 6 Tool 10 Box 3 Tool 6 Box 3 Tool 7 

对于这个例子,我把它设置成这样,

在这里输入图像说明

代码运行时,结果会是这样的。 在这里输入图像说明

这是代码。

 Sub Button1_Click() Dim rws As Long, rng As Range, c As Range, Frng As Range, Frws As Long Range("K:Z").ClearContents Application.ScreenUpdating = 0 Columns("A:A").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range("K1"), Unique:=True rws = Cells(Rows.Count, "K").End(xlUp).Row Set rng = Range("K3:K" & rws) For Each c In rng.Cells Columns("A:A").AutoFilter Field:=1, Criteria1:=c Frws = Cells(Rows.Count, "A").End(xlUp).Row Set Frng = Range("B3:B" & Frws).SpecialCells(xlCellTypeVisible) Frng.Copy c.Offset(0, 1).PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=True Next c ActiveSheet.AutoFilterMode = 0 Application.CutCopyMode = 0 End Sub