Страницы: 1
RSS
Ожидание завершения процедуры
 
Добры день! Пишу небольшую программку, которая открывает несколько файлов excel и копирует из них данные в один общий. Сама процедура копирования данных выведена в отдельную процедуру. Проблема в том, что Excel не ожидает её выполнения, и периодически выполняет следующую строчку (закрытие обрабатываемой книги). Вот общая схема работы программы:
Код
Sub myTrouble()

Sub myTrouble()

Dim sFileName 'Имя открываемого файла
Dim arrSFileNames 'Массив открываемых файлов
Dim wbX 'Обрабатываемая книга

'ниже должен быть кусок кода, который формирует массив имен файлов arrSFileNames
'....
    For Each sFileName In arrSFileNames
        If subOpen(sFileName) Then  'Пытается открыть книгу и ещё что-то делает. Возвращает True, если получилось.
            If subCheckFile(sFileName) Then 'Проверят файл на наличие нужных листов, и наличие ключевых полей.
                subCopyData sFileName 'Копирует данные с нужных листов. в основную книгу
            End If
            wbX.Close SaveChanges:=False 'Вот тут иногда происходит ошибка, когда subCopyData ещё не завершена, а
            'программа пытается закрыть книгу.
        End If
    Next sFileName
End Sub

Как мне правильно заставить макрос ждать завершения работы процедуры subCopyData?
Пока рабочий вариант делать из subCopyData функцию и ждать пока она не вернёт что-нибудь, ну или создавать глобальную переменную, которая будет меняться перед выходом из subCopyData.

Как-то так:
Код
Dim bDone As Boolean
Dim myTime

'прочий код до subCopyData sFileName

    bDone = False
    myTime = Now + TimeSerial(0, 0, 5)
    
    subCopyData sFileName
    
    Do While Not bDone And myTime >= Now
        DoEvents
    Loop
    
    wbX.Close SaveChanges:=False

Это правильный ход мысли или есть более изящное и универсальное решение (не очень хочется ковыряться в subCopyData и искать там все места, где происходит выход из процедуры)?

Или можно просто создать процедуру, которая будет закрывать нужную книгу и запустить её через application.onTime?
Код
Sub myClose(wbX As Workbook)
    wbX.Close False
End Sub

и закрывать книгу через
Код
Application.OnTime Now + TimeSerial(0, 0, 1), "'myClose " & wbX & "'"

Я просто не знаю, какие подводные камни могут всплыть, а всплывут они, конечно, не во время тестированния, а в процессе эксплуатации.
Изменено: Wiss - 28.09.2018 10:35:43
Я не волшебник, я только учусь.
 
Уберите DoEvents
 
Спасибо, уберу. Но это вообще нормальный подход? Как-то слишком наворочено для такого типового действия.
Я не волшебник, я только учусь.
 
Что наворочено? Без DoEvents?  Вы же наворотили :)
 
перед wbX.Close
напишите:
Код
If Application.CalculationVersion <> wbX.CalculationVersion Then Application.CalculateFull 
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Спасибо за советы. CalculationVersion себе сохранил на будущее.

Дело было не в бобине, а ошибка, как всегда, была в ДНК.
Я неверно определил суть проблемы и вместо описания симптомов (Out of memorry при закрытии книги) написал своё предположение о причине (ошибочное).

Спасло Application.CutCopyMode = False, которое я забыл поставить после копирования данных.
Я не волшебник, я только учусь.
Страницы: 1
Наверх