Sub YYY() Dim Isxod&, Bxod&, i& Isxod = Cells(Rows.Count, 9).End(xlUp).Row Bxod = Cells(Rows.Count, 1).End(xlUp).Row Set Isx = Range("I2:I" & Isxod) Set Bxo = Range("A2:A" & Bxod) For i = 2 To Bxod Fami = Range("A" & i).Value Set Isx = Range("I2:I" & Isxod).Find(Fami) If Not Isx Is Nothing Then IsxRow = Isx.Row Range(Cells(IsxRow, 10), Cells(IsxRow, 13)).Copy Range("B" & i).PasteSpecial
End If Next End Sub
[/vba]
[p.s.]критика приветствуется !!!!!!!
быстренько на коленке
[vba]
Код
Sub YYY() Dim Isxod&, Bxod&, i& Isxod = Cells(Rows.Count, 9).End(xlUp).Row Bxod = Cells(Rows.Count, 1).End(xlUp).Row Set Isx = Range("I2:I" & Isxod) Set Bxo = Range("A2:A" & Bxod) For i = 2 To Bxod Fami = Range("A" & i).Value Set Isx = Range("I2:I" & Isxod).Find(Fami) If Not Isx Is Nothing Then IsxRow = Isx.Row Range(Cells(IsxRow, 10), Cells(IsxRow, 13)).Copy Range("B" & i).PasteSpecial
Игорь, привет! Тебя можно поздравить? Или пока еще не совсем?
По поводу критики - ну ты сам напросился.
Пока общее 1. По личному опыту поиск Find-ом в цикле периодически тормозит и даже, бывает, что зависает наглухо. В особенности на довольно больших массивах. Личное дело каждого, но я им (Find-ом) поэтому практически не пользуюсь 2. Как тогда искать? Словарем, например 3. На более-менее крупных массивах постоянное обращение к ячейкам листа будет существенно тормозить
Конкретно по макросу, если логику его не менять
[vba]
Код
Sub tt() Dim Isxod&, Bxod&, i& Application.ScreenUpdating = 0 'поскольку у нас ниже вставка идет в цикле (есть несколько обращений к листу) Application.Calculation = xlCalculationManual ' то отключаем обновление экрана и автопересчет Isxod = Cells(Rows.Count, 9).End(xlUp).Row Bxod = Cells(Rows.Count, 1).End(xlUp).Row Set Isx = Range("I2:I" & Isxod) Set Bxo = Range("A2:A" & Bxod) For i = 1 To Bxod - 1 Fami = Bxo(i, 1).Value 'Range("A" & i).Value - если сделал массив, то им и пользуйся Set Isx1 = Isx.Find(Fami) ' если сделал массив, то им и пользуйся. Зачем переназначать массив Isx? 'вернее, если здесь переназначаешь, то зачем тогда назначал раньше? If Not Isx1 Is Nothing Then IsxRow = Isx1.Row Cells(IsxRow, 10).Resize(1, 3).Copy Range("B" & i + 1) ' Range("B" & i).PasteSpecial 'А если уж вставляешь второй строкой, то нужно снять выделение (можно уже после цикла) 'Application.CutCopyMode = 0 End If Next Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = 1 End Sub
[/vba]
А со словарем примерно вот так можно
[vba]
Код
Sub ee() Application.ScreenUpdating = 0 Application.Calculation = xlCalculationManual n0_ = Cells(Rows.Count, 1).End(xlUp).Row - 1 n1_ = Cells(Rows.Count, 9).End(xlUp).Row - 1 ar0 = Range("A2").Resize(n0_) ar1 = Range("I2").Resize(n1_) Set slov = CreateObject("Scripting.Dictionary") With slov For i = 1 To n1_ .Item(ar1(i, 1)) = i 'ФИО второго диапазона в словарь ключами, а порядковый номер записи - элементами Next i For j = 1 To n0_ If .Exists(ar0(j, 1)) Then hhh = .Item(ar0(j, 1)) Cells(.Item(ar1(j, 1)) + 1, 10).Resize(1, 4).Copy Cells(j + 1, 2).Resize(1, 4) End If Next j End With Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = 1 End Sub
[/vba]
Если нужно будет что-то уточнить - пиши
Игорь, привет! Тебя можно поздравить? Или пока еще не совсем?
По поводу критики - ну ты сам напросился.
Пока общее 1. По личному опыту поиск Find-ом в цикле периодически тормозит и даже, бывает, что зависает наглухо. В особенности на довольно больших массивах. Личное дело каждого, но я им (Find-ом) поэтому практически не пользуюсь 2. Как тогда искать? Словарем, например 3. На более-менее крупных массивах постоянное обращение к ячейкам листа будет существенно тормозить
Конкретно по макросу, если логику его не менять
[vba]
Код
Sub tt() Dim Isxod&, Bxod&, i& Application.ScreenUpdating = 0 'поскольку у нас ниже вставка идет в цикле (есть несколько обращений к листу) Application.Calculation = xlCalculationManual ' то отключаем обновление экрана и автопересчет Isxod = Cells(Rows.Count, 9).End(xlUp).Row Bxod = Cells(Rows.Count, 1).End(xlUp).Row Set Isx = Range("I2:I" & Isxod) Set Bxo = Range("A2:A" & Bxod) For i = 1 To Bxod - 1 Fami = Bxo(i, 1).Value 'Range("A" & i).Value - если сделал массив, то им и пользуйся Set Isx1 = Isx.Find(Fami) ' если сделал массив, то им и пользуйся. Зачем переназначать массив Isx? 'вернее, если здесь переназначаешь, то зачем тогда назначал раньше? If Not Isx1 Is Nothing Then IsxRow = Isx1.Row Cells(IsxRow, 10).Resize(1, 3).Copy Range("B" & i + 1) ' Range("B" & i).PasteSpecial 'А если уж вставляешь второй строкой, то нужно снять выделение (можно уже после цикла) 'Application.CutCopyMode = 0 End If Next Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = 1 End Sub
[/vba]
А со словарем примерно вот так можно
[vba]
Код
Sub ee() Application.ScreenUpdating = 0 Application.Calculation = xlCalculationManual n0_ = Cells(Rows.Count, 1).End(xlUp).Row - 1 n1_ = Cells(Rows.Count, 9).End(xlUp).Row - 1 ar0 = Range("A2").Resize(n0_) ar1 = Range("I2").Resize(n1_) Set slov = CreateObject("Scripting.Dictionary") With slov For i = 1 To n1_ .Item(ar1(i, 1)) = i 'ФИО второго диапазона в словарь ключами, а порядковый номер записи - элементами Next i For j = 1 To n0_ If .Exists(ar0(j, 1)) Then hhh = .Item(ar0(j, 1)) Cells(.Item(ar1(j, 1)) + 1, 10).Resize(1, 4).Copy Cells(j + 1, 2).Resize(1, 4) End If Next j End With Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = 1 End Sub
китин, понимаю, что наглость! Помогите пожалуйста сделать так, чтобы макрос подтягивал информацию со второго листа на первый со всеми примечаниями У меня получается только заруинить макрос ( В скрипт не могу ссылку поставить на др. лист
китин, понимаю, что наглость! Помогите пожалуйста сделать так, чтобы макрос подтягивал информацию со второго листа на первый со всеми примечаниями У меня получается только заруинить макрос ( В скрипт не могу ссылку поставить на др. листBill_Murray
китин, можно сделать так, чтобы на первый лист в столбец ФИО скопировать список имён, а макрос со второго листа полностью строчку перенёс? Через ВПР понятно, но не перенесутся примечания В долгу не останусь) Сразу с аванса)
китин, можно сделать так, чтобы на первый лист в столбец ФИО скопировать список имён, а макрос со второго листа полностью строчку перенёс? Через ВПР понятно, но не перенесутся примечания В долгу не останусь) Сразу с аванса)Bill_Murray