Добры день! Пишу небольшую программку, которая открывает несколько файлов 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
Спасибо за советы. CalculationVersion себе сохранил на будущее.
Дело было не в бобине, а ошибка, как всегда, была в ДНК. Я неверно определил суть проблемы и вместо описания симптомов (Out of memorry при закрытии книги) написал своё предположение о причине (ошибочное).
Спасло Application.CutCopyMode = False, которое я забыл поставить после копирования данных.