excelvba的递归搜索

excelvba的递归搜索,vba,excel,Vba,Excel,我已经编写了一个excel VBA代码供用户输入id,excel数据表中的相应数据将显示为输出 Sub finddata() Dim North As Long Dim finalrow As Long Dim i As Long Dim count As Long Sheets("ML").Range("K5:P200").ClearContents North = Sheets("ML").Range("K2").Value final

我已经编写了一个excel VBA代码供用户输入id,excel数据表中的相应数据将显示为输出

Sub finddata()
    Dim North As Long
    Dim finalrow As Long
    Dim i As Long
    Dim count As Long
    Sheets("ML").Range("K5:P200").ClearContents
    North = Sheets("ML").Range("K2").Value
    finalrow = WorksheetFunction.CountA(Sheet1.Columns(1))
    For i = 2 To finalrow
        If Cells(i, 4) = North Then
            Range(Cells(i, 1), Cells(i, 6)).Copy
            Range("K100000").End(xlUp).Offset(1, 0).PasteSpecial xlPasteFormulasAndNumberFormats
        End If
    Next i
End Sub

现在我需要修改代码以递归方式搜索结果。例如,上述搜索的输出单元格id也以不同的Con编号出现在父单元格id字段中。我们也需要招募这些人。此循环应一直持续,直到显示完整的集合。如您在评论中所述,我们将非常感谢您的帮助。findnext;话虽如此,我还是试试这个:

Sub finddata()

Dim North As Long
Dim finalrow As Long
Dim i As Long
Dim count As Long

Sheets("ML").Range("K5:P200").ClearContents
North = Sheets("ML").Range("K2").Value
finalrow = WorksheetFunction.CountA(Sheet1.Columns(1))

With ActiveSheet.Range("A1:F" & finalrow)

    Set cellid = .Cells.Find(What:=North)

    If Not cellid Is Nothing Then

        Do Until cellid Is Nothing

            Range(Cells(cellid.Row, 1), Cells(cellid.Row, 6)).Copy
            Range("K100000").End(xlUp).Offset(1, 0).PasteSpecial xlPasteFormulasAndNumberFormats

            Set cellid = .FindNext(cellid)
        Loop

    End If

End With

End Sub

或者只使用高级过滤器:

sub findRecords()

    Range("K3:P200").ClearContents

    Range("A1:F" & Range("A" & Rows.Count).End(xlUp).Row).AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _
        "K1:K2"), CopyToRange:=Range("K5"), Unique:=False

End Sub
您甚至可以将其放在
onChange
事件的工作表代码模块中,并使其在每次在单元格K2中设置条件时自动运行,如下所示:

  • 右键单击图纸选项卡,然后单击查看代码
  • 粘贴以下代码:

    Private Sub Worksheet_Change(ByVal Target As Range)
    If Len(Target) >= 5 Then
        Application.EnableEvents = False
    Else
        Exit Sub
    End If
    
    Range("K3:P200").ClearContents
    
    Range("A1:F" & Range("A" & Rows.Count).End(xlUp).Row).AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _
            "K1:K2"), CopyToRange:=Range("K5"), Unique:=False
    
    Application.EnableEvents = True
    
    End Sub
    

  • 您可以使用公式和/或……来完成所有这些工作,请澄清您想要什么——最好是使用一些示例数据来显示第二部分的工作原理……看起来您应该研究一下。findnext。此外,这样您就不必遍历所有行,这会减慢速度。@newuser1:为什么要编辑以删除显示所需内容的图像?您可以使用高级过滤器在没有循环的情况下删除它-请参阅我的answer@IRENEG,谢谢你的回答。我试过上面的方法,可惜没有达到预期的效果。从父单元格ID中我们可以得到单元格ID“11011”,“11012”。但是这个单元格ID“11011”也可以出现在ParentCELLID列中。因此我们需要得到子单元格的结果。还有“96280”“可以是其他父母的孩子。通过这种方式,我们需要形成树hi@ourman In banana,感谢您的评论。从父单元格ID中我们可以得到单元格ID“11011”,“11012”。但是这个单元格ID“11011”也可以出现在ParentCELLID列中。因此我们需要得到子单元格的结果。还有“96280”“可以是其他父母的孩子。通过这种方式,我们需要形成tree@newuser1:为此,您可以使用K5-P5中的结果添加进一步的
    高级过滤器
    调用。。。因此,您只将结果唯一记录过滤到另一个位置,并且对于每个结果,调用Adv filter操作。。。