#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.