本文是利用 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 -- ローカル ("") または省略 --> C[CreateObject("appname.objecttype")]
B -- リモートサーバー名 --> D["CreateObject("appname.objecttype", "ServerName")"]
C --> E["オブジェクト変数へ代入"]
D --> E
E --> F["プロパティ操作 / メソッド実行"]
F --> G["Quitメソッド等でアプリケーション終了"]
G --> H["Set変数 = Nothing で解放"]
使用 CreateObject 时的注意事项
一手资料中记载了几个使用 CreateObject 时的重要注意事项。
启动新实例 当不存在该对象的当前运行实例时,请使用
CreateObject。即使已经有实例在运行,也会启动一个新实例,并创建指定类型的对象。现有实例的处理与 GetObject 如果希望使用已经运行的实例,或者启动应用程序并加载文件,官方建议使用
GetObject函数而不是CreateObject。单实例对象 如果对象将自身注册为单实例对象,则无论执行多少次
CreateObject,都只会创建一个实例。

コメント