Оптимизация кода VBA excel

#vba #excel

Вопрос:

Я не знаю, сможет ли кто-нибудь понять этот код..потому что я знаю, что он очень неаккуратный :/. Я новичок в VBA, поэтому знаю только об ограниченных функциях. Это инструмент линейного интерполятора, который я создал. Он интерполирует около 9000 строк и печатает данные в разных столбцах(каждый столбец соответствует таблице, представленной на отдельных листах). Я хочу знать, есть ли способ оптимизировать это code..so что он может работать быстрее ?

 Option Explicit
Dim x(1 To 9000) As Double, y(1 To 9000) As Double, z1(1 To 9000) As Double, z2(1 To 9000) As Double, V(1 To 9000) As Double, x1 As Double, y1 As Double, x2 As Double, y2 As Double, I1(1 To 9000) As Double, I2(1 To 9000) As Double, R1(1 To 9000) As Double, R2(1 To 9000) As Double, a As Double, b As Double, c As Double, d As Double, Result(1 To 9000) As Double

Dim i As Integer, j As Integer, k As Integer, p As Integer, q As Integer, r As Integer, s As Integer, t As Integer, hp As Integer
Dim ws As Sheets

Private Sub CommandButton1_Click()
Set ws = ThisWorkbook.Sheets(Array("Double Energy -FF", "EF8", "EF10", "EF12", "EF14", "EF16", "EF18"))

For hp = 2 To 7
For k = 1 To 9000

 With ws(1)
  V(k) = .Cells(k   2, 6).Value
 End With


 With ws(hp)

 If (V(k) <= 0.5) And (V(k) <> 0) Then
  x(k) = 0.5
  x1 = .Cells(2, 1).Value
  z1(k) = .Cells(k   2, 1).Value
 End If


For i = 1 To 6

    If (.Cells(2, i).Value <= V(k)) And (V(k) <= .Cells(2, i   1).Value) And Not (IsEmpty(V(k))) Then
    p = i
    x1 = .Cells(2, p).Value
    x2 = .Cells(2, p   1).Value
    x(k) = V(k)
    z1(k) = .Cells(k   2, p).Value
    z2(k) = .Cells(k   2, p   1).Value

    End If
    Next i


 If V(k) = Empty Then

  Result(k) = 0

 Else

 R1(k) = (z2(k) - z1(k)) / (x2 - x1)
 R2(k) = (x(k) - x1) * R1(k)
 Result(k) = R2(k)   z1(k)

 End If
 End With

 With ws(1)
  .Cells(k   2, hp   6).Value = Result(k)
 End With

 Next k
 Next hp
End Sub
 

Комментарии:

1. Такого рода вопросы на самом деле не входят в сферу переполнения стека, вам лучше перенести их в Обзор кода .

2. Просто не забудьте сначала проверить их справочный центр , чтобы убедиться, что ваш вопрос там по теме.

3. вы могли бы загружать все в массивы вместо прямой работы с ячейками. Вы можете отключить приложение.обновление экрана = false/true начало и конец макроса.

4. Чем меньше вы используете доступ к электронным таблицам, тем быстрее они будут выполняться. Загрузите входной диапазон в массив вариантов за одну операцию. А потом поработайте над этим. И вам нужно прочитать об оптимизации VBA в целом.

5. @Айкен, как я уже сказал, я new..so я не знал … буду иметь это в виду в будущем.

Ответ №1:

Например:

V(k) не зависит от h. Поэтому вы можете удалить его из цикла над h.

Поищите другие возможности для удаления вычислений из цикла h.