Excel第一个实例的VBA地址,而不是每个值的位置的地址

时间:2016-10-06 23:50:58

标签: excel vba excel-vba macros

我在工作簿的Sheet1中列出了一些员工编号。在工作簿中还有一些其他工作表(让我们称这些工作表A,B,C,D等),其中包含具有一些信息的员工编号(可能是工作日期)。如果在工作表A中找到了员工编号,它将不在任何其他工作表中,但它可能会在工作表A中多次出现。

我写了一些VBA,它将查看Sheet1中列出的员工编号的所有其他工作表,并返回找到该员工编号的位置的单元格位置。员工编号列在A列中,从A2开始,它列出了员工编号右侧找到编号的位置。 How Sheet1 looks Sheet "A"

现在,当我运行我的VBA宏时,它会列出找到该员工编号的所有单元格位置,但我想要它做的是给我这个员工编号的第一个实例的单元格位置。然后,转到Sheet1的colmn A中列出的下一个员工编号。这是我到目前为止的VBA。

Sub makeMySearch()
Dim ws As Worksheet, lastrow As Long

For Each cell In Sheets("Sheet1").Range("A2:A" & Sheets("Sheet1").Range("A1").End(xlDown).Row)
    recFound = 0

    For Each ws In ThisWorkbook.Worksheets
        If ws.Name <> "Sheet1" Then
            lastrow = Sheets(ws.Name).Range("A1").End(xlDown).Row
            For Each cell2 In Sheets(ws.Name).Range("A1:A" & lastrow)

                If InStr(cell2.Value, cell.Value) <> 0 Then

                    recFound = recFound + 1
                    cell.Offset(0, recFound) = Split(cell2.Address, "$")(1) & Split(cell2.Address, "$")(2)

                End If
            Next cell2
        End If
    Next ws
Next cell

MsgBox "Done Finding!"

End Sub

2 个答案:

答案 0 :(得分:0)

此方法将在第一次查找时停止(通过Exit For

它还显示了一种更有效的方法,而不是循环每张纸上的所有单元格

Sub makeMySearch()
    Dim cell  As Range, cell2 As Range
    Dim ws As Worksheet, lastrow As Long, recFound As Long
    Dim rw As Variant
    Dim dat As Variant, i As Long

    With Worksheets("Sheet1")
        dat = .Range(.Cells(2,1), .Cells(.Rows.Count,1).End(xlUp)).Value
        For i = 1 To UBound(dat, 1)
            For Each ws In ThisWorkbook.Worksheets
                If ws.Name <> "Sheet1" Then
                    rw = Application.Match( dat(i, 1) , ws.Columns(1), 0)
                    If Not IsError(rw) Then
                        .Cells(i+1, 2) = "A" & rw
                        ' Option: show Sheet name and cell
                        '.Cells(i+1, 2) = ws.Name & "!A" & rw
                        Exit For
                    End If
                End If
            Next ws
        Next
    End With

    MsgBox "Done Finding!"
End Sub

答案 1 :(得分:0)

如果您说Sheet1上的A列是标题行而数据从第2行开始,您只需要编辑以下行:

dat = .Range(.Cells(1,1),。Cells(2,1).End(xlDown))。Value

是:

dat = .Range(.Cells(2,1),。Cells(2,1).End(xlDown))。Value