VBA: 打开Excel文件的两种方式(GetObject函数和Workbooks.Open方法)

2024-01-22 15:26:59 浏览数 (2)

文章背景: 打开指定路径的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

0 人点赞