Открыть файл Excel для чтения с VBA без отображения - PullRequest
54 голосов
/ 24 февраля 2009

Я хочу искать в существующих файлах Excel с помощью макроса, но я не хочу отображать эти файлы, когда они открываются кодом. Есть ли способ, чтобы они были открыты, так сказать, "в фоновом режиме"?

Ответы [ 9 ]

71 голосов
/ 24 февраля 2009

Не уверен, что вы можете открыть их невидимо в текущем экземпляре Excel

Вы можете открыть новый экземпляр Excel, спрятать его, а затем открыть рабочие книги

Dim app as New Excel.Application
app.Visible = False 'Visible is False by default, so this isn't necessary
Dim book As Excel.Workbook
Set book = app.Workbooks.Add(fileName)
'
' Do what you have to do
'
book.Close SaveChanges:=False
app.Quit
Set app = Nothing

Как уже писали другие, не забудьте очистить после того, как закончите работу с открытыми книгами

29 голосов
/ 13 августа 2009

Если это соответствует вашим потребностям, я бы просто использовал

Application.ScreenUpdating = False

с дополнительным преимуществом ускорения кода вместо его замедления с помощью второго экземпляра Excel.

16 голосов
/ 16 января 2012

Чтобы открыть книгу как скрытую в существующем экземпляре Excel, используйте следующее:

    Application.ScreenUpdating = False
    Workbooks.Open Filename:=FilePath, UpdateLinks:=True, ReadOnly:=True
    ActiveWindow.Visible = False
    ThisWorkbook.Activate
    Application.ScreenUpdating = True
11 голосов
/ 13 августа 2009

Даже если у вас есть ответ, для тех, кто находит этот вопрос, также можно открыть электронную таблицу Excel как хранилище данных JET. Заимствование строки подключения из проекта, в котором я ее использовал, будет выглядеть примерно так:

strExcelConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & objFile.Path & ";Extended Properties=""Excel 8.0;HDR=Yes"""
strSQL = "SELECT * FROM [RegistrationList$] ORDER BY DateToRegister DESC"

Обратите внимание, что "RegistrationList" - это имя вкладки в рабочей книге. В Интернете есть несколько учебных пособий, в которых рассказывается о том, что вы можете и не можете сделать, используя этот лист.

Просто подумал, что добавлю. :)

7 голосов
/ 13 июля 2016

Гораздо более простой подход, который не включает манипулирование активными окнами:

Dim wb As Workbook
Set wb = Workbooks.Open("workbook.xlsx")
wb.Windows(1).Visible = False

Из того, что я могу сказать, индекс Windows на книге всегда должен быть 1. Если кто-нибудь знает о каких-либо условиях гонки, которые могут сделать это неправдой, пожалуйста, дайте мне знать.

3 голосов
/ 22 июля 2014

Проблема с ответами как iDevlop, так и Ашока состоит в том, что фундаментальная проблема заключается в недостатке дизайна Excel (по-видимому), в котором метод Open не соответствует параметру Application.ScreenUpdating False. Следовательно, установка значения False не принесет пользы этой проблеме.

Если решение Патрика Макдональда слишком обременительно из-за накладных расходов при запуске второго экземпляра Excel, то лучшее решение, которое я нашел, - это минимизировать время, в течение которого открытая книга видна, путем повторной активации исходного окна по возможности:

Dim TempWkBk As Workbook
Dim CurrentWin As Window

Set CurrentWin = ActiveWindow
Set TempWkBk = Workbooks.Open(SomeFilePath)
CurrentWin.Activate      'Allows only a VERY brief flash of the opened workbook
TempWkBk.Windows(1).Visible = False 'Only necessary if you also need to prevent
                                    'the user from manually accessing the opened
                                    'workbook before it is closed.

'Operate on the new workbook, which is not visible to the user, then close it...
1 голос
/ 18 июля 2014

Откройте книгу как скрытую, а затем установите ее как «сохраненную», чтобы пользователи не получали приглашения при закрытии.

Dim w As Workbooks

Private Sub Workbook_Open()
    Application.ScreenUpdating = False
    Set w = Workbooks
    w.Open Filename:="\\server\PriceList.xlsx", UpdateLinks:=False, ReadOnly:=True 'this is the data file were going to be opening
    ActiveWindow.Visible = False
    ThisWorkbook.Activate
    Application.ScreenUpdating = True
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    w.Item(2).Saved = True 'this will suppress the safe prompt for the data file only
End Sub

Это в некоторой степени производное от ответа Ашока.

Поступая таким образом, вы не будете получать приглашение сохранить изменения в файле Excel, из которого вы читаете. Это замечательно, если файл Excel, из которого вы читаете, предназначен для проверки в качестве источника данных. Например, если рабочая книга содержит названия продуктов и данные о ценах, ее можно скрыть, и вы можете показать файл Excel, который представляет счет-фактуру с выпадающими списками для продукта, который проверяется по этому прайс-листу.

Затем вы можете сохранить прайс-лист в общем месте в сети и сделать его доступным только для чтения.

1 голос
/ 24 февраля 2009

Откройте их из нового экземпляра Excel.

Sub Test()

    Dim xl As Excel.Application
    Set xl = CreateObject("Excel.Application")

    Dim w As Workbook
    Set w = xl.Workbooks.Add()

    MsgBox "Not visible yet..."
    xl.Visible = True

    w.Close False
    Set xl = Nothing

End Sub

Вам нужно помнить, чтобы вымыться после того, как вы закончите.

0 голосов
/ 24 февраля 2009

В Excel скрыть рабочие книги и сохранить их как скрытые. Когда ваше приложение загрузит их, они не будут показаны.

Редактировать: после перечитывания стало ясно, что эти рабочие книги не являются частью вашего приложения Такое решение не подходит для рабочих книг пользователей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...