Я хочу искать через существующие файлы Excel с помощью макроса, но я не хочу отображать эти файлы, когда они открываются кодом. Есть ли способ открыть их "в фоновом режиме", так сказать?
Открыть файл Excel для чтения с помощью VBA без отображения
Ответ 1
Не уверен, что вы можете открыть их невидимо в текущем экземпляре 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
Как сообщали другие, убедитесь, что вы очистились после того, как вы закончили с любыми открытыми книгами.
Ответ 2
Если это соответствует вашим потребностям, я просто использовал бы
Application.ScreenUpdating = False
с дополнительным преимуществом ускорения вашего кода, вместо замедления его использования с помощью второго экземпляра Excel.
Ответ 3
Даже если у вас есть ответ, для тех, кто находит этот вопрос, также можно открыть электронную таблицу 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" - это название вкладки в книге. В Интернете есть несколько руководств, в которых вы можете узнать, что вы можете и не можете сделать доступ к листу таким образом.
Просто подумал, что добавлю.:)
Ответ 4
Чтобы открыть книгу как скрытую в существующем экземпляре Excel, используйте следующую команду:
Application.ScreenUpdating = False
Workbooks.Open Filename:=FilePath, UpdateLinks:=True, ReadOnly:=True
ActiveWindow.Visible = False
ThisWorkbook.Activate
Application.ScreenUpdating = True
Ответ 5
Более простой подход, который не включает управление активными окнами:
Dim wb As Workbook
Set wb = Workbooks.Open("workbook.xlsx")
wb.Windows(1).Visible = False
Из того, что я могу сказать, индекс Windows в книге всегда должен быть 1
. Если кто-нибудь знает какие-либо условия гонки, которые сделают это неверным, пожалуйста, дайте мне знать.
Ответ 6
Проблема с ответами iDevlop и Ashok заключается в том, что основной проблемой является недостаток дизайна 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...
Ответ 7
Откройте их из нового экземпляра 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
Вам нужно запомнить очистку после того, как вы закончите.
Ответ 8
Откройте книгу как скрытую, а затем установите ее как "сохраненную", чтобы пользователи не запрашивали, когда они закрываются.
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, который представляет собой счет-фактуру с выпадающими списками для продукта, который проверяется в этом прейскуранте.
Затем вы можете сохранить прейскурант в общем месте в сети и сделать его доступным только для чтения.
Ответ 9
В Excel, спрячьте книги и сохраните их как скрытые. Когда ваше приложение загружает их, они не будут отображаться.
Изменить: при повторном чтении стало ясно, что эти книги не являются частью вашего приложения. Такое решение было бы неуместным для пользовательских книг.