vbe中库文件相关操作(疑难杂症)

1、vbe中工具->引用 是灰色的,无法使用。
有可能是正在运行,如果是这样,先停止运行就可以用了

 2、如何删除BVA中:工具——可以使用的引用——中的DLL.

(A)方案:

regedit——进入注册表,选中注册表树的最上级——计算机,然后点击——编辑——查找,输入要找的DLL名,找到后删除,再点击——查找下一个,一个个删除干净!!!

 例:解决方法

假设要删除的为“宏通Excel助手”
     在注册表的 \HKEY_CLASSES_ROOT\TypeLib 分支中查找“数据”等于“宏通Excel助手”(我要删的是“宏通Excel助手”),然后会找到一个键值,该键值的数据等于“宏通Excel助手”,看看这个分支下面的数据,是否包含你DLL的位置等信息,如果确定。则删除这个键值所在HKEY_CLASSES_ROOT\TypeLib\下的{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}分支。(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx根据你的实际情况是不同的16进制)

注册表查询"宏通Excel助手","宏通Excel助手",找到后连上级目录删除

(B)方案:VBE工程可以使用的引用管理(含删除)解决方案终极版

VBE环境中有一个可以让程序开发人员使用的引用工具,包括个人开发的DLL、类型库,由于种种原因引用后转移了目录,导致工具中出现过剩不可用或者不必要的引用,一般的操作是通过注册表查找guid后删除相关子项来解决,能不能直接在VBA环境操作工程可以使用的引用呢,比如查看,删除等。几年前我在VB环境下做过类似的开发工作,今天偿试了一下移值到VBA中,发现是可以的,由于代码量较大,对该VBA需要引用到的ISHF_EX.tlb类型库,我没有进行改写,大伙在使用时记得别忘了引用了。顺便说一句,类库是为了减少代码开发量,记录相关组件的接口的文件,可以用记事本写成olb,然后借助VC或者从其中抽出来的MKYTPLIB.EXE(网上很多下载)生成tlb文件,有需要的类型库源码可以向我要。对于删除可以使用的引用,我留下了代码,没有在窗体上加按钮,大伙自行加就是了。

http://club.excelhome.net/thread-855013-1-1.html

3、ActiveX 部件不能创建对象或返回对该对象的引用(错误 429)
请参阅     特性

创建对象要求该对象的类已在系统注册表中注册,而且任何相关的动态链接库 (DLL)必须能使用。此错误有以下的原因和解决方法:

类没有注册。例如,系统注册表中没有类的说明,或虽有类说明,但找不到文件,或指定的文件类型错误。
如果可能的话,试着启动对象的应用程序。如果注册信息过期或错误,应用程序应该检查注册表并更正信息。如果启动应用程序没有解决问题,请重新执行应用程序的安装程序。

对象需要的 DLL 不能使用,可能因为找不到,或是已损坏。
确保所有相关的 DLL 都可使用。例如,Data Access Object (DAO) 需要支持多平台的 DLL。如果这是造成错误的原因,则要为此对象重新执行安装程序。

对象在机器上使用,但它是授权的 Automation 对象,而且在具体的例子授权中不能确认可用。
一些对象在部件找到授权键后,才能被具体的例子说明,并且在当前的机器上的实例说明中,确认对象已被注册。当通过正确安装的类型库或对象库对一个对象进行引用时,就能自动提供正确的键。

如果 CreateObject 或 GetObject 的调用结果,是用例子说明,那么,对象必须找到键。在这种情况,它会搜寻系统注册表或查找它在安装时建立的指定文件,例如,扩展名为 .lic 的文件。如果此键找不到,则对象不能被说明。如果用户建立对象应用程序,删除必须文件,或改变系统注册表,则对象不能找到此键。如果此键找不到,对象也不能用例子说明。实例说明可在开发系统中工作,但不能在用户系统中。它对用户重装登记的对象是必须的。

使用 GetObject 函数获得用 Visual Basic 所创建类的引用。
GetObject 不能获得用 Visual Basic 所创建类的引用。

对该对象的访问显式地被拒绝。
例如,试图访问当前正在使用的数据对象,且此对象已被锁定以防止死锁情形发生。如果是这样的情形,可以在其他时间去访问对象。

详细信息,可选取有问题的项目,并按下 F1 (在Windows中)或HELP(在Macintosh中)键。

 

这个是注册, 不是引用,引用要在注册后,再在VBE中的工具-引用中添加,或者用代码操作
HKEY_CLASSES_ROOT下的TYPELIB,查找DLL名,删除,就可以了。

 

 4、通过Excel VBA环境来引用用VBA编写的DLL

通过将Excel VBA代码封装成DLL,可有效防止代码被非法查看。方法/步骤:

(1)注册Dll文件(不是引用)

注册dll,一般情况下,为了经常使用,建议将dll复制到系统盘的windows/system32目录,如果不是的,有时候需要加上dll的完整路径.

为什么DLL文件要用Regsvr32注册后才能使用?用Regsvr32注册Dll文件起到什么作用?Regsvr32命令注册dll文件时,都注册了那些内容,是dll文件的位置吗?
使用dll文件的应用程序是利用dll文件的入口函数调用的,windows系统知道与否有什么关系?又不是windows系统调用dll文件?

普通DLL是不用注册嘀.只有com组件才需要注册,注册时他把clsid和progid(可选)及DLL的路径写到注册表中.
于是用这些组件的客户端在创建该组件时就不用知道他的路径.
只需调用cocreateinstance并传入clsid,系统就能创建该组件的实例了.

注册:
regsvr32 /s winshow.dll

反注册:
regsvr32 /u winshow.dll

双击“ThisWorkBook”,选择“Open”事件和“BeforeClose事件上”,并输入以下代码,用于在文档打开时注册DLL,以及关闭时反注册DLL。(注:Chr(34) 是双引号)

Private Sub Workbook_BeforeClose(Cancel As Boolean)
   Shell "Regsvr32 /u /s " & VBA.Chr(34) & ThisWorkbook.Path & "\feifeidown.dll" & VBA.Char(34), vbHide
End Sub

Private Sub Workbook_Open()
   Shell "Regsvr32 /s " & VBA.Chr(34) & ThisWorkbook.Path & "\feifeidown.dll" & VBA.Char(34), vbHide
End Sub

EXCEL档案放在桌面,DLL也在桌面,上面代为什么不能自动引用?这个是注册, 不是引用,
HKEY_CLASSES_ROOT下的TYPELIB,查找DLL名,删除,就可以了。
还有注册了的DLL如何在引用中清除,在注册表里清除?

 (2)引用Dll文件
引用要在注册后,再在VBE中的工具-引用中添加,或者用代码操作。

打开Excel 2007,按键盘组合键“Alt+F11”进入VBA编程环境。点击“工具”→“引用”选项,在打开的“引用”窗口中,点击“浏览”按钮。

vbe中库文件相关操作(疑难杂症)

 

在随后打开的“浏览文件”窗口中,找到上一节生成的“feifeidown.dll”文件,点击“确定”进行添加,在返回的“引用”窗口中,确保勾选“feifeidown”,然后点击“确定”按钮完成。

注:如果DLL文件位置发生变化,只将用选中这个

(3)编写代码调用DLL
右击“Excel对象”,选择“插入”→“模块”,在模块中输入以下代码:

Sub Test()
         Dim sa As New AddInfo
          sa.SetValue
       End Sub

按下键盘快捷键“F5”,在打开的“宏”窗口中选择“Test”,点击“运行”,然后就可以在Sheet1工作表中看到效果啦。

最后将该过程添加到“ThisWorkBook”的启动菜单中,即可实现在打开文档中自动运行宏的目地。

 

 

 

 

 

2、COM加载宏封装自定义函数并全自动安装最简实例

http://club.excelhome.net/thread-701984-1-1.html


1.自动注册你的COM加载宏,并自动COM加载宏名称到Excle加载宏列表中。
2.可自定义安装程序界面,标题、版本、版权等信息。
3.引用wxhnr的话“就是不管是谁写的DLL,都能使用同一个注册程序。”


安装完成后,COM加载宏中的自定义函数已经可以直接使用了。
自定义信息及方法见install.txt文件

补1:补充一个自定义函数封装的简单示例。
补2:补充一个自定义函数安装的简单示例。
补3:补充一个加载安装自动化的简单示例。(17楼有说明)
补4:补充一个无须注册及引用的简单示例。(比较一下调用api函数的例子)
补5:最后补充第一附件的源码(总版给个精华不放源码不合时宜了)

COM技术的本质是在系统里注册一个类库(COM的类工厂)——不在乎是EXE还是DLL——白俗一点来说,这一点的技术过程原理就是必须有管理员权限对系统(注册),以指明类库的实体代码在哪里,
一般情况下在WINDOWS里呢,你们看到的就是以管理员用户手工打入命令行 regsvr32 某某DLL或某EXE,这一步本来是手工的,

变成SETUP关系也不大,因为有很多安装打包程序会自动帮你把COM组件捆绑到INSTALL或SETUP程序里,标准的开发软件不论VB还是NET还是第三方的商业软件都有这类东东,但记住只要注册COM,管理员权限是少不了的。
但搞到要研究自已手工去做,还能完全解决“自动注册、自动安装”的问题,大多数情况就有点本末倒置了,这是我个人的建议。

当然,如果只是调用DLL或EXE文件实体本身的函数入口,不要求注册一个系统类库的话,就没有上面的问题,这是早期的动态DLL做法。但是呢那个但是,它同样有对应的优缺点,缺点就是任何程序调用必须指定这个函数的实体文件位置,而不是现在COM和自动化简单的引用,WINAPI风格的函数就是这类了。

补充一下,一般“正常”的SETUP程序把需要的组件绑定了会这么做:

检测系统里有没有注册某个特定的X类库

比如说,这个APP运行的必要组件是DIRECTX 11和 DDT 3.5 (后面一个是我胡扯的,某个第三方组件,假定它很少人安装)
而用户目前的系统装了DIRECTX 17(笑),它是DIRECTX 11向下兼容,返回一个DIRECTX 类库的 11的检测信号,也就是DIRECTX 11组件 安装 TRUE,
但是用户没有装DDT 3.5或装了DDT 8.0 ,由于这个开发者的问题,即使装了DDT 4以上的版本,它们能兼容完成DDT 3.5所有功能,但都不能对SETUP发出的 DDT 3.5检测返回 TURE,
于是SETUP认为,DIRECTX 11组件是安装了,DDT 3.5没有安装,必须安装其中的DDT3.5,它会查找自身或指定位置(比如网络上、DVD指定目录上)的DDT3.5组件
装完以后再回到1检测

 

----------------------------关于VBE引号套用引号问题

如果在VBE中出现引号套用引号,则里面的引号需要用“”“”。

Range("i2").Value = "=IF(OR(AND(G2>=2/24000,G2<5/24),AND(G2=""--"",OR(C2<1,E2<1))),0.5,IF(AND(G2>=5/24,G2<=8/24),1,0))"

上面的--的引号,使用了双重引号""--""!否则“--”出现错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值