Приветствую. Что хочется. Есть 2 листа. ФИО и дата рождения с листа 1 ищутся на листе 2. Если таковые есть, то данные столбцов J,P,L листа 2 добавляются в столбцы FGH листа 1. На текущий момент данные столбцов J,P,L листа 2 добавляются в столбец F листа 2. Никак не могу разбить найденное по столбцам, помогите плиз. Словарь используется для ускорения работы, т.к. на каждом листе под полмиллиона строк.
Код
Sub Search()
Dim a(), b(), t$, ii&, s$, i&, x&, ss$, d&, z&, Dict As Object, tt As Object
Dim w As Workbook, v As Worksheet ', vm As Worksheet
d = timeGetTime
Set vm = Sheets("1")
vm.Columns("F").ClearContents
For Each w In Application.Workbooks
If w.Name = "test.xlsm" Then
With w.Sheets("2")
ii = .Cells(.Rows.Count, 1).End(xlUp).Row
a = Range(.Cells(2, "F"), .Cells(ii, "S"))
End With
Exit For
End If
Next
With CreateObject("Scripting.Dictionary")
For i = 2 To UBound(a)
.Item(a(i, 1) & " " & a(i, 3)) = a(i, 5) & "|" & a(i, 11) & "|" & a(i, 7)
Next
vm.Activate
ii = Cells(Rows.Count, 2).End(xlUp).Row
a = Range("B2:C" & ii).Value
b = Range("F2:F" & ii).Value
For x = 2 To ii - 1
t = a(x, 1) & " " & a(x, 2)
If .Exists(t) Then
b(x, 1) = .Item(t)
End If
z = z + 1
Next x
End With
Range("F2:F" & ii).Value = b
End Sub
Option Explicit
Option Private Module
'===========================================================================================
Sub Search()
Dim dic As New Dictionary
Dim shInsert As Worksheet, shFind As Worksheet
Dim aFrom, aInsert, tx$, t!, r&, p&, n&
Const colBD& = 3, colDate& = 5, colPlace& = 7, colStat& = 11
t = Timer
Set shInsert = Worksheets("1"): Set shFind = Worksheets("2")
aFrom = shFind.Range("F3:P7").Value ' get Array
For r = 1 To UBound(aFrom, 1)
dic.Add aFrom(r, 1) & aFrom(r, colBD), r ' fill dic
Next r
aInsert = shInsert.Range("B2:C10").Value
ReDim Preserve aInsert(1 To UBound(aInsert, 1), 1 To 3) ' new cols: Date, Stat, Place
For r = 1 To UBound(aInsert, 1)
tx = aInsert(r, 1) & aInsert(r, 2)
If dic.Exists(tx) Then
p = dic(tx): n = n + 1
aInsert(r, 1) = aFrom(p, colDate): aInsert(r, 2) = aFrom(p, colStat): aInsert(r, 3) = aFrom(p, colPlace)
Else
aInsert(r, 1) = Empty: aInsert(r, 2) = Empty
End If
Next r
If n = 0 Then MsgBox "Can't find…", vbExclamation, Format$(Timer - t, "0.00 sec"): Exit Sub
shInsert.Range("F2").Resize(UBound(aInsert, 1), UBound(aInsert, 2)).Value = aInsert
MsgBox "Find Rows: " & Format$(n, "#,##0"), vbInformation, Format$(Timer - t, "0.00 sec")
End Sub
'===========================================================================================
Обратите внимание, что не все даты на листе "откуда брать" настоящие В файле подключена (раннее связывание) штатная библиотека Scripting Runtime (для словарей)
Тэги для поиска: готовое решение, словари, ВПР, найти соответствие
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄