VBA CreateObject函数如何找到所需要的依赖文件
时间:2022-07-24
本文章向大家介绍VBA CreateObject函数如何找到所需要的依赖文件,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
VBA中如果要调用外部对象,有2种方法:
- 前期绑定:
在VBA编辑器里点击工具-引用,找到需要使用的项目勾选
- 后期绑定:
使用VBA的CreateObject函数,这种情况下要知道COM对象的名称。
前期绑定的方法应该比较好理解,在Excel直接手动找到需要依赖的文件,一般是.dll后缀的,然后调用这个文件里的东西。
那么后期绑定为什么也能运行呢?
这个其实道理也是一样的,最终还是要找到那个依赖的文件,读取依赖文件里面的东西。
1、注册表
Windows系统有一种叫做注册表的东西,里面保存了很多数据信息,CreateObject函数就是通过注册表来找到依赖文件的。
以外部对象字典为例,来看看通过注册表是如何找到依赖文件的:
- 点击电脑的开始--运行,输入cmd,然后在黑框里输入regedit,这样就打开了注册表编辑器。
- 点击HKEY_CLASSES_ROOT,在它下面找到Scripting.Dictionary
- 继续打开CLSID,右边就有一行内容:
- 记录下{EE09B103-97E0-11CF-978F-00A02463E06F}
- 在HKEY_CLASSES_ROOT下面找到CLSID,打开它,可以看到有很多类似上面那串数据的东西,在里面找到它(按字母顺序排序的)
- 找到后继续展开InprocServer32,可以看到右边有了一个dll的路径,这个也就是前期绑定需要引用的依赖文件
所以,前期绑定和后期绑定最终都是需要引用这个C:Windowssystem32scrrun.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_ROOTCLSID" & clsid & "InprocServer32")
GetObjectDllPathByWSCript = dllpath
Set ws = Nothing
End Function
使用WScript.Shell外部对象读取注册表的信息比较简单,只要正确找到注册表路径即可。
这里只用到了RegRead,更多信息可以引用C:WindowsSysWOW64wshom.ocx后,使用对象浏览器查看:
- 并发与实例上下文模式: WCF服务在不同实例上下文模式下具有怎样的并发表现
- AngularJS in Action读书笔记4(实战篇)——创建Statistic模块
- Effective Deep Memory Networks for Relation Extraction
- ConcurrencyMode.Multiple模式下的WCF服务就一定是并发执行的吗:探讨同步上下文对并发的影响[上篇]
- WCF技术剖析之二十一:WCF基本异常处理模式[下篇]
- AngularJS in Action读书笔记5(实战篇)——在directive中引入D3饼状图显示
- WCF中并发(Concurrency)与限流(Throttling)体系深入解析系列[共7篇]
- AngularJS in Action读书笔记6(实战篇)——bug hunting
- FreeMarker模板开发指南知识点梳理
- WCF技术剖析之二十: 服务在WCF体系中是如何被描述的?
- WCF如何克服HTTP传输协议的局限提供对不同消息传输模式的实现
- H5手游大事件:腾讯上线“微信小游戏”!支持群分享与内购
- 我所理解的Remoting(2):远程对象生命周期的管理[上篇]
- 谈谈分布式事务(Distributed Transaction)[共5篇]
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Redis文件事件&时间事件处理机制
- Redis持久化策略
- Redis二进制安全的原理
- 面试必备 Vue 知识点
- 数据传输 | mysqldiff/mysqldbcompare 实现 DTLE 自动化测试
- CPU有个禁区,内核权限也无法进入!
- 分布式 | DBLE 3.20.07.0 来啦!
- C语言三剑客之《C陷阱与缺陷》一书精华提炼
- Linux进程间通信(上)之管道、消息队列实践
- FPGA上电时序
- 更新Kubernetes APIServer证书
- R语言连续时间马尔科夫链模拟案例 Markov Chains
- 如何用R语言在机器学习中建立集成模型?
- 从零开始Kubernetes Operator
- TiKV源码解析系列文章(二十)Region Split源码解析