打开Excel文件,无需显示即可使用VBA进行读取

not*_*not 58 excel file-io vba excel-vba

我想用宏搜索现有的Excel文件,但我不希望在代码打开这些文件时显示这些文件.有没有办法让它们在"背景"中打开,可以这么说?

Pat*_*ald 74

不确定是否可以在当前的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
Run Code Online (Sandbox Code Playgroud)

正如其他人发布的那样,请确保在完成任何已打开的工作簿后进行清理

  • 我强烈建议您在打开目标工作簿之前锁定应用程序会话:`App.AutomationSecurity = msoAutomationSecurityForceDisable``App.EnableEvents = False``App.Calculation = xlCalculationManual` - 您可以考虑枚举AddIns集合并禁用它们,也是:**缓慢加载启动会延迟应用会话**的启动. (7认同)

Pat*_*rez 30

如果这符合您的需求,我会简单地使用

Application.ScreenUpdating = False
Run Code Online (Sandbox Code Playgroud)

还有加速代码的好处,而不是通过使用第二个Excel实例来降低代码速度.

  • 这段代码不起作用,Excel 有一个问题,它无法实际执行您需要它执行的操作。它只会阻止您看到宏的工作原理,第二本书的实际打开和工作簿本身仍然会显示 (2认同)

Mun*_*hid 20

使用 ADO(AnonJr已经解释过)并利用SQL可能是从封闭的工作簿中获取数据而无需以传统方式打开该工作簿的最佳选择。请观看此视频。

否则,可能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
Run Code Online (Sandbox Code Playgroud)

如果您想读取特定工作表,甚至不需要定义工作簿变量

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

  • 哇,最佳答案。这是唯一一个从字面上将工作簿打开为隐藏的答案(与声称的答案不同,但实际上将其打开为可见,然后隐藏它)。非常棒的答案,应该是精选答案! (4认同)
  • 打开时唯一可见的指示器是右下角的标准进度条。这可以通过在“GetObject”之前使用“ScreenUpdating=false”来消除。 (2认同)

Ash*_*hok 19

要打开隐藏在现有Excel实例中的工作簿,请使用以下命令:

    Application.ScreenUpdating = False
    Workbooks.Open Filename:=FilePath, UpdateLinks:=True, ReadOnly:=True
    ActiveWindow.Visible = False
    ThisWorkbook.Activate
    Application.ScreenUpdating = True
Run Code Online (Sandbox Code Playgroud)


Ano*_*nJr 11

即使您已得到答案,对于那些发现此问题的人,也可以将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"
Run Code Online (Sandbox Code Playgroud)

请注意,"RegistrationList"是工作簿中选项卡的名称.网上有一些教程,其中包含您可以和不可以通过这种方式访问​​工作表的详细信息.

只是想我会添加.:)

  • Jet OLEDB 驱动程序在读取 Excel(所有版本和之前的 ODBC 驱动程序)时会出现内存泄漏:**如果您在任何用户会话中多次执行此操作,您将收到有关可用内存的错误消息**。忽略这些错误将带来危险 - 您的应用程序最终将冻结或崩溃。Microsoft 不承认此问题存在,也没有任何相关文档。 (2认同)

Ant*_*rdi 7

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

Dim wb As Workbook
Set wb = Workbooks.Open("workbook.xlsx")
wb.Windows(1).Visible = False
Run Code Online (Sandbox Code Playgroud)

从我可以告诉我的工作簿上的Windows索引应该始终如一1.如果有人知道任何会导致这种不真实的竞争条件,请告诉我.


pst*_*ton 5

iDevlop 和 Ashok 的答案的问题在于,根本问题是 Excel 设计缺陷(显然),其中 Open 方法无法遵循 False 的 Application.ScreenUpdating 设置。因此,将其设置为 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...
Run Code Online (Sandbox Code Playgroud)