使用 Office VBA 的 CreateObject 安全地自动化其他应用程序

VBA・Officeカテゴリを表すパンダのイラスト VBA・Office

本文是利用 AI 创作的技术解说与实现示例。虽然发布的代码和步骤是基于一手资料构建的,但作者并未在真实设备上进行运行验证。根据环境和版本的不同,实际运行结果可能会有所差异。

Office VBA 中的 CreateObject 函数用于创建并返回对 ActiveX 对象的引用。它在官方规范中被定位为一种基础机制,用于从 VBA 中操作支持自动化的应用程序(如 Word 和 Excel 等)。 本文将基于一手资料,梳理 CreateObject 函数的语法、参数详情、从对象生成到释放的流程以及相关规范。


CreateObject 函数的语法与参数

根据一手资料,CreateObject 函数的语法如下:

CreateObject(class, [servername])

其中提供了 class 和 servername 两个参数。下面确认它们各自的作用。

  • class(必填 / Variant(String)):指定要创建的对象的应用程序名称和类。

  • servername(可选 / Variant(String)):指定在其上创建对象的网络服务器的名称。如果指定空字符串(""),则使用本地计算机。

此外,class 参数的格式为 appname.objecttype。

  • appname:提供对象的应用程序名称。

  • objecttype:要创建的对象的种类或类。


对象变量的声明与后期绑定

要从自动化目标应用程序中获取对象,需要将 CreateObject 返回的引用赋值给对象变量。

一手资料中介绍了使用 As Object 子句声明对象变量的方法。使用此声明方法,变量将能够持有任何类型的对象引用。

' 【计划在 Windows 环境中验证】
Dim ExcelSheet As Object
Set ExcelSheet = CreateObject("Excel.Sheet")

当像这样使用 As Object 进行声明时,访问方式将是后期绑定(动态绑定)。也就是说,绑定将在程序运行时进行。

将引用赋值给对象变量后,便可以访问应用程序对象或集合等的属性和方法。一手资料展示了一系列流程:使 Excel 可见、向单元格输入文字、保存并退出。

' 【计划在 Windows 环境中验证】
ExcelSheet.Application.Visible = True
ExcelSheet.Application.Cells(1, 1).Value = "This is column A, row 1"
ExcelSheet.SaveAs "C:TEST.XLS"
ExcelSheet.Application.Quit
Set ExcelSheet = Nothing

在处理的最后执行 Set ExcelSheet = Nothing,以确实地释放对象变量,这一点非常重要。


通过早期绑定构建实现

一手资料中不仅提到了后期绑定,还提及了通过指定特定类 ID 来进行早期绑定(编译时绑定)的方法。

通过明确指定特定类型来声明变量,可以期待性能的提升,但它只能持有声明时指定类别的引用。

' 【计划在 Windows 环境中验证】
Dim xlApp As Excel.Application 
Dim xlBook As Excel.Workbook
Dim xlSheet As Excel.WorkSheet

Set xlApp = CreateObject("Excel.Application")
Set xlBook = xlApp.Workbooks.Add
Set xlSheet = xlBook.Worksheets(1)

在这种配置下,应用程序、工作簿和工作表的各个对象将根据各自的类型进行处理。


在网络远程计算机上创建对象

使用 CreateObject 函数,还可以通过第二个参数 servername 在网络上的远程计算机上创建对象。

将相当于共享名机器名部分的字符串传递给参数。例如,如果共享名为 MyServerPublic,则服务器名为 "MyServer"。

我们来看一下一手资料中记载的远程执行示例。

' 【计划在 Windows 环境中验证】
Dim xlApp As Object
Set xlApp = CreateObject("Excel.Application", "MyServer")
Debug.Print xlApp.Version

此外,一手资料中说明,如果指定的远程服务器不存在或处于不可用状态,将会发生运行时错误。


处理流程全貌

下面用 Mermaid 流程图来梳理到目前为止讲解的使用 CreateObject 进行对象生成、释放以及远程引用的机制。

flowchart TD
    A["VBA代码执行"] --> B{"servername的指定是?"}
    B -->|"ローカル (#quot;#quot;) または省略"| C["CreateObject(#quot;appname.objecttype#quot;)"]
    B -->|"リモートサーバー名"| D["CreateObject(#quot;appname.objecttype#quot;, #quot;ServerName#quot;)"]
    C --> E["オブジェクト変数へ代入"]
    D --> E
    E --> F["プロパティ操作 / メソッド実行"]
    F --> G["Quitメソッド等でアプリケーション終了"]
    G --> H["Set変数 = Nothing で解放"]

使用 CreateObject 时的注意事项

一手资料中记载了几个使用 CreateObject 时的重要注意事项。

  1. 启动新实例 当不存在该对象的当前运行实例时,请使用 CreateObject。即使已经有实例在运行,也会启动一个新实例,并创建指定类型的对象。

  2. 现有实例的处理与 GetObject 如果希望使用已经运行的实例,或者启动应用程序并加载文件,官方建议使用 GetObject 函数而不是 CreateObject。

  3. 单实例对象 如果对象将自身注册为单实例对象,则无论执行多少次 CreateObject,都只会创建一个实例。


参考信息

文档信息

文章??
使用 Office VBA 的 CreateObject 安全地自动化其他应用程序
?布日期
更新日期
来源
https://papanda925.com/?p=13903&lang=zh

?可: ?于本站?有相??利的正文及原??表,除非?有?明,可依据 CC BY 4.0 使用。本文可能包含使用生成式AI?建或??的内容。若代??有?可声明,或?接的GitHub???定了?可,?代?以??可?准。引用内容、第三方?料、?片及商?不在本?可范?内。 使用政策

标题和URL已复制