#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. Изменен конец на конец и удалены подстановочные знаки