Поработав уже как пользователь с полученной своей базой, столкнулся с такой проблемой, что при количестве записей за 2000 строк, форма при загрузке начинает хорошо тормозить. В ходе разбирательства, выяснилось, что 95% нагрузки дает код, из 6 поста: [vba]
Код
Function НетЖурналЗС(Item As Variant) As Boolean i = 5 Do While Sheets("Журнал ЗС").Cells(i, 1).Value <> 0 If Item = Sheets("Журнал ЗС").Cells(i, 2).Value Then НетЖурналЗС = True: Exit Function i = i + 1 Loop End Function Private Sub UserForm_Initialize() i = 5 Do While Sheets("Журнал ИБ").Cells(i, 1) <> 0 akt2.AddItem Sheets("Журнал ИБ").Cells(i, 1) If Not НетЖурналЗС(Sheets("Журнал ИБ").Cells(i, 1).Value) Then cmbFilter.AddItem Sheets("Журнал ИБ").Cells(i, 1) End If i = i + 1 Loop End
[/vba] А можно ли придумать альтернативу данному коду исходя из условий первых четырех постов данной темы, чтобы нет так сильно тормозил?
Поработав уже как пользователь с полученной своей базой, столкнулся с такой проблемой, что при количестве записей за 2000 строк, форма при загрузке начинает хорошо тормозить. В ходе разбирательства, выяснилось, что 95% нагрузки дает код, из 6 поста: [vba]
Код
Function НетЖурналЗС(Item As Variant) As Boolean i = 5 Do While Sheets("Журнал ЗС").Cells(i, 1).Value <> 0 If Item = Sheets("Журнал ЗС").Cells(i, 2).Value Then НетЖурналЗС = True: Exit Function i = i + 1 Loop End Function Private Sub UserForm_Initialize() i = 5 Do While Sheets("Журнал ИБ").Cells(i, 1) <> 0 akt2.AddItem Sheets("Журнал ИБ").Cells(i, 1) If Not НетЖурналЗС(Sheets("Журнал ИБ").Cells(i, 1).Value) Then cmbFilter.AddItem Sheets("Журнал ИБ").Cells(i, 1) End If i = i + 1 Loop End
[/vba] А можно ли придумать альтернативу данному коду исходя из условий первых четырех постов данной темы, чтобы нет так сильно тормозил?Паштет
Правильно. Для каждой ячейки ИБ мы пробегаем по каждой ячейке ЗС. Именно по ячейке, а не суем их, например, в массив, а потом бежим. Конечно долго получается. Как вариант - создать словарь по ЗС, засунуть в массив данные по ИБ, пробежаться по этому массиву с проверкой нахождения в словаре. Конкретно код написать хотел по-быстрому, но запутался у Вас в файле - уж очень много там всего. Был бы файлик попроще - помочь было бы полегче
Правильно. Для каждой ячейки ИБ мы пробегаем по каждой ячейке ЗС. Именно по ячейке, а не суем их, например, в массив, а потом бежим. Конечно долго получается. Как вариант - создать словарь по ЗС, засунуть в массив данные по ИБ, пробежаться по этому массиву с проверкой нахождения в словаре. Конкретно код написать хотел по-быстрому, но запутался у Вас в файле - уж очень много там всего. Был бы файлик попроще - помочь было бы полегче_Boroda_
Private Sub UserForm_Initialize() With Sheets("Журнал ЗС") nz_ = .Cells(.Rows.Count, 1).End(xlUp).Row - 4 arz = .Cells(5, 1).Resize(nz_) End With Set slov = CreateObject("Scripting.Dictionary") With slov For i = 1 To nz_ aaa = .Item(arz(i, 1)) Next i With Sheets("Журнал ИБ") ni_ = .Cells(.Rows.Count, 1).End(xlUp).Row - 4 ari = .Cells(5, 1).Resize(ni_) End With For i = 1 To ni_ If Not .exists(ari(i, 1)) Then cmbFilter.AddItem ari(i, 1) End If Next i End With End Sub
[/vba]
А почто Вы в макросе "Кнопка2_Щелчок" все отключаете, а потом взад не включаете? Нехорошо
Во, другое дело! Так? [vba]
Код
Private Sub UserForm_Initialize() With Sheets("Журнал ЗС") nz_ = .Cells(.Rows.Count, 1).End(xlUp).Row - 4 arz = .Cells(5, 1).Resize(nz_) End With Set slov = CreateObject("Scripting.Dictionary") With slov For i = 1 To nz_ aaa = .Item(arz(i, 1)) Next i With Sheets("Журнал ИБ") ni_ = .Cells(.Rows.Count, 1).End(xlUp).Row - 4 ari = .Cells(5, 1).Resize(ni_) End With For i = 1 To ni_ If Not .exists(ari(i, 1)) Then cmbFilter.AddItem ari(i, 1) End If Next i End With End Sub
[/vba]
А почто Вы в макросе "Кнопка2_Щелчок" все отключаете, а потом взад не включаете? Нехорошо_Boroda_
Так включалка - это не лишнее. Вот кто-то, чтобы попытаться помочь Вам, запустил Ваш макрос, а потом ему (*если заметит) нужно еще писать свой макрос для включения кучи всякой байды, которую, кстати, вовсе не обязательно было и отключать (по крайней мере всю кучу)
Так включалка - это не лишнее. Вот кто-то, чтобы попытаться помочь Вам, запустил Ваш макрос, а потом ему (*если заметит) нужно еще писать свой макрос для включения кучи всякой байды, которую, кстати, вовсе не обязательно было и отключать (по крайней мере всю кучу)_Boroda_
Это Combobox у наименования "номер акта по ИБ", его закрывает cmbFilter. В приложенном файле раздвинул их, чтобы было видно. Хотя необходимость двух Combobox нужна ли?
Так включалка - это не лишнее. Вот кто-то, чтобы попытаться помочь Вам, запустил Ваш макрос, а потом ему (*если заметит) нужно еще писать свой макрос для включения кучи всякой байды, которую, кстати, вовсе не обязательно было и отключать (по крайней мере всю кучу)
Это Combobox у наименования "номер акта по ИБ", его закрывает cmbFilter. В приложенном файле раздвинул их, чтобы было видно. Хотя необходимость двух Combobox нужна ли?
Так включалка - это не лишнее. Вот кто-то, чтобы попытаться помочь Вам, запустил Ваш макрос, а потом ему (*если заметит) нужно еще писать свой макрос для включения кучи всякой байды, которую, кстати, вовсе не обязательно было и отключать (по крайней мере всю кучу)
_Boroda_, рано я радовался. Ерунда вышла. Сейчас получается так, что определяется количество актов не попавших в ЗС и это число становится количеством строк в выпадающем списке. Но в списке номера идут подряд, без учета есть ли они в ЗС или нет.
Подтягивание данных под номер акта сумел сам добавить, как советовали ранее.
_Boroda_, рано я радовался. Ерунда вышла. Сейчас получается так, что определяется количество актов не попавших в ЗС и это число становится количеством строк в выпадающем списке. Но в списке номера идут подряд, без учета есть ли они в ЗС или нет.
Подтягивание данных под номер акта сумел сам добавить, как советовали ранее.Паштет
В прилагаемом файле будет более наглядно: На листе Журнал ЗС, во втором столбце указаны номера из журнала ИБ, сначала они заполнялись по порядку, но потом были пропущены акты 1308, 1309 и 1311. Они и должны попасть в список combobox акт2/cmbfilter, но по факту туда прописываются номера 1309, 1310 и 1311.
В прилагаемом файле будет более наглядно: На листе Журнал ЗС, во втором столбце указаны номера из журнала ИБ, сначала они заполнялись по порядку, но потом были пропущены акты 1308, 1309 и 1311. Они и должны попасть в список combobox акт2/cmbfilter, но по факту туда прописываются номера 1309, 1310 и 1311.Паштет
Решил добавить еще одно условие, на исключение позиций, которые не полностью заполнены в Журнале ИБ, в этот код: [vba]
Код
With Sheets("Журнал ЗС") nz_ = .Cells(.Rows.Count, 2).End(xlUp).Row - 4 arz = .Cells(5, 2).Resize(nz_) End With Set slov = CreateObject("Scripting.Dictionary") With slov For i = 1 To nz_ aaa = .Item(arz(i, 1)) Next i With Sheets("Журнал ИБ") ni_ = .Cells(.Rows.Count, 1).End(xlUp).Row - 4 ari = .Cells(5, 1).Resize(ni_) End With For i = 1 To ni_ If Not .exists(ari(i, 1)) Then akt2.AddItem ari(i, 1) End If Next i End With
[/vba]. Казалось, что в таком варианте будет работать, но улетел в бесконечность: [vba]
Код
For i = 1 To ni_ If Not .exists(ari(i, 1)) Then Do While Sheets("Журнал ИБ").Cells(i, 1) <> 0 If Sheets("Журнал ИБ").Cells(i, 16) = "" Then akt2.AddItem ari(i, 1) End If Loop End if Next i End With
[/vba] Что не так?
Решил добавить еще одно условие, на исключение позиций, которые не полностью заполнены в Журнале ИБ, в этот код: [vba]
Код
With Sheets("Журнал ЗС") nz_ = .Cells(.Rows.Count, 2).End(xlUp).Row - 4 arz = .Cells(5, 2).Resize(nz_) End With Set slov = CreateObject("Scripting.Dictionary") With slov For i = 1 To nz_ aaa = .Item(arz(i, 1)) Next i With Sheets("Журнал ИБ") ni_ = .Cells(.Rows.Count, 1).End(xlUp).Row - 4 ari = .Cells(5, 1).Resize(ni_) End With For i = 1 To ni_ If Not .exists(ari(i, 1)) Then akt2.AddItem ari(i, 1) End If Next i End With
[/vba]. Казалось, что в таком варианте будет работать, но улетел в бесконечность: [vba]
Код
For i = 1 To ni_ If Not .exists(ari(i, 1)) Then Do While Sheets("Журнал ИБ").Cells(i, 1) <> 0 If Sheets("Журнал ИБ").Cells(i, 16) = "" Then akt2.AddItem ari(i, 1) End If Loop End if Next i End With
Нет файла с непоправленным макросом и словесного описания хотелок Более того, Sheets("Журнал ИБ").Cells(i, 1) - это ari(i, 1), зачем Вы засунули его в Do-Loop? И что в 16-м столбце должно равняться пусто? Дата выдачи? Короче, я смысла не понял, но исходя из Вашего кода, нужно написать вот так [vba]
Код
With Sheets("Æóðíàë ÈÁ") ni_ = .Cells(.Rows.Count, 1).End(xlUp).Row - 4 ari = .Cells(5, 1).Resize(ni_) ar2i = .Cells(5, 16).Resize(ni_) End With For i = 1 To ni_ If Not .exists(ari(i, 1)) Then If ar2i(i, 1) = "" Then akt2.AddItem ari(i, 1) End If End If Next i
[/vba] * И не нужно работать с ячейками на листе, засуньте данные в массив и дальше работайте уже с ним
Нет файла с непоправленным макросом и словесного описания хотелок Более того, Sheets("Журнал ИБ").Cells(i, 1) - это ari(i, 1), зачем Вы засунули его в Do-Loop? И что в 16-м столбце должно равняться пусто? Дата выдачи? Короче, я смысла не понял, но исходя из Вашего кода, нужно написать вот так [vba]
Код
With Sheets("Æóðíàë ÈÁ") ni_ = .Cells(.Rows.Count, 1).End(xlUp).Row - 4 ari = .Cells(5, 1).Resize(ni_) ar2i = .Cells(5, 16).Resize(ni_) End With For i = 1 To ni_ If Not .exists(ari(i, 1)) Then If ar2i(i, 1) = "" Then akt2.AddItem ari(i, 1) End If End If Next i
[/vba] * И не нужно работать с ячейками на листе, засуньте данные в массив и дальше работайте уже с ним_Boroda_