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

问题描述:

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

不知道你是否能在当前不可见其打开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 

正如其他已经公布,确保在完成任何已打开的工作簿后进行清理

+0

它会停止任务栏中的闪烁,但会导致光标闪烁。即使Application.Cursor也没有帮助(在Office 2010 x64中)。 – sevenkul 2015-03-17 13:31:30

+4

我强烈建议你锁定的应用程序会话打开目标工作簿之前: `App.AutomationSecurity = msoAutomationSecurityForceDisable`` = App.EnableEvents假`` = App.Calculation`xlCalculationManual - 你可以考虑枚举AddIns收集并禁用它们:**缓慢的插件启动会延迟应用程序会话的启动**。 – 2016-01-22 11:57:56

+0

@Nile他们都听起来像是伟大的想法 – 2016-01-25 13:17:54

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

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

从新的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.ScreenUpdating设置False。因此,将其设置为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。如果有人知道任何会造成这种不真实的竞赛状况,请告诉我。