VBA的GetObject |如何在Excel VBA中使用GetObject函数?
Excel VBA GETOBJECT函数
我们可以在MS Excel中的VBA中使用GetObject函数来从excel文件访问ActiveX对象,然后将该对象分配给对象变量。要使用OLE(对象链接和嵌入)或COM(复合对象模块)技术来控制任何Microsoft应用程序,例如MS Word,MS Outlook,MS PowerPoint和Internet Explorer等,我们可以使用VBA GETOBJECT函数。
我们使用CreateObject函数创建对象,而GETOBJECT函数返回对该对象的引用。
GETOBJECT函数的语法
GET OBJECT函数具有以下命名参数:
- 路径名: 我们需要指定完整路径和包含要检索的对象的文件的名称。这是一个可选参数,实际上,GetObject函数中的两个参数都是可选参数,但是如果省略“ pathname”,则需要第二个参数“ class”。
- 班级:这也是前面指定的可选参数。这接受一个表示对象类的字符串。
我们使用语法“ appname.objecttype”指定“ class”参数。
- 应用名称: 我们需要指定应用程序名称,它将提供对象。
- 对象类型: 我们指定要创建的对象的类的类型。
Excel VBA GETOBJECT函数的示例
您可以在此处下载此VBA GetObject模板– VBA GetObject模板假设我们有一个包含3个表的Word文档。
我们想编写一个VBA代码,将文档中的所有表导入到Excel工作表中。为此,我们将需要在VBA中使用CreateObject和GetObject函数。
步骤将是:
- 创建一个excel文件并使用.xlsm excel扩展名(Excel启用宏的工作簿)保存该文件,因为我们需要运行VBA代码(一个宏)。
- 使用快捷键(Alt + F11)或在excel“开发人员”标签的“代码”组中使用“ Visual Basic”命令,打开Visual Basic编辑器。
- 双击VBA编辑器左侧的“ ThisWorkbook”,然后从屏幕顶部显示的列表中选择“ Workbook”。
- 从列表中选择“打开”。
- 现在我们需要在这两行之间编写代码。
- 首先,我们将声明变量以保存对象(MS Word文档和MS Word应用程序对象),并声明“字符串变量”以保存需要从中提取表的文档名称。
- 对于错误处理,我们将添加一个语句,该语句告诉VBA程序忽略该错误并使用下一行代码恢复执行。 “ On Error Resume Next”语句不能解决运行时错误,而只是意味着程序将从导致错误的行之后的行继续执行。
- 现在我们将使用 GetObject函数 获取对Word应用程序对象的当前实例的访问权限。
- 如果万一没有MS Word应用程序或ActiveX组件的当前实例,则无法创建对象或返回对该对象的引用,然后出现错误429。为此,我们将在代码中添加以下两行。处理完错误后,我们需要使用来创建MS Word Application对象的实例。 CreateObject函数.
- 为了使MS Word应用程序可见,我们将更改 “ WdApp” 反对 真的.
- 我们需要找到Word文档的位置和文件名,我们要从中将表导入到Excel工作表中,并将其分配给 “ strDocName” 要查找名称和位置,我们可以查看 特性 文件。
打开 '特性' 对话框中,只需选择文件并按 “ Alt + Enter”.
- 如果文件在指定位置不存在,则代码将返回消息,指出“在文件夹路径中未找到文件标记详细信息”。标题为“对不起,该文档名称不存在。”
- 现在我们需要激活MS Word应用程序并分配变量 “ wddoc” 在word文档中将文件名存储在 “ strDocName”.
- 如果尚未打开文件,则我们需要打开文档并激活应用程序。
- 激活单词文档后,我们需要访问文档中的表。为此,我们将创建一些变量。
特布尔 是整数变量,它将存储文档中表的数量。
行 是long变量,它将存储特定表中的行数。
彩色 是long变量,它将存储特定表中的列数。
- 我们需要计算文档中表的数量,如果文档中没有表,那么我们将向用户显示一个消息框,其中 “在Word文档中找不到表”.
- 要访问文档中的表并在excel表中写入内容,我们将多次运行“ For” VBA循环数次表,在此VBA循环中,我们将运行嵌套的“ for”循环以访问每一行和行中的每一列。
- 由于我们不想保存文档并退出应用程序。我们还应该释放系统的内存。为此,我们将编写以下代码。
现在,每当我们打开excel文件时,都会使用word文档中的表格内容来更新填充。
代码:
Private Sub Workbook_Open()Rem声明对象变量以访问由GETOBJECT创建的对象Dim WdApp作为Object,wddoc作为Object Rem声明一个字符串变量以访问Word文档Dim strDocName As String Rem错误处理错误时恢复错误恢复下一个Rem激活MS Word已打开设置WdApp = GetObject(,“ Word.Application”)如果Err.Number = 429然后Err.Clear Rem如果尚未打开MS Word,则创建Word应用程序对象设置WdApp = CreateObject(“ Word.Application”)结束如果WdApp.Visible = True strDocName =“ C:\ Users \ CBA7_01 \ Desktop \ Marks Details.docx” Rem检查相关目录的相关文档Rem如果找不到,则通知用户并关闭程序,如果Dir(strDocName)=“ “然后MsgBox”文件“&strDocName&vbCrLf&”在文件夹路径中找不到“&vbCrLf&” C:\ Users \ CBA7_01 \。“,_vbExclamation,”很抱歉,该文档名称不存在。“如果WdApp.Activate设置,则退出子端wddoc = WdApp.Documents(strDocName)如果wddoc不存在,则设置wddoc = WdApp.Documents.Open(“ C:\ Users \ CBA7_01 \ Desktop \ Marks Details.docx”)wddoc.Activate Rem定义变量以访问单词文档中的表Dim Tble如整数Dim rowWd如Long Dim colWd如整数Dim x如Long,y如Long x = 1 y = 1使用wddoc Tble = wddoc.Tables.Count如果Tble = 0然后MsgBox“在Word文档中找不到表”,vbExclamation,“没有要导入的表”退出子结束,如果Rem启动循环访问表及其行,i的列的过程= 1用.Tables(i)调整rowWd = 1到colWd的.Rows.Count = 1到.Columns.Count的像元(x,y)= WorksheetFunction.Clean(.cell(rowWd,colWd).Range.Text)Rem访问下一列y = y + 1下一个colWd Rem转到下一行并从第1列开始y = 1 x = x + 1下一行Wd以Rem结尾以Rem结尾我们不需要保存word文档wddoc。关闭Savechanges:= False Rem我们退出了MS Word应用程序Wd App.Quit Rem我们最终释放分配给2个对象变量的系统内存Set wddoc = Nothing Set WdApp = Nothing End Sub
要记住的事情
- 有一些单实例对象,该对象仅生成该对象的一个实例,而不管为其运行CreateObject的数量如何。当使用零长度的字符串调用GetObject函数时,它始终会返回相同的实例,如果未提及“ pathname”参数,则会出现错误。
- 我们不能使用GetObject访问对使用VBA创建的类的引用。
- 如果出现这种情况,则没有MS Word应用程序的活动实例,或者我们不希望该对象以已加载的文件启动,则我们首先使用CreateObject函数创建该对象,然后使用GetObject函数访问该对象。