打开Excel文件以使用VBA读取而不显示


70

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

Answers:


82

不确定是否可以在当前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.Cursor也无济于事(在Office 2010 x64中)。
sevenkul 2015年

8
我强烈建议您在打开目标工作簿之前锁定应用程序会话:`App.AutomationSecurity = msoAutomationSecurityForceDisable``App.EnableEvents = False``App.Calculation = xlCalculationManual`-您可能会考虑枚举AddIns集合并将其禁用,也是如此:缓慢的加载项启动会延迟应用程序会话的启动
Nigel Heffernan

@尼罗河他们听起来都很棒的主意
Patrick McDonald

这是一段很棒的代码,但是,我想将工作表复制到此隐藏的工作簿中,恐怕这是不可能的,或者是吗?
mauek unak '16

1
以下@mauek的虚假言论,为简单起见,我认为到目前为止最正确的答案是@pstratonwkbAny.windows(1).Visible=False
Siyon DP

33

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

Application.ScreenUpdating = False

并具有加速代码的额外好处,而不是通过使用第二个Excel实例来减慢代码速度。


1
此代码将无法正常工作,excel存在一个问题,导致它无法实际执行您需要执行的操作。它只会停止您看到宏的工作原理,第二本书的实际打开以及工作簿本身仍会显示
RobertW081171 '20

对我来说还好吗?
SAL

22

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

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

谢谢,当我这样使用时它起作用了:在 ThisWorkbook.Activate: ActiveWindow.Visible = False: Application.ScreenUpdating = False 这里所有其他代码 Application.ScreenUpdating = True: ThisWorkbook.Activate: ActiveWindow.Visible = True任务栏和光标都不闪烁。
sevenkul 2015年

12

即使您有答案,对于那些发现此问题的人,也可以将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”是工作簿中选项卡的名称。网络上有一些教程,其中包含您可以和不能以这种方式访问​​工作表的详细信息。

只是以为我会补充。:)


@ShawnZhang我们正在阅读的大多数Excel文件都已以2000/2003格式导出,因为这是发件人程序发出的。我们已经针对2007/2010文件测试了连接字符串的一种变体,它也可以正常工作。
AnonJr 2012年

@ShawnZhang更重要的是,选项卡名称(在方括号中,以$结尾)似乎有一些有趣的限制,我现在似乎无法找到这些限制。列标题也一样。
AnonJr 2012年

1
读取Excel(所有版本以及以前的ODBC驱动程序)时,Jet OLEDB驱动程序会发生内存泄漏:如果在任何用户会话中多次执行此操作,则将收到有关可用内存的错误消息。忽略那些错误,后果自负-应用程序最终将冻结或崩溃。Microsoft不承认存在此问题,并且也没有任何文档。
Nigel Heffernan

这也使用语法与ACE / DAO工作SELECT * FROM [Excel 12.0 Xml;HDR=YES;IMEX=2;ACCDB=YES;DATABASE=C:\somefolder\myfile.xlsx].[sheetName$]; 与XLS和XLSX工程不用其他毛刺
帕特里克Honorez

11

一种不涉及操作活动窗口的简单得多的方法:

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

据我所知,工作簿上的Windows索引应该一直是1。如果有人知道任何使这种情况不成立的比赛条件,请告诉我。


4

iDevlop和Ashok的答案都存在一个问题,即根本的问题是Excel设计缺陷(显然),在这种缺陷中,Open方法无法遵守Application.ScreenUpdating设置为False。因此,将其设置为False对这个问题没有好处。

如果由于启动第二个Excel实例的开销而使Patrick McDonald的解决方案过于繁琐,那么我发现的最佳解决方案是通过尽快重新激活原始窗口来最大程度地减少打开的工作簿可见的时间:

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

为什么需要采取行动ActiveWindow?我认为打开工作簿窗口后隐藏它具有相同的效果
Winand 2015年

@Windand:如上所述,重点是通过尽快重新激活原始窗口来最大程度地减少新打开的工作簿的显示时间。实际上,根据需要,隐藏打开的工作簿是可选的。
pstraton

@Windand:重新激活已经渲染的窗口图像非常快,而取消分配可见窗口则需要操纵系统资源,这无疑是较慢的。差异足够关注吗?不知道
pstraton

2

以隐藏状态打开工作簿,然后将其设置为“已保存”,以便在关闭用户时不会提示用户。

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文件,该发票带有从该价格清单进行验证的产品的下拉列表。

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


1

从一个新的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

完成后,您需要记住进行清理。


2
只是为了强调,您必须在完成不可见实例后进行清理。如果您不这样做,则用户可能无法通过双击或从其他应用程序启动来打开excel文件,除非他们注销或知道如何终止进程(因为文件在不可见的窗口中打开)。
大卫,

0

在excel中,隐藏工作簿,并将其保存为隐藏。当您的应用加载它们时,它们将不会显示。

编辑:重新阅读后,很明显这些工作簿不属于您的应用程序。这样的解决方案对于用户工作簿是不合适的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.