使用在 Excel VBA 中查找的连续循环

Our*_*nas 3 excel vba replace excel-formula

我有以下代码,但我遇到了问题:

Sub getAccNos()

Dim oNameRange As Range
Dim oFindRng As Range

Dim sName As String
Dim sAccNo As String

Set oNameRange = Workbooks("New Name Work.xls").Worksheets("Manual").Range("B4")

Do While Not oNameRange.Text = ""
    sName = Trim(oNameRange.Text)
    Workbooks("New Name Work.xls").Worksheets("sheet1").Select
    Set oFindRng = Cells.Find(What:=sName, After:=activecell)

    Do While Not oFindRng Is Nothing
        oNameRange.Offset(0, -1).Value = oFindRng.Offset(0, 1).Text
        oFindRng.Offset(1, 0).Activate
        Set oFindRng = Cells.Find(What:=sName, After:=activecell)
    Loop
    Set oNameRange = oNameRange.Offset(1, 0)
Loop
End Sub
Run Code Online (Sandbox Code Playgroud)

基本上,在工作表sheet1 上,我有一个带有帐号的名称列表,并且可以有多个具有相同名称的帐号。在我的名为Manual 的目标表上,我有姓名 .... 但帐号丢失了,我想得到它们。

我无法使用 VLOOKUP,因为有几个名称相同,我需要获取所有帐号的列表。我怎样才能做到这一点?

我试图在 VBA 中使用 FIND 编写上面的代码,不幸的是,我错过了一些基本的东西,因为一旦在内部 Do Loop 它只是在它应该退出时连续循环(至于第一个只有一次发生)

谢谢你告诉我我做错了什么,或者一个公式会更好?

Sid*_*out 5

这是一个简单的代码,它不会遍历 Sheet1 单元格来查找匹配项。它使用.FIND.FINDNEXT。更多关于它在这里

将此代码放在一个模块中并简单地运行它。此代码基于您的示例文件。

Sub Sample()
    Dim wsI As Worksheet, wsO As Worksheet
    Dim lRow As Long, i As Long
    Dim sAcNo As String
    Dim aCell As Range, bCell As Range

    '~~> This is the sheet which has account numbers
    Set wsI = ThisWorkbook.Sheets("Sheet1")
    '~~> This is the sheet where we need to populate the account numbers
    Set wsO = ThisWorkbook.Sheets("Sheet2")

    With wsO
        lRow = .Range("B" & .Rows.Count).End(xlUp).Row

        .Range("A1:A" & lRow).NumberFormat = "@"

        For i = 2 To lRow
            Set aCell = wsI.Columns(2).Find(What:=.Range("B" & i).Value, _
                        LookIn:=xlValues, LookAt:=xlPart, _
                        SearchOrder:=xlByRows, SearchDirection:=xlNext, _
                        MatchCase:=False, SearchFormat:=False)

            If Not aCell Is Nothing Then
                Set bCell = aCell
                sAcNo = sAcNo & "," & aCell.Offset(, -1).Value

                Do
                    Set aCell = wsI.Columns(2).FindNext(After:=aCell)

                    If Not aCell Is Nothing Then
                        If aCell.Address = bCell.Address Then Exit Do
                        sAcNo = sAcNo & "," & aCell.Offset(, -1).Value
                    Else
                        Exit Do
                    End If
                Loop
            End If

            If sAcNo <> "" Then
                .Range("A" & i).Value = Mid(sAcNo, 2)
                sAcNo = ""
            End If
        Next i
    End With
End Sub
Run Code Online (Sandbox Code Playgroud)

截屏

在此处输入图片说明

在此处输入图片说明

希望这是你想要的吗?