VBA中如果要调用外部对象,有2种方法:
在VBA编辑器里点击工具-引用,找到需要使用的项目勾选
使用VBA的CreateObject函数,这种情况下要知道COM对象的名称。
前期绑定的方法应该比较好理解,在Excel直接手动找到需要依赖的文件,一般是.dll后缀的,然后调用这个文件里的东西。
那么后期绑定为什么也能运行呢?
这个其实道理也是一样的,最终还是要找到那个依赖的文件,读取依赖文件里面的东西。
1、注册表
Windows系统有一种叫做注册表的东西,里面保存了很多数据信息,CreateObject函数就是通过注册表来找到依赖文件的。
以外部对象字典为例,来看看通过注册表是如何找到依赖文件的:
所以,前期绑定和后期绑定最终都是需要引用这个C:\Windows\system32\scrrun.dll,只是后期绑定在运行的时候去查找,而前期绑定是在运行之前就已经找好了。
2、使用VBA读取注册表
如果还想知道其他的外部对象所引用的具体文件,用上面的方法自然可以找到,但是这样手动查找挺麻烦的,看看使用VBA如何来读取注册表信息:
Private Function GetObjectDllPathByWSCript(ObjectName As String) As String
Dim ws As Object
Set ws = VBA.CreateObject("WScript.Shell")
Dim clsid As String
clsid = ws.RegRead("HKEY_CLASSES_ROOT\" & ObjectName & "\CLSID\")
Dim dllpath As String
dllpath = ws.RegRead("HKEY_CLASSES_ROOT\CLSID\" & clsid & "\InprocServer32\")
GetObjectDllPathByWSCript = dllpath
Set ws = Nothing
End Function
使用WScript.Shell外部对象读取注册表的信息比较简单,只要正确找到注册表路径即可。
这里只用到了RegRead,更多信息可以引用C:\Windows\SysWOW64\wshom.ocx后,使用对象浏览器查看: