文章背景: 打开指定路径的Excel文件,在VBA中常用的是Workbooks.Open方法,最近发现有个GetObject函数,也有类似的功能,所以本文探讨下两种打开方式的区别。
1 Workbooks.Open2 GetObject 3 两种打开方式的区别
1 Workbooks.Open
打开一个工作簿。
expression.Open (FileName, UpdateLinks, ReadOnly, Format, Password, WriteResPassword, IgnoreReadOnlyRecommended, Origin, Delimiter, Editable, Notify, Converter, AddToMru, Local, CorruptLoad)
编辑结束后,如果要关闭工作簿,可以使用Workbook.Close。
expression.Close (SaveChanges, FileName, RouteWorkbook)
代码示例:
代码语言:javascript复制Option Explicit
Option Base 1
Sub test()
'打开工作簿
Dim wb As Workbook, pathname As String
pathname = "D:OneDrive文档test.xlsm"
Set wb = Workbooks.Open(pathname)
wb.Sheets(1).Range("A1") = "Hello world!"
wb.Close SaveChanges:=True
MsgBox "Done!"
End Sub
打开一份Excel文件,编辑结束后,保存内容并关闭。
2 GetObject
返回对 ActiveX 组件提供的对象的引用。
GetObject ([ pathname ], [ class ])
代码示例:
代码语言:javascript复制Sub test2()
'使用GetObject函数打开工作簿
Dim wb As Workbook, pathname As String, content As String
pathname = "D:OneDrive文档test.xlsm"
On Error Resume Next
Set wb = GetObject(pathname)
On Error GoTo 0
If wb Is Nothing Then
MsgBox "File not found or error occurred."
Exit Sub
End If
' 获取内容
content = wb.Sheets(1).Range("A1").Value2
MsgBox content
wb.Close SaveChanges:=False
MsgBox "Done!"
End Sub
使用GetObject
函数,获取对指定Excel文件的引用。如果Excel文件尚未打开,那么程序会在后台打开该工作簿。
注意:通过GetObject
函数引用某个工作簿时,如果该工作簿已经打开,但不处于活动(Active)状态,则程序可能会报错。
3 两种打开方式的区别
(1)使用GetObject
函数的好处是,可以通过隐藏方式打开指定工作簿。如果目的是获取指定工作簿的数据,而不试图修改数据,那可以使用GetObject
函数。
(2)在打开指定工作簿时,如果该工作簿已经提前打开,使用GetObject
函数有可能会报错,因为该工作簿一般不处于活动状态;
使用Workbooks.Open
方法通常不会导致错误。相反,它会返回对已经打开的工作簿的引用,而不会重新打开它。
(3)通过GetObject
函数打开的Excel文件只要被修改(写)并保存后,后续打开该文件就只能在VBE中看到表格,但用户界面却看不到。使用Workbooks.Open
方法不存在这个问题。
针对GetObject
函数存在的问题,解决的方法有两个:
1)在打开该文件后,通过显示
菜单中的取消隐藏
功能让表格再显示出来。
2)在wb.Close SaveChanges:=True
之前添加一句代码,Application.Windows(wb.name).Visible = True
。
代码示例:
代码语言:javascript复制Sub test4()
'使用GetObject函数打开工作簿,修改内容,文件不会被隐藏
Dim wb As Workbook, pathname As String, content As String
pathname = "D:OneDrive文档test.xlsm"
Set wb = GetObject(pathname)
wb.Sheets(1).Range("A2").Value2 = "No 2"
Application.Windows(wb.Name).Visible = True
wb.Close SaveChanges:=True
MsgBox "Done!"
End Sub
参考资料:
[1] getobject和workbooks.open哪个更好
[2] Workbooks.Open method
[3] Workbook.Close method