[VBA] Копирование листа книги из скрытого приложения в активную книгу

NickM

Опытный участник
Сообщения
630
Реакции
250
Уважаемые, здравствуйте!

Не могу решить вопрос из сабжа (Set HideApp = New Application: HideApp.Visible = False) - валится с ошибкой "Метод Copy из класса Worksheet завершен неверно".
Как только книгу открываю в активном приложении, то ошибка чудесным образом исчезает.

Вопрос: как скопировать лист книги открытой в скрытом приложении Excel в активную книгу, ну например в которой запускается некий макрос?
 
Здравствуйте!

Можно увидеть ваш полный код подключения к скрытой книге и копирования листа?
 
Код такой:

VB.NET / VBA:
Sub Кнопка1_Щелчок()

Set HideApp = New Application: HideApp.Visible = False 'создадим объект application и укажем, что объект не видимый

'Отключим отображение предупреждений
Application.DisplayAlerts = False

'Отключим обновление экрана
Application.ScreenUpdating = False

'Запомним активную книгу
Set ActWB = ThisWorkbook

'Oткроем файл в режиме «только чтение»
Set WB = HideApp.Workbooks.Open("C:\6\test_book.xls", ReadOnly:=True)

'Скопируем первый лист в активную книгу
WB.Sheets(1).Copy After:=ActWB.Sheets(ActWB.Sheets.Count)

'Включим отображение предупреждений
Application.DisplayAlerts = True

'Включим обновление экрана
Application.ScreenUpdating = True

MsgBox "Обработка файла завершена", vbInformation
End Sub
 
Последнее редактирование модератором:
@NickM,
VB.NET / VBA:
Set HideApp = New Application
здесь ведь получается, что вы создаетё ещё один экземпляр приложения (и ещё один процесс), а затем копируете лист, т.е. это межпроцессное взаимодействие, которое по всей видимости не поддерживается Excel-ем в данном контексте.

Попробуйте сделать всё под одним процессом.
По идее вот так не должно быть сильно заметно "бликов" при открытии книги с исходным листом:
VB.NET / VBA:
Sub Кнопка1_Щелчок()
    Dim wbSource As Workbook
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    Set wbSource = Workbooks.Open(ThisWorkbook.Path & "\Hidden.xls", ReadOnly:=True)
    wbSource.Windows(1).Visible = False
    wbSource.Sheets(1).Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
    wbSource.Windows(1).Visible = True
    wbSource.Close
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
End Sub

P.S. И я бы не советовал подменять понятия:
VB.NET / VBA:
'Запомним активную книгу
Set ActWB = ThisWorkbook
Всё-таки активная книга - это не всегда книга, откуда вызывается макрос (ThisWorkbook).
 
Назад
Сверху Снизу