Доброй ночи. Подскажите, пожалуйста, как реализовать в коде поочерёдное открытие одноименных файлов и выполнить в них один и тот же код. Подпапки с порядковыми номерами от 1 до 5; в каждой из них содержатся файлы .xlsb; в которых имеется такой код:
Но вот беда, после первого успешного прохода макрос останавливается. Как исправить? Спасибо.
Доброй ночи. Подскажите, пожалуйста, как реализовать в коде поочерёдное открытие одноименных файлов и выполнить в них один и тот же код. Подпапки с порядковыми номерами от 1 до 5; в каждой из них содержатся файлы .xlsb; в которых имеется такой код:
И я буду очень признателен, если поясните, как можно возобновить процедуру. К примеру, после выполнения 2 проходов документ "Сбор" будет успешно сохранён в подпапках 1 и 2, а затем через Диспетчер задач процесс "Excel" был завершён принудительно. Как запустить оставшиеся 3 переноса данных. Спасибо.
И я буду очень признателен, если поясните, как можно возобновить процедуру. К примеру, после выполнения 2 проходов документ "Сбор" будет успешно сохранён в подпапках 1 и 2, а затем через Диспетчер задач процесс "Excel" был завершён принудительно. Как запустить оставшиеся 3 переноса данных. Спасибо.Сергей-К
Сообщение отредактировал Сергей-К - Суббота, 21.03.2015, 01:59
в файлах "Сбор.xlsb" последняя строка макроса: [vba]
Код
ActiveWorkbook.Close
[/vba] закрывает сам файл "Сбор.xlsb", поэтому макрос не успевает отработать до конца и управление не передается обратно в цикл, т.ч. файлы "Сбор.xlsb" нужно закрывать непосредственно из цикла. а вообще, так писать (привязываясь к активному окну) - очень плохая практика! (мало ли кто и куда мышкой кликнет во время работы твоих макросов и кто знает какое окно после этого клика станет активным?...) т.ч. лучше работать с объектными переменными.
например, вот так: [vba]
Код
Sub Макрос1()
'Перед запуском выделить жёлтую ячейку!!!
окончание = [B4] For счетчик = 1 To окончание
ActiveCell.Value = счетчик
adr = Cells(1, 1) Set objWrkBook = Workbooks.Open(adr & "\Сбор.xlsb")
Application.Run _ "Сбор.xlsb!Макрос1"
objWrkBook.Close True ' закрываем Сбор.xlsb (с сохранением)
ActiveCell.Offset(1, 0).Select
Next счетчик
' освобождаем ссылку на объект, чтобы виндовый сборщик мусора освободил память Set objWrkBook = Nothing
End Sub
[/vba]
[vba]
Код
Sub Макрос1()
adr = Cells(1, 1) Set objWrkBook = Workbooks.Open(adr & "\База.xlsx")
' копируем данные из [База.xlsx]Лист1!A1 ' в ячейку "B3" активного листа в книге Сбор.xlsb ThisWorkbook.ActiveSheet.Range("B3").Value = objWrkBook.Worksheets("Лист1").Cells(1, 1).Value
в файлах "Сбор.xlsb" последняя строка макроса: [vba]
Код
ActiveWorkbook.Close
[/vba] закрывает сам файл "Сбор.xlsb", поэтому макрос не успевает отработать до конца и управление не передается обратно в цикл, т.ч. файлы "Сбор.xlsb" нужно закрывать непосредственно из цикла. а вообще, так писать (привязываясь к активному окну) - очень плохая практика! (мало ли кто и куда мышкой кликнет во время работы твоих макросов и кто знает какое окно после этого клика станет активным?...) т.ч. лучше работать с объектными переменными.
например, вот так: [vba]
Код
Sub Макрос1()
'Перед запуском выделить жёлтую ячейку!!!
окончание = [B4] For счетчик = 1 To окончание
ActiveCell.Value = счетчик
adr = Cells(1, 1) Set objWrkBook = Workbooks.Open(adr & "\Сбор.xlsb")
Application.Run _ "Сбор.xlsb!Макрос1"
objWrkBook.Close True ' закрываем Сбор.xlsb (с сохранением)
ActiveCell.Offset(1, 0).Select
Next счетчик
' освобождаем ссылку на объект, чтобы виндовый сборщик мусора освободил память Set objWrkBook = Nothing
End Sub
[/vba]
[vba]
Код
Sub Макрос1()
adr = Cells(1, 1) Set objWrkBook = Workbooks.Open(adr & "\База.xlsx")
' копируем данные из [База.xlsx]Лист1!A1 ' в ячейку "B3" активного листа в книге Сбор.xlsb ThisWorkbook.ActiveSheet.Range("B3").Value = objWrkBook.Worksheets("Лист1").Cells(1, 1).Value
KSV, спасибо! Мысль понятна - рабочие файлы сборов следует закрывать в файле управления. А насчёт активных окон, я ещё месяц назад боялся смотреть на любые коды. Пока только так, учимся. Ещё раз, спасибо!
KSV, спасибо! Мысль понятна - рабочие файлы сборов следует закрывать в файле управления. А насчёт активных окон, я ещё месяц назад боялся смотреть на любые коды. Пока только так, учимся. Ещё раз, спасибо!Сергей-К