Открыть файл Excel для чтения с помощью VBA без отображения

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

9 ответов


Не уверен, что вы можете открыть их невидимо в текущем экземпляре 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

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


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

Application.ScreenUpdating = False

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


хотя у вас есть ответ, для тех, кто находит этот вопрос, также можно открыть электронную таблицу 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 " - это имя вкладки в книге. Есть несколько учебников, плавающих в интернете с подробностями того, что вы можете и не можете сделать, получая доступ к листу таким образом.

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


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

    Application.ScreenUpdating = False
    Workbooks.Open Filename:=FilePath, UpdateLinks:=True, ReadOnly:=True
    ActiveWindow.Visible = False
    ThisWorkbook.Activate
    Application.ScreenUpdating = True

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

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

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


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

Если решение Patrick Mcdonald's слишком обременительно из-за накладных расходов на запуск второго экземпляра 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...

откройте их из нового экземпляра 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

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


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

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, представляющий счет-фактуру с раскрывающимися списками для продукта, проверяемого из этого прайс-листа.

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


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

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