Страницы: 1
RSS
Формула считает значение с другого листа, потом преобразует формулу в значение, как ускорить работу макроса
 
Привет!
Пишу макрос, в котором формула с помощью ВПР по ID из первого файла находит значение во втором файле (базе), пишет его в первый файл и преобразовывает его в значение.
Макрос считает мои 80 500+ строк около 20 минут :( Если руками делать, т.е. вставить формулу в первую ячейку, клацнуть по черному кубику в правом углу, то весь столбец считается за 5 минут + макросом преобразовываю формулы в значения.
Подскажите, может я не так макрос пишу:
Код
Function FillColum2()
    Dim formula As String
    Dim counter As Long
    counter = 3
    Debug.Print ("Время начала " & Now)
    Range("K32:K80401").Select
    For Each cell In Selection
        formula = "=ВПР('[Файл_1.xlsb]ID'!A" & counter & ";'[Файл_2.xlsb]База'!$A$3:$AE$80500;13;ЛОЖЬ)"
        cell.FormulaLocal = formula
        cell.formula = cell.Value
        counter = counter + 1
    Next cell
    Debug.Print ("Время окончания " & Now)
End Function
Изменено: dimm - 14.11.2015 23:31:11
 
Используйте Scripting.Dictionary будет намного быстрее!
 
А если делать ещё и через массивы - будет секунды 2 работать. Если конечно затем результаты не участвуют в цепочке дальнейших пересчётов...
 
И зачем формулу вставлять макросом? Считайте нужное кодом и вставляйте значения
Код
Sub FillColum2()
    Dim counter As Long
    counter = 3
    For Each cell In Range("K32:K80401").Cells
        cell.Value = Application.WorksheetFunction.VLookup(Workbook("Файл_1.xlsb").Worksheets("ID").Range("A" & counter), Workbook("Файл_2.xlsb").Worksheets("База").Range("A3:A80500"), 13, False)
        counter = counter + 1
    Next cell
End Sub
писал "на коленке", проверьте
Согласие есть продукт при полном непротивлении сторон
 
Можно, и даже нужно, отключить обновление экрана.
Код
Application.ScreenUpdating = False 'после Dim
Application.ScreenUpdating = True 'перед end function
Изменено: Finswimmer - 05.11.2015 12:17:05
 
Всем большое спасибо! Особенно :
Цитата
Watcher_1 написал: Используйте Scripting.Dictionary будет намного быстрее!
Цитата
Finswimmer написал: Можно, и даже нужно, отключить обновление экрана.
80 500 строк теперь обрабатывается за 3 мин 20 сек, и думаю это не придел, если причесать код :)
 
dimm, если можно отсортировать базу по первому столбцу, то можно использовать ВПР с последним параметром ИСТИНА (интервальный просмотр). Так ВПР работает на порядок быстрее.
Страницы: 1
Наверх