Я писал несколько макросов для выполнения некоторых астрологических расчетов (расчетный знак, лунный особняк, D9 & D60). Исходные данные в следующем формате:Оптимизация кода для минимизации времени выполнения макроса
LNG на изображении выше обозначает долготы, выраженных в градусах, минутах, второй формате. Выход должен быть в следующем формате:
Я взбитый до следующего кода, чтобы считывать данные из входного листа и формата & скопировать его в выходном лист затем делать расчеты с долготой каждая планета вычисляет необходимые поля.
Sub prepareOutput()
Application.ScreenUpdating = False
Dim c, count, d, l, ll
Dim r As Range
Set r = Worksheets("Ephemerides").Range("a4:" & Worksheets("Ephemerides").Range("a4").End(xlDown).Address)
Worksheets("output").Range("a3").Value = "Date"
For Each d In r
Worksheets("output").Cells(d.Row, 1).Value = d.Value
Next
For Each c In Worksheets("Ephemerides").Range("d2:o2")
If Not IsEmpty(c) Then
count = count + 5
'MsgBox count
If count = 5 Then
Worksheets("output").Cells(2, 2).Value = c.Value
Worksheets("output").Cells(3, 2).Value = "Longitude"
Worksheets("output").Cells(3, 3).Value = "Sign"
Worksheets("output").Cells(3, 4).Value = "Nakshatra"
Worksheets("output").Cells(3, 5).Value = "Navamsa"
Worksheets("output").Cells(3, 6).Value = "D60"
For Each l In Worksheets("Ephemerides").Range(c.Offset(2, 0), c.End(xlDown).Address)
Worksheets("output").Cells(l.Row, 2).Value = l.Value
Worksheets("output").Cells(l.Row, 3).Value = calcSign(l.Value)
Next
count = 2
Else
Worksheets("output").Cells(2, count).Value = c.Value
Worksheets("output").Cells(3, count).Value = "Longitude"
Worksheets("output").Cells(3, count + 1).Value = "Sign"
Worksheets("output").Cells(3, count + 2).Value = "Nakshatra"
Worksheets("output").Cells(3, count + 3).Value = "Navamsa"
Worksheets("output").Cells(3, count + 4).Value = "D60"
For Each ll In Worksheets("Ephemerides").Range(c.Offset(2, 0), c.End(xlDown).Address)
Worksheets("output").Cells(ll.Row, count).Value = ll.Value
Worksheets("output").Cells(ll.Row, count + 1).Value = calcSign(ll.Value)
Next
End If
End If
Next
Application.ScreenUpdating = True
End Sub
Private Function deg2dec(deg As String) As Variant
d = Val(Mid(deg, 1, InStr(deg, "°") - 1))
m = Val(Mid(deg, InStr(deg, "°") + 1, 2))/100
deg2dec = d + m
End Function
Private Function calcSign(deg As String) As String
dec = deg2dec(deg)
Select Case dec
Case 0 To 30
calcSign = "Aries"
Case 30 To 60
calcSign = "Taurus"
Case 60 To 90
calcSign = "Gemini"
Case 90 To 120
calcSign = "Cancer"
Case 120 To 150
calcSign = "Leo"
Case 150 To 180
calcSign = "Virgo"
Case 180 To 210
calcSign = "Libra"
Case 210 To 240
calcSign = "Scorpio"
Case 240 To 270
calcSign = "Saggitarius"
Case 270 To 300
calcSign = "Capricorn"
Case 300 To 330
calcSign = "Aquarius"
Case 330 To 360
calcSign = "Pisces"
End Select
End Function
Вышеупомянутый код не вычисляет все 4 вычисленных поля, только один пока.
Проблема, с которой я столкнулась, состоит в том, что у меня на моем входном листе 24000 строк и 12 столбцов, и требуется много времени, чтобы просто скопировать эти данные в выходной лист и затем выполнить вычисления на нем, чтобы вычислить еще одно значение . И я должен вычислить еще 3 поля из одного значения долготы.
Итак, если вы, ребята, можете взглянуть на код и сообщить мне, как я мог бы минимизировать время выполнения здесь, это очень помогло бы.
Вот ссылка на книгу, если кто-то хочет взглянуть. astro.xlsm
Заранее благодарим всех, кто забирает время для ответа.
Приветствия
хотя SO говорит, чтобы избежать благодарности и всех, хотел бы поблагодарить вас в любом случае за рабочий код. удалены следующие две строки, хотя, я думаю, являются избыточными. WsOut.Cells (l.Row, 2) .Value = l.Value WsOut.Cells (l.Row, 3) .Value = calcSign (l.Value) –
Нет проблем :) Вы правы - я забыл удалить эти линии. Я также удалил строки из кода, и он ускоряет скорость еще на одну секунду. –