Excel VBA адрес ПЕРВОГО ЭКЗЕМПЛЯРА вместо адреса каждого местоположения значения

#vba #excel #macros

#vba #excel #макросы

Вопрос:

У меня есть несколько номеров сотрудников, перечисленных на листе 1 рабочей книги. В рабочей книге есть несколько других листов (назовем эти листы A, B, C, D и т. Д.), Которые содержат номер сотрудника с некоторой информацией (возможно, отработанные даты). Если номер сотрудника найден, скажем, на листе A, его не будет ни на одном другом листе, но он может появляться несколько раз на листе A.

Я написал некоторый VBA, который будет искать во всех других рабочих листах номер сотрудника, указанный в листе 1, и возвращать местоположение ячейки, в которой находится этот номер сотрудника. Номера сотрудников перечислены в столбце A, начиная с A2, и в нем указано местоположение, где номер находится справа от номера сотрудника. Как Лист1 выглядит
лист «A»

Прямо сейчас, когда я запускаю свой макрос VBA, в нем будет указано местоположение всех ячеек, в которых находится этот номер сотрудника, но я хочу, чтобы он дал мне местоположение ячейки только ПЕРВОГО ЭКЗЕМПЛЯРА этого номера сотрудника. Затем перейдите к следующему номеру сотрудника, указанному в colmn A листа 1. Это VBA, который у меня есть до сих пор.

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

For Each cell In Sheets("Sheet1").Range("A2:A" amp; 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" amp; lastrow)

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

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

                End If
            Next cell2
        End If
    Next ws
Next cell

MsgBox "Done Finding!"

End Sub
  

Ответ №1:

Если вы говорите, что столбец A на листе 1 является строкой заголовка, а данные начинаются со строки 2, вам просто нужно отредактировать следующую строку:

dat = .Range(.Ячейки (1, 1), .Ячейки (2, 1).Конец (xlDown)).Значение

чтобы быть:

dat = .Range(.Ячейки (2, 1), .Ячейки (2, 1).Конец (xlDown)).Значение

Ответ №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" amp; rw
                        ' Option: show Sheet name and cell
                        '.Cells(i 1, 2) = ws.Name amp; "!A" amp; rw
                        Exit For
                    End If
                End If
            Next ws
        Next
    End With

    MsgBox "Done Finding!"
End Sub
  

Комментарии:

1. Спасибо за ваш быстрый ответ! Я действительно ценю вашу помощь, но это не совсем помогает. Когда я запускал ваш код, он искал только то, что находится в ячейке A: 1 листа 1. Мне это нужно для поиска каждого номера сотрудника, указанного в столбце A (начиная со строки 2) листа 1.

2. @user6896503 это то, что он делает. И мой код, и ваш основаны на определенном расположении данных в столбце A листа 1. Просто чтобы проверить этот макет, вы можете обновить свой Q некоторыми образцами данных из листа 1 и одного из других листов.

3. Я обновил его и добавил 2 картинки. Один показывает, как выглядит лист поиска, а другой показывает, как выглядят данные на других листах. Я работал с VBA несколько лет назад (с тех пор нет) и был только новичком, поэтому я в значительной степени переучиваю его для себя.

4. Хорошо, там нет ничего неожиданного, код должен работать. Хотя возможна пара небольших настроек

5. Изменен конец на конец и удалены подстановочные знаки