Excel - 在A列中搜索单词。如果在行中找到匹配项,请报告B列中的单词,然后在A列中搜索任何报告的单词

时间:2015-08-11 15:51:31

标签: excel vba excel-vba ms-access access-vba

我想知道如何在A列中搜索字符串,报告在B列中找到的相应字符串,然后再次搜索A列以查找那些报告的字符串等。重复直至否找到更多匹配。

我正在尝试创建一个用户友好的工作表或宏输入框,它将搜索2300+行Excel工作表并生成报告。我希望用户能够选择将要搜索的“字符串”(我将使用下拉菜单执行此操作)。然后,工作表/程序将:

  1. 在列A中搜索所选字符串的所有匹配项;
  2. 报告在B列中找到的相应字符串(与匹配相同的行);
  3. 再次搜索A列,查找在B列中找到的所有报告的字符串;
  4. 重复步骤2)和3)直到找不到更多匹配项。
  5. 目前,在A列和B列上使用了一个简单的过滤器。用户首先在列A中选择他们希望过滤的字符串。然后,他们必须手动确定列A中的任何结果是否存在于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
    

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

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

    =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))

    我已将此代码输入到单独的工作表上的多个单元格中。工作表上的其他单元格包含类似的代码,然后搜索此代码报告的值。等等。此方法适用于查找多个匹配项。但是,由于Excel工作表的复杂性,我发现它很有限(特别是考虑到大量的订单项)。一旦我开始创建多个“工作”单元格,它也非常慢。我确信必须有更好的方法来做到这一点。

    我被告知创建一个宏并使用“for”或“while”循环。我对VBA不是很熟悉,我正在寻找任何建议。哪些搜索代码对此应用程序有用,以及如何解析它们?我也在尝试使用Microsoft Access执行此项目,并且想知道这是否会使事情变得更容易或更复杂。

    编辑:以下是所需输出的两个示例。如果"框2"从下拉列表中选择,输出看起来像这样:

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

    如果"框3"从下拉列表中选择,输出看起来像这样:

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

1 个答案:

答案 0 :(得分:0)

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

enter image description here

运行代码时,结果将如下所示。 enter image description here

这是代码。

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