#excel #vba #time #execution
Вопрос:
Я новичок в программировании и пытаюсь написать программу на Excel VBA, но столкнулся с проблемой со временем выполнения.
Я запускаю один и тот же Саб 20 раз для обработки 20 файлов одинаковых форматов, поэтому я ожидаю, что время выполнения будет одинаковым.
Хотя обычно для запуска файла требуется около 30 секунд, я обнаружил, что иногда для его запуска требуется более 1000 секунд. Я не думаю, что это проблема с каким-либо конкретным файлом, потому что аномальный файл каждый раз отличается.
Почему это так?
Часть кода, в которой есть эта проблема, является:
'Add a new sheet called rETR to contain the results for rETR = Y*17*0.5
'All cells between C2 and XR481 contain useful data
With ThisWorkbook
.Sheets.Add.Name = "rETR"
Set rETR = Sheets("rETR")
Set Y = Sheets("YII")
For Each Cell In Y.Range("C2:XR481")
myVal = Cell.value * 17 * 0.5
rETR.Cells(Cell.Row, Cell.Column).value = myVal
Next Cell
End With
'Create new sheet to contain "template" data, which area of interest is further reduced
Sheets.Add
'Reduce rETR data to the range in the template
'wbMPBtemp has previously been defined as a Workbook
Set wbMPBtemp = Workbooks.Open(sPath amp; "MPB_temp.xlsx")
'copy all the template data from that workbook into current workbook
wbMPBtemp.Sheets("MPB_temp").Copy Before:=ThisWorkbook.Sheets(1)
'rename the template sheet to "MPB_temp"
ActiveSheet.Name = "MPB_temp"
'close the original template workbook
wbMPBtemp.Close SaveChanges:=False
Set MPB_AOI = Sheets("MPB_temp")
'Reduce rETR to the AOI range based on the template
'Create a new sheet to contain the rETR data reduced to new AOI range
With ThisWorkbook
.Sheets.Add.Name = "MPB-only_rETR"
Set rETR_MPB = Sheets("MPB-only_rETR")
rETR.Activate
rETR.Range("C2:XR481").Select
For Each Cell In Selection
If Not MPB_AOI.Cells(Cell.Row, Cell.Column).value = "" Then
rETR_MPB.Cells(Cell.Row, Cell.Column).value = Cell.value
Else
rETR_MPB.Cells(Cell.Row, Cell.Column).value = ""
End If
Next Cell
End With
Я попытался сократить время выполнения следующими способами:
- Определение одной и той же группы переменных в одной строке
- Отключите несколько функций Excel (как показано ниже) в начале кода и включите их снова после выполнения кода.
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.DisplayStatusBar = False
ActiveSheet.DisplayPageBreaks =False
Есть ли какой-либо другой способ, которым я должен заняться, чтобы сократить время выполнения?
Комментарии:
1. Выключение экрана и расчет помогут. Вероятно, отключение обработки событий также поможет (с оговоркой, что, если у вас большие циклы, разумно периодически уступать ОС с событиями, если вы это сделаете). Отключение строки состояния и разрывов страниц не поможет. Все это в стороне, хотя, не видя вашего кода, трудно просто «догадаться» о том, что может быть причиной.