Почему запуск моей субмарины занимает разное количество времени?

#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. Выключение экрана и расчет помогут. Вероятно, отключение обработки событий также поможет (с оговоркой, что, если у вас большие циклы, разумно периодически уступать ОС с событиями, если вы это сделаете). Отключение строки состояния и разрывов страниц не поможет. Все это в стороне, хотя, не видя вашего кода, трудно просто «догадаться» о том, что может быть причиной.

2. Без кода вам очень трудно помочь