Добрый день, подскажите, знаю что может быть активна лишь одна книга в один момент, но вечные блики не нравятся, да и долго так, подскажите как реализовать работу вложенного цикла для другой книги.
Код
sub test()
Set prom = Workbooks.Open("C:\Users\Gumin-AA\Desktop\sever.xlsx")
Set svod = Workbooks.Open("C:\Users\Gumin-AA\Desktop\ugeas.xlsm")
Set reestr = svod.Sheets("jenk")
Set zakl = prom.Sheets("Лист1")
Set otkl = prom.Sheets("Лист3")
lLastRow = Cells(Rows.Count, 1).End(xlUp).Row
data_now = InputBox("Введите нужную дату (полностью, в формате dd-mm-yyyy)", "Введите дату", Date)
data_now = CDate(data_now)
For j = 2 To lLastRow&
zakl.Activate
If Cells(j, 5) = data_now Or Cells(i, 3) = DateAdd("d", -4, data_now) And Cells(j, 4) = "принята" Then
inn = Cells(j, 11)
summ_deal = Cells(j, 31)
reestr.Activate 'такой метод не устраивает
For l = 2 To lLastRow&
If Cells(l, 5) = inn And Cells(l, 12) = "все норм" Or Cells(l, 12) = "тоже норм" And Cells(l, 15) = "Да" Then
Cells(l, 12).Value = "Пшено есть"
Cells(l, 11).Value = data_now
Cells(l, 20).Value = summ_deal 'If Cells(l, 20).Value = "" Then
Exit For
End If
Next l
End If
Next j
End sub
Отключить обновление экрана, не забыв потом включить его. Не активировать лист/книгу, а использовать конструкцию With - End With, не забывая добавлять точку перед адресом ячейки.
Sub test()
Set prom = Workbooks.Open("C:\Users\Gumin-AA\Desktop\sever.xlsx")
Set svod = Workbooks.Open("C:\Users\Gumin-AA\Desktop\ugeas.xlsm")
Set reestr = svod.Sheets("jenk")
Set zakl = prom.Sheets("Лист1")
Set otkl = prom.Sheets("Лист3")
lLastRow = Cells(Rows.Count, 1).End(xlUp).Row
data_now = InputBox("Введите нужную дату (полностью, в формате dd-mm-yyyy)", "Введите дату", Date)
data_now = CDate(data_now)
For j = 2 To lLastRow&
'zakl.Activate
If zakl.Cells(j, 5) = data_now Or zakl.Cells(i, 3) = DateAdd("d", -4, data_now) And zakl.Cells(j, 4) = "принята" Then
inn = zakl.Cells(j, 11)
summ_deal = zakl.Cells(j, 31)
'reestr.Activate 'такой метод не устраивает
For l = 2 To lLastRow&
If reestr.Cells(l, 5) = inn And reestr.Cells(l, 12) = "все норм" Or reestr.Cells(l, 12) = "тоже норм" And reestr.Cells(l, 15) = "Да" Then
reestr.Cells(l, 12).Value = "Пшено есть"
reestr.Cells(l, 11).Value = data_now
reestr.Cells(l, 20).Value = summ_deal 'If Cells(l, 20).Value = "" Then
Exit For
End If
Next l
End If
Next j
End Sub
zakl.Activate
For j = 2 To lLastRow&
If Cells(j, 5) = data_now Or Cells(i, 3) = DateAdd("d", -4, data_now) And Cells(j, 4) = "принята" Then
inn = Cells(j, 11)
summ_deal = Cells(j, 31)
With reestr
For l = 2 To lLastRow&
If .Cells(l, 5) = inn And .Cells(l, 12) = "все норм" Or .Cells(l, 12) = "тоже норм" And .Cells(l, 15) = "Да" Then
.Cells(l, 12).Value = "Пшено есть"
.Cells(l, 11).Value = data_now
.Cells(l, 20).Value = summ_deal
...
Next
End With
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
1. Проверьте дату в начале, зачем открывать файлы, если кто-то вводит неправильную дату и генерирует ошибки выполнения кода ? 2. Вместо "Workbooks.Open" используйте "GetObject("C:\Users\Gumin-AA\Desktop\какой-то файль")" 3. Вы не активируете/не указываете необходимого листа для расчёта "lLastRow" в своём коде. У вас есть "lLastRow = Cells(Rows.Count, 1).End(xlUp).Row" С какого листа рассчитывается 'lLastRow': "Лист1" или "Лист2" или "Лист3", ... или там только один лист "jenk" ? Что если кто-то сохранит файл с выбранным неверным листом (если больше чем один) и после открытия не будет того, который нужен ?
ocet p, за совет с Getobject огромное спасибо! По поводу lLastrow, разве это важно? Я ведь это делаю или на активном листе или через блок with.
Код
zakl.Activate
For j = 2 To lLastRow&
If Cells(j, 5) = data_now Or Cells(i, 3) = DateAdd("d", -4, data_now) And Cells(j, 4) = "принята" Then
inn = Cells(j, 11)
summ_deal = Cells(j, 31)
With reestr
For l = 2 To lLastRow&
If .Cells(l, 5) = inn And .Cells(l, 12) = "все норм" Or .Cells(l, 12) = "тоже норм" And .Cells(l, 15) = "Да" Then
.Cells(l, 12).Value = "Пшено есть"
.Cells(l, 11).Value = data_now
.Cells(l, 20).Value = summ_deal
...
Next
End With
Вот как в примере? Разве нужно указывать необходимый лист? Вариант у lastrow мало, ведь zakl.activate и with reestr это и есть листы
Argo9 написал: Я ведь это делаю или на активном листе или через блок with
Но я имел в виду другую часть кода:
Код
1. Set prom = Workbooks.Open("C:\Users\Gumin-AA\Desktop\sever.xlsx")
2. Set svod = Workbooks.Open("C:\Users\Gumin-AA\Desktop\ugeas.xlsm")
3. Set reestr = svod.Sheets("jenk")
4. Set zakl = prom.Sheets("Лист1")
5. Set otkl = prom.Sheets("Лист3")
6. lLastRow = Cells(Rows.Count, 1).End(xlUp).Row
1. первая открытая книга => "sever.xlsx" 2. вторая открытая книга => "ugeas.xlsm" - она становится актуальной, активной
3. это важный момент => 'Sheets("jenk")'
(4, 5). здесь не важно
6. это важный момент => <<Cells(Rows.Count, 1) >> такая запись относится к активному листу в активной книге, а активной (по коду) есть "ugeas.xlsm"
Есть ли в этой книге только один лист: "jenk" ? Если нет, а листов больше, то какова уверенность, что этот лист будет активным после открытия книги а количество строк будет правильно рассчитано для правильного листа ?
Цитата
Hugo написал: GetObject() бывало косячил
Нормально, в vba всегда найдётся что-то, что будет "косячить" ...