我想用宏搜索现有的Excel文件,但我不想在代码打开这些文件时显示它们。 有没有一种方法可以让它们“在后台”打开呢?
我希望能够编写一个宏来搜索多个Excel文件并收集数据,但是当这些文件被宏打开时,我不想看到它们被打开。请问有没有一种方法可以使这些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
正如其他人所回复的一样,请确保在完成任何打开的工作簿后进行清理。
App.AutomationSecurity = msoAutomationSecurityForceDisable
App.EnableEvents = False
App.Calculation = xlCalculationManual
wkbAny.windows(1).Visible=False
。 - Siyon DP如果那符合你的需求,我会简单地使用:
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
任务栏和光标都不会闪烁。 - sevenkul使用 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
如果您想阅读特定的工作表,甚至无需定义工作簿变量。Dim sh As Worksheet
Set sh = GetObject("C:\MyData.xlsx").Worksheets("MySheet")
' your codes here
sh.Parent.Close SaveChanges:=False 'Closes the associated workbook
GetObject
之前使用ScreenUpdating=false
可以消除它。 - johny why一个更简单的方法,不涉及操作活动窗口:
Dim wb As Workbook
Set wb = Workbooks.Open("workbook.xlsx")
wb.Windows(1).Visible = False
据我所知,工作簿上的Windows索引始终应为1
。如果有人知道任何可能导致这不成立的竞态条件,请告诉我。
尽管您已经得到了答案,但对于那些看到这个问题的人来说,也可以将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。 - iDevlopDim 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将工作簿隐藏打开,然后将其设置为“已保存”,这样当用户关闭时就不会提示。
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
在新的 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
完成后记得清理干净。