Excel VBA: Цикл расчетов в таблице

Автор Raven2009, 29 мая 2016, 09:46

Raven2009

Всем привет! Имеется файл, где во второй таблице (правее) производятся расчеты с делением (в колонках AE, AH, AK, AN и далее) через формулы. Т.к. данные все время подгружаются в файл, формулы прописаны примерно на 500 строк вниз, из-за этого естественно периодически файл подвисает и вылетает.

Есть ли возможность сделать цикл расчетов вместо многочисленных формул с таким же результатом? Если непонятно, что на что делится, могу объяснить. Мне хотя бы на примере одной-двух колонок понять. Извиняюсь, макросы постигаю пока.

[вложение удалено администратором]

Администратор

Макрос
Sub Макрос1()

    Dim arrLeft(), rngRight As Range, var, arrRes()
    Dim lr As Long, r As Long, c_left As Long, c_right As Long
   
   
    '1. Отключение монитора.
    Application.ScreenUpdating = False
   
    '2. Поиск последней строки по столбцу "AB".
    lr = Columns("AB").Find(What:="*", LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, _
        SearchDirection:=xlPrevious, MatchCase:=False, SearchFormat:=False).Row
       
    '3. Копирование данных из левой таблицы в vba-массив (для ускорения макроса).
    arrLeft() = Range("G11:U" & lr).Value
   
    '4. Vba-именование фрагмента, в котором находятся данные правой таблицы.
    Set rngRight = Range("AC11:AZ" & lr)
   
    '5. Создание ячеек в массиве-результате.
    ReDim arrRes(1 To rngRight.Rows.Count, 1 To 1)
   
    '6. Переход к первому столбцу левой таблицы.
    c_left = 1
   
    '7. Включение перехватчика ошибок, если в таблицах будут не числа или
        ' в правой таблице будет пусто (в этом случае будет деление на ноль).
    On Error Resume Next
   
    '8.
    ' Цикл по столбцам правой таблицы.
    For c_right = 1 To rngRight.Columns.Count Step 3
   
        '1) Копирование данных из ячейки из строки 8 (для ускорения работы макроса).
        var = rngRight.Columns(c_right).Cells(1, 1).Offset(-3).Value
       
        '2)
        ' Цикл по строкам левой и правой таблицы.
        For r = 1 To UBound(arrRes, 1) Step 1
            ' Расчёт и запись расчёта в массив-результат.
            arrRes(r, 1) = arrLeft(r, c_left) / var / 60
            ' Если произошла ошибка.
            If Err.Number <> 0 Then
                arrRes(r, 1) = "ОШИБКА!"
                Err.Number = 0
            Else
                ' Ноль не нужно вставлять в эксель.
                If arrRes(r, 1) = 0 Then
                    arrRes(r, 1) = Empty
                End If
            End If
        Next r
       
        '3) Запись результата в правую таблицу в соответствующий столбец.
        rngRight.Columns(c_right + 2).Value = arrRes()
       
        '4) Переход к следующему столбцу в левой таблице.
        c_left = c_left + 2
       
    Next c_right
   
    '9. Отключение перехватчика ошибок.
    On Error GoTo 0
   
    '10. Включение монитора.
    Application.ScreenUpdating = True
   
End Sub
[свернуть]

Raven2009

Все работает! Спасибо вам огромное!