【问题标题】:Excel VBA address of FIRST INSTANCE instead of address of each location of valueFIRST INSTANCE 的 Excel VBA 地址,而不是值的每个位置的地址
【发布时间】:2016-10-06 23:50:57
【问题描述】:

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

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

现在,当我运行我的 VBA 宏时,它会列出找到该员工编号的所有单元格位置,但我想要它只给我该员工编号的第一个实例的单元格位置.然后,转到 Sheet1 的 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

【问题讨论】:

    标签: vba excel macros


    【解决方案1】:

    如果您说 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

    【讨论】:

      【解决方案2】:

      此方法将在第一次找到时停止(通过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 的单元格 A:1 中的内容。我需要它来搜索工作表 1 的 A 列(从第 2 行开始)中列出的每个员工编号。
      • @user6896503 这就是它正在做的事情。我的代码和你的代码都依赖于 Sheet1 的 A 列中的某些数据布局。只是为了验证布局,您可以使用 Sheet1 和其他一张表中的一些示例数据更新您的 Q。
      • 我更新了它并添加了 2 张图片。一个显示搜索表的样子,另一个显示其他工作表中的数据的样子。几年前我使用过 VBA(从那以后就没有了)并且只是一个初学者,所以我几乎是在自学。
      • 好的,没有什么意外的,代码应该可以工作。虽然可能需要几个小 tweek
      • 将 End Down 更改为 EndUp 并删除了通配符
      猜你喜欢
      • 1970-01-01
      • 2017-11-27
      • 2015-08-19
      • 2017-05-25
      • 1970-01-01
      • 1970-01-01
      • 2012-07-23
      • 1970-01-01
      • 2012-04-01
      相关资源
      最近更新 更多