繁体   English   中英

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

[英]Open Excel file for reading with VBA without display

我想使用宏搜索现有的 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

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

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

Application.ScreenUpdating = False

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

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

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

使用 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

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

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

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

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”是工作簿中选项卡的名称。 网络上流传着一些教程,其中详细说明了以这种方式访问​​工作表可以做什么和不可以做什么。

只是想我会添加。 :)

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

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

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

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

我的英语不好,对不起!

我的代码:

Dim AppExcel as Excel.Application
Set AppExcel = new Excel.Application
AppExcel.ScrennUpdating = false
AppExcel.Workbooks.Open "C:\file.xls"

在我的 PC 中,我使用我的用户登录并运行代码而没有错误。 最近我创建了一个新用户。 当我使用新用户登录时,尝试在后台打开工作簿时出现代码中断,但是如果我在打开工作簿之前设置了 visible = true ... 打开没有错误。 如果我登录旧用户一切正常。

错误信息是 &H800706BE

怎么修?

谢!

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM