用 VBA 打开 Excel 文件进行读取,但不显示

我想通过一个宏来搜索现有的 Excel 文件,但是我不想在代码打开这些文件时显示它们。有没有办法让他们打开“在后台”,可以这么说?

356536 次浏览

在 Excel 中,隐藏工作簿,并将它们保存为隐藏状态。当应用程序加载它们时,它们将不会显示。

编辑: 重读之后,很明显,这些工作簿不是应用程序的一部分。这种解决方案不适合用户工作簿。

不确定是否可以在当前 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

正如其他人所发布的,确保在打开任何工作簿之后进行清理

从 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

你要记得做完后要清理干净。

如果这符合你的需要,我只需要

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 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

这在某种程度上是对 Ashok 的回答的推导。

通过这种方式,虽然不会提示您将更改保存回从中读取的 Excel 文件。如果从 Excel 文件读取数据是为了作为验证的数据源,那么这非常好。例如,如果工作簿包含产品名称和价格数据,则可以将其隐藏,并且可以显示一个 Excel 文件,该文件表示从该价格列表验证的产品的发票和下拉列表。

然后,您可以将价格列表存储在网络上的某个共享位置,并使其成为只读的。

IDevlop 和 Ashok 的回答都存在的问题是,根本问题是 Excel 的设计缺陷(很明显) ,Open 方法没有尊重 Application。正确的屏幕更新设置。因此,将其设置为 False 对此问题没有任何好处。

如果 Patrick McDonald 的解决方案因为启动第二个 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...

一种更简单的方法,不需要操纵活动窗口:

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

据我所知,工作簿上的 Windows 索引应该始终是 1。如果任何人知道任何比赛条件,会使这不真实请让我知道。

使用 ADO (匿名已经解释过了)和使用 SQL可能是从封闭的工作簿中提取数据而不用以常规方式打开工作簿的最佳选择。请看 译自: http://www.youtube.com/watch? v = L0I24NGrUtc rel = “ noReferrer”> VIDEO

否则,可能 GetObject(<filename with path>)是最 简明扼要的方式。工作表仍然是不可见的,但是会出现在 VBE 的项目资源管理器窗口中,就像以常规方式打开的任何其他工作簿一样。

Dim wb As Workbook


Set wb = GetObject("C:\MyData.xlsx")  'Worksheets will remain invisible, no new window appears in the screen
' your codes here
wb.Close SaveChanges:=False

如果要读取特定的工作表,甚至不需要定义 Workbook 变量

Dim sh As Worksheet
Set sh = GetObject("C:\MyData.xlsx").Worksheets("MySheet")
' your codes here
sh.Parent.Close SaveChanges:=False 'Closes the associated workbook