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函数具有以下命名参数:

  1. 路径名: 我们需要指定完整路径和包含要检索的对象的文件的名称。这是一个可选参数,实际上,GetObject函数中的两个参数都是可选参数,但是如果省略“ pathname”,则需要第二个参数“ class”。
  2. 班级:这也是前面指定的可选参数。这接受一个表示对象类的字符串。

我们使用语法“ appname.objecttype”指定“ class”参数。

  1. 应用名称: 我们需要指定应用程序名称,它将提供对象。
  2. 对象类型: 我们指定要创建的对象的类的类型。

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 

要记住的事情

  1. 有一些单实例对象,该对象仅生成该对象的一个​​实例,而不管为其运行CreateObject的数量如何。当使用零长度的字符串调用GetObject函数时,它始终会返回相同的实例,如果未提及“ pathname”参数,则会出现错误。
  2. 我们不能使用GetObject访问对使用VBA创建的类的引用。
  3. 如果出现这种情况,则没有MS Word应用程序的活动实例,或者我们不希望该对象以已加载的文件启动,则我们首先使用CreateObject函数创建该对象,然后使用GetObject函数访问该对象。