我想使用宏搜索现有的Excel文件,但是当代码打开这些文件时,我不想显示这些文件。可以这么说,有没有办法让它们“在后台”打开?
Answers:
不确定是否可以在当前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
正如其他人所发布的,请确保在完成所有打开的工作簿后进行清理
wkbAny.windows(1).Visible=False
如果适合您的需求,我会简单地使用
Application.ScreenUpdating = False
并具有加速代码的额外好处,而不是通过使用第二个Excel实例来减慢代码速度。
若要以隐藏在现有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
任务栏和光标都不闪烁。
即使您有答案,对于那些发现此问题的人,也可以将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”是工作簿中选项卡的名称。网络上有一些教程,其中包含您可以和不能以这种方式访问工作表的详细信息。
只是以为我会补充。:)
SELECT * FROM [Excel 12.0 Xml;HDR=YES;IMEX=2;ACCDB=YES;DATABASE=C:\somefolder\myfile.xlsx].[sheetName$];
与XLS和XLSX工程不用其他毛刺
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
?我认为打开工作簿窗口后隐藏它具有相同的效果
以隐藏状态打开工作簿,然后将其设置为“已保存”,以便在关闭用户时不会提示用户。
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文件,该发票带有从该价格清单进行验证的产品的下拉列表。
然后,您可以将价格表存储在网络中某个位置的共享位置上,并将其设置为只读。
从一个新的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
完成后,您需要记住进行清理。