Страницы: 1
RSS
скорость пересчета одного листа в файле
 
Добрый вечер!
Всем приятных и спокойных выходных!!!
Вопрос к специалистам
использую формулу суммеслимн по критериям, формула в листе (лист "Слава" )
В данном случае по трем критериям листа "отгрузки"  "дата", "чей товар", "Отгр / Брак/возврат"  
пример прилагаю
удалил все лишние листы которые у меня есть
строк в листе "отгрузка" 60000  
в листе "Слава" 500
лист "Слава" используется не часто на нем стоит ( [Лист16].EnableCalculation = False)  при основной работе он не считается
при нажатии кнопки пересчитать он берет из листа " отгрузки" все данные и идет пересчет
это все занимает 1 минуту 50 секунд
сейчас конечно меньше так как нет данных...
Вопрос у меня такой
можно ли улучшить формулу что бы скорость пересчета уменьшилась?
или добавить какие нибудь функции в макрос что бы считалось быстрей?
может разделить по листам...
все принимается
 
 
вот как раз еще вопрос
может и к этой теме
если есть формула или макрос которым можно дополнить мой
чтобы считало до последней пустой строчки в листе "отгрузки"
тем самым уменьшить нагрузку на формулу
 
Макрос на словаре нужен.
Для его ускорения можно задавать область к которой нужно тянуть данные - примерно ведь будете знать какие даты актуальны.
Ещё для ускорени я бы писал месяцы не словами, а форматом даты - чтоб кодом не переводить одно в другое.
Но писать код сейчас некогда. Да и неинтересно...
 
Hugo,
если примерно , то сейчас занято 30000 за год
хотел как раз еще на год сделать что бы не лазить туда
не понимаю что называется не словами?
подскажите ..
может кто другой скажет коль Hugo занят
 
 Hugo,
я к тому что я в принципе не понимаю  что это  значит
"я бы писал месяцы не словами, а форматом даты - чтоб кодом не переводить одно в другое. "
можно это как то объяснить?
я то же считаю что здесь нагрузка ложится от даты достаточно большая  
 
Про месяц датой - когда они в одной таблице датой, а в другой словом - значит нужно тратить время чтоб привести одно к другому. Ну или если убрать объединение и там забить даты в каждую ячейку, а оставить видимой (чёрным шрифтом) например только среднюю - то тоже можно в макросе использовать.
Сколько всего строк на каждом листе? Важнее сколько в отгрузке.
 
Сделал на два месяца - в коде легко расширить диапазон, но там ещё и на листе нужно менять слова на даты, что лениво.
Работает по Вашей кнопке, проверяйте.
 
Hugo,
Добрый день!
строк в листе "отгрузка" 60000
в листе "Слава" 500
попробовал все работает, только в столбце " брак " кол-во должно быть с минусом !!!
вы не подскажите как изменить код что бы работал на всю таблицу?
С датами я справлюсь)))))
 
попробовал поставить себе в файл эту часть кода желтым выделяет
Код
t = Year(a(i, 1)) & "|" & Month(a(i, 1)) & "|" & a(i, 3) & "|" & a(i, 5)
 
Значит не справились с датами.
Чтоб работал на всю таблицу - заменить в коде в выражении
Код
.Range("g" & lr)
букву g на букву нужного столбца.
 
Hugo,
в листе "отгрузки" был пробел в строчке по этому  не работало
скорость то что надо
5 секунд
по сравнению почти 2 минуты

Большое Вам спасибо!
 
Можно ускорить - например проверять базу не всю, а только ту часть, где нужные данные, ну и выгружать только в ту часть, куда ещё ничего не подтянули.
Это несложно доработать в коде - например выделить шапку Слава в нужных столбцах, найти в базе ячейку с первой датой, от неё вниз забить данные в словарь, затем в выделенный диапазон выгрузить.
 
Вот так будет побыстрее - даже и даты/месяцы при таком подходе можно оставить как у Вас изначально были, особо на скорость не повлияет - но этот вариант работает с моим вариантом файла. Для исходного вида код нужно усложнять, лениво. Да и может уже не нужно.
Минусы не добавлял, это нужно ещё подумать...
Код
Option Explicit

Sub tt()
    Dim a(), b(), i&, ii&, t$, lr&, s$

    With CreateObject("scripting.dictionary"): .comparemode = 1
        a = Sheets("отгрузка").[a2].CurrentRegion.Columns(1).Resize(, 6).Value
        For i = 2 To UBound(a)
            t = Year(a(i, 1)) & "|" & Month(a(i, 1)) & "|" & a(i, 3) & "|" & a(i, 5)
            .Item(t) = .Item(t) + a(i, 6)
        Next

        With Sheets("Слава")
            lr = .Range("A" & .Rows.Count).End(xlUp).Row
            a = .Range(.[a3], .Range("A" & lr)).Value
            b = .Range(.[b3], .Range("g" & lr)).Value
        End With

        For ii = 1 To UBound(b, 2)
            s = Year(b(4, ii)) & "|" & Month(b(4, ii)) & "|" & b(1, ii) & "|"
            For i = 5 To UBound(a)
                b(i, ii) = .Item(s & a(i, 1))
            Next
        Next
    End With

    Sheets("Слава").[b3].Resize(UBound(b), UBound(b, 2)) = b
End Sub

 
С минусами можно так - но скорость обработки базы здорово упадёт:
Код
.Item(t) = .Item(t) + IIf(a(i, 3) = "брак", -a(i, 6), a(i, 6))
 
Hugo,
Спасибо Вам!
я второй вариант попробую но мне и первый самое то!
скорости хватает там даже не 5 секунд получается как я писал может 2 от силы...
Страницы: 1
Наверх