Вот некоторый код, который проходит через область в электронной таблице и выполняет код на основе условия, что исходные ячейки не содержат значение «(пустое» »). Код работает, но он очень неэффективен для запуска вложенных операторов if таким образом. Я попытался сделать его более эффективным в долгосрочной перспективе, но у меня нет идей.Рефакторинг вложенных операторов «If»
Любые предложения?
Sub NestedIfStatement()
Dim lastrow1 As Long
Dim I As Integer, J As Integer, N As Integer, MaxPriority as Integer
Dim Maxnumber as Range
Dim WS1 As Worksheet, WS3 as Worksheet
Dim WB As Workbook
Set WB = ThisWorkbook
Set WS1 = WB.Worksheets("Config")
Set WS2 = WB.Worksheets("Data")
Set WS3 = WB.Worksheets("Status Report")
lastrow1 = WS1.Cells(Rows.Count, 1).End(xlUp).Row
I = 1
J = 1
N = 3
Set Maxnumber = WS1.Range("A" & I & ":A" & lastrow1)
MaxPriority = Application.Max(Maxnumber)
For J = 1 To lastrow1
If WS1.Cells(J, 1) <= MaxPriority Then
If WS1.Cells(J, 6).Value <> "(blank)" Then
WS3.Cells(N, 7).Value = WS1.Cells(J, 6).Value
End If
If WS1.Cells(J, 5).Value <> "(blank)" Then
WS3.Cells(N, 6).Value = WS1.Cells(J, 5).Value
End If
If WS1.Cells(J, 4).Value <> "(blank)" Then
WS3.Cells(N, 4).Value = WS1.Cells(J, 4).Value
End If
If WS1.Cells(J, 3).Value <> "(blank)" Then
WS3.Cells(N, 3).Value = WS1.Cells(J, 3).Value
End If
If WS1.Cells(J, 2).Value <> "(blank)" Then
WS3.Cells(N, 2).Value = WS1.Cells(J, 2).Value
End If
N = N + 1
End If
Next J
End Sub
Просьба подробно остановиться на этом утверждении: «Код работает, но его очень неэффективно для запуска вложенных операторов if таким образом». – Dai
Для запуска кода требуется не более 4 секунд, а для получения очень небольшого количества данных (до 50 строк) требуется не более 1 секунды. Ожидается, что эта программа получит более 10000 строк, поэтому производительность неприемлема. Я бы предпочел иметь одно утверждение, которое заботится о всей партии, а не о 5 вложенных операциях if, thats вызов, с которым я сталкиваюсь. – PootyToot
Итак, вы говорите, что ваш код занимает 4 секунды, чтобы работать с вложенными циклами, но 1 секунду, когда вы используете Loop Unrolling (используя вложенные-ifs)? (https://en.wikipedia.org/wiki/Loop_unrolling) – Dai