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

Excel-搜索a列中的单词。在行中找到匹配项后,报告B列中的单词,然后在a列中搜索任何报告的单词,excel,ms-access,vba,Excel,Ms Access,Vba,我想知道如何搜索a列中的字符串,报告B列中找到的对应字符串,然后再次搜索a列中报告的字符串,等等。重复搜索,直到找不到更多匹配项 我正在尝试创建一个用户友好的工作表或宏输入框,用于搜索2300多行Excel工作表并生成报告。我希望用户能够选择要搜索的“字符串”(我将使用下拉菜单)。然后,工作表/程序将: 在A列中搜索与选定字符串的所有匹配项 报告在B列中找到的对应字符串(与匹配的行相同) 再次搜索列A以查找在列B中找到的所有报告字符串 重复步骤2)和3),直到找不到更多匹配项 目前,在a列和B列

我想知道如何搜索a列中的字符串,报告B列中找到的对应字符串,然后再次搜索a列中报告的字符串,等等。重复搜索,直到找不到更多匹配项

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

  • 在A列中搜索与选定字符串的所有匹配项
  • 报告在B列中找到的对应字符串(与匹配的行相同)
  • 再次搜索列A以查找在列B中找到的所有报告字符串
  • 重复步骤2)和3),直到找不到更多匹配项
  • 目前,在a列和B列上使用了一个简单的筛选器。用户首先选择要在a列中筛选的字符串。然后,他们必须手动确定B列中的任何结果是否存在于a列中,如果存在,将它们添加到A列的筛选条件中。在某些情况下,这可能需要此过程的多次迭代,并且可能非常耗时

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

    下面是我所看到的内容的简化版本(实际名称更复杂)

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

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

    =IF(iError(索引('All Inclusive Tab'!D:F),SMALL(IF('All Inclusive Tab'!D:D=$A$2,第行('All Inclusive Tab'!D:D)),第(1:1)),第(2)行),索引('All Inclusive Tab'!D:F),SMALL(如果('All Inclusive Tab'!D:D=$A$2,第(1:1)),第(2)行)
    

    我已经在一张单独的纸上的多个单元格中输入了这个代码。工作表上的其他单元格包含类似的代码,然后搜索该代码报告的值。此方法用于查找多个匹配项。然而,我发现它是有限的,因为我的Excel表格很复杂(特别是考虑到行项目的大量)。一旦我开始创建多个“工作”单元,它也会非常慢。我确信一定有更好的方法来做到这一点

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

    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”,则输出如下所示:

    Equipment   Contents
    Box 2       Box 5
    Box 5       Tool 9
    Box 2       Tool 4
    Box 2       Tool 5
    
    Equipment   Contents
    Box 3       Box 6
    Box 6       Tool 10
    Box 3       Tool 6
    Box 3       Tool 7
    
    如果从下拉列表中选择“框3”,则输出如下所示:

    Equipment   Contents
    Box 2       Box 5
    Box 5       Tool 9
    Box 2       Tool 4
    Box 2       Tool 5
    
    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
    

    对于这个例子,我是这样设置的

    当代码运行时,结果如下所示。

    这是代码

    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
    

    您可以创建一个递归函数,在a列中的单元格中循环。每次匹配时,它都将调用相同的函数来查找列表中包含的项。匹配的值将返回并可以追加到分隔字符串中。我已经加粗了一些术语来帮助您开始。访问将是不同的,我不会说更难。您可以使用SQL并将表连接到自身,然后使用VBA更新WHERE子句。您是否计划用户在生成列表后返回到给定项?上市多久会改变一次?您想如何向用户显示结果?谢谢DiegoAndresJAY。清单不应经常更改,但可能每6个月更改一次。我希望结果以表格格式显示(类似于excel)。我希望用户能够在a列中运行搜索。生成报告后,他们可以在同一列上运行单独的搜索。您可以创建一个递归函数,在a列中的单元格中循环。对于每个匹配项,它将调用相同的函数来查找列表中包含的项。匹配的值将返回并可以追加到分隔字符串中。我已经加粗了一些术语来帮助您开始。访问将是不同的,我不会说更难。您可以使用SQL并将表连接到自身,然后使用VBA更新WHERE子句。您是否计划用户在生成列表后返回到给定项?上市多久会改变一次?您想如何向用户显示结果?谢谢DiegoAndresJAY。清单不应经常更改,但可能每6个月更改一次。我希望结果以表格格式显示(类似于excel)。我希望用户能够通过a列运行搜索。然后在生成报告后,他们可以在同一列上运行单独的搜索。感谢您的帮助。结果并不是我想要的显示方式。我已经编辑了我的上述问题,并给出了两个我希望如何显示搜索结果的示例。我如何修改您的搜索以这种方式显示结果?谢谢您的帮助。这个