Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Вложенный цикл для другой книги
 
Добрый день, подскажите, знаю что может быть активна лишь одна книга в один момент, но вечные блики не нравятся, да и долго так, подскажите как реализовать работу вложенного цикла для другой книги.


Код
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
Изменено: Argo9 - 19 Ноя 2019 14:39:11
 
Отключить обновление экрана, не забыв потом включить его.
Не активировать лист/книгу, а использовать конструкцию 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
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
я благодарен всем за помощь!
 
Цитата
Argo9 написал:
подскажите как реализовать работу
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 - 19 Ноя 2019 17:45:31
 
GetObject() бывало косячил, приходилось Workbooks.Open применять.
 
Цитата
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 всегда найдётся что-то, что будет "косячить" ... :)

Изменено: ocet p - 22 Ноя 2019 04:39:17
 
Я тоже сталкивался с проблемой при использовании GetObject
Страницы: 1
Читают тему (гостей: 1)
Наверх