ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 7237|回复: 16

[分享] 【少同爱分享】继VB6.0 COM加载项制作使用一年技术总结贴

[复制链接]

TA的精华主题

TA的得分主题

发表于 2016-5-10 13:37 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:插件开发
  首先开此贴的目的有两个,第一是自己对制作COM加载项过程遇到的问题的一个节点性总结,第二是希望此贴可以作为开发所遇各种疑难杂症解析贴供论坛里想要学习制作COM加载项的朋友以参考。
    自去年发布了第一篇COM加载项制作教程以后前面帖子的言论仍有觉不妥之处,今年已快过半年,心里总觉得必须对之前帖子一些内容做些更正,并且必须把自己开发过程中遇到的形形色色的问题罗列出来以备查用。先上去年帖子的教程链接:http://club.excelhome.net/thread-1206372-1-1.html
    如果这篇帖子有看不懂的朋友请不要着急研究本帖了,先研究一下去年的帖子跟着里面我推荐的教程还有我的教程做一些简单功能实现之后再来看这个帖子就会豁然开朗之感。其他基础性的知识建议要对选项卡有个概念,并且可以学习使用xml文件制作功能区(咱不要求你学会弄花里胡哨的功能区,简单的按钮、下拉会做基本也能做出美观的界面,等先把基础功能实现以后再研究花哨功能也没问题的),首先要对Excel里的自定义函数有个概念,因为这篇帖子会对COM加载项制作自定义函数做个完全总结,要对Excel里面的加载项、COM加载项有个概念,基本就是这些吧。
    另外大家都是工作者,时间有限,更新可能较慢,请稍安勿躁。OK,跟着我一起来,COM加载项的精彩世界在等你来~

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-5-16 22:19 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-5-16 22:23 | 显示全部楼层
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
  <ribbon startFromScratch="false">
    <tabs>
      <tab id="rxtabCustom"
        label="功能区新花样"
        insertAfterMso="TabHome">               
<group id="customGroup00" getLabel="rxAuditMisc_getLabel">
          <dropDown id="Classcify" label="dropDowns:">
            <item id="FdD1Item1" label="周一吃虾" />
            <item id="FdD1Item2" label="周二吃面" />
            <item id="FdD1Item3" label="周三鱼丸" />
            <item id="FdD1Item4" label="周四煎饼" />
            <item id="FdD1Item5" label="周五大餐" />
          </dropDown>
    <button id="FButton1" label="确认录入" imageMso="ExportToVCardFile" size="large" />                 
        </group>                        
      </tab>
    </tabs>
  </ribbon>
</customUI>
在vba中的代码回调如下,声明一个全局变量即可:
  1. Public RibbonUI As IRibbonUI
  2. Dim MyDinner As String
  3. Sub rxAuditMisc_getLabel(ByRef control As IRibbonControl, ByRef ReturnValue As Variant)
  4.     ReturnValue = "Hello: 你好 " & Format(Date, "AAAA yyyy-mm-dd")
  5. End Sub
  6. Sub rxIRibbonUI_onLoad(ribbon As IRibbonUI)
  7.     Set RibbonUI = ribbon
  8. End Sub
  9. Sub 录入dropDown(control As IRibbonControl, id As String, index As Integer)
  10.     Select Case index
  11.         Case 0
  12.             MyDinner = "周一吃虾"
  13.         Case 1
  14.             MyDinner = "周二吃面"
  15.         Case 2
  16.             MyDinner = "周三鱼丸"
  17.         Case 3
  18.             MyDinner = "周四煎饼"
  19.         Case 4
  20.             MyDinner = "周五大餐"
  21.     End Select
  22. End Sub

  23. Sub 确认录入(control As IRibbonControl)
  24.     If MyDinner = "" Then MsgBox "请选择数据": Exit Sub
  25.     MsgBox MyDinner
  26. End Sub
复制代码


TA的精华主题

TA的得分主题

 楼主| 发表于 2016-5-10 13:41 | 显示全部楼层
简简单单,今年我觉得程序和功能要把复杂模型简单化,可操作化,这样客户才会觉得实用。功能区的实现依然采取简简单单的方式,去年提到了“IDTExtensibility2”这个接口,但实际运用中经常会有人出现如下这个提示:
QQ截图20160510133916.jpg
今年我们摒弃这个做法只用“IRibbonExtensibility”这个接口完全可以实现功能区,完整代码如下:
Option Explicit
Implements IRibbonExtensibility
Public xlApp As Excel.Application

Private Sub AddinInstance_OnConnection(ByVal Application As Object, ByValConnectMode As AddInDesignerObjects.ext_ConnectMode, ByVal AddInInst As Object,custom() As Variant)
    Set xlApp = Application '加载时自动运行的代码,这里可以做一些提示,或者弹框,类似workbooks的open事件
    MsgBox "恭喜你,你完成了功能区的实现!"
End Sub

Private Sub AddinInstance_OnDisconnection(ByVal RemoveMode AsAddInDesignerObjects.ext_DisconnectMode, custom() As Variant)
    Set xlApp = Nothing '卸载时自动运行的代码,这里可以做一些提示,或者弹框,类似workbooks的close事件
End Sub
这里我给出一个简单xml示例:
<customUIxmlns="http://schemas.microsoft.com/office/2006/01/customui">
  <ribbon startFromScratch="false">
    <tabs>
      <tab id="myTab" label="少同制作" insertAfterMso="TabHome" >
<group id="Group1" label="你好Group">
<button id="rxMenuButton1" label="你好Button&#13;"imageMso="ViewDisplayInHighContrast" size="large"/>
</group>
</tab>
    </tabs>
  </ribbon>
</customUI>
然后资源管理器里的字符串如下截图:


其中101的代码如下:
<customUIxmlns="http://schemas.microsoft.com/office/2006/01/customui">
  <ribbon startFromScratch="false">
    <tabs>
其中102的代码如下:
      <tab id="myTab" label="少同制作" insertAfterMso="TabHome" >
<group id="Group1" label="你好Group">
<button id="rxMenuButton1" label="你好Button&#13;"imageMso="ViewDisplayInHighContrast" size="large"/>
</group>
</tab>
    </tabs>
  </ribbon>
</customUI>

不需要加任何双引号或者其他字符,只需要拆开xml文件即可,你可以在任意一个地方断开,然后用上面的代码就欧克了,呵呵,到这里有听不懂的了吗?这个非常好用,会者自取以备后用,不会者请还是学习我的第一篇教程再来体会吧~
最后呢我们再加个回调:
Public Sub Hello(ByValcontrol As IRibbonControl)
    MsgBox "我爱编程!"
End Sub
如果你按我这里面的代码实现了加载时弹出一个恭喜你的对话框,那么真的要恭喜你实现了功能区的制作了,OK,到此我们就可以进入下一步了。
温馨提示,在编译dll过程中如果出现权限拒绝如下对话框:

那是因为你的Excel加载了你的dll而你没关闭Excel要去进行一个dll的再生成,就会出现这个对话框。请你关闭你的Excel重新编译即可,那么还有另外一种情况也会弹出这个对话,这个下午再说。
好了,到此我们下一贴就来说说如何简略的制作一个安装程序,大概有几种方案,下一贴见~


TA的精华主题

TA的得分主题

 楼主| 发表于 2016-5-10 13:44 | 显示全部楼层
OK,继续我们的话题,当编译完dll之后还需要注册一下dll才能在Excel里使用,我把这个注册称之为安装,这篇的话题就来说说安装吧。

安装我分三种类型:

1、简单安装(方法稍显粗略)

2、唬人式安装方式(该方法简单易上手,唬人必备,推荐使用)

3、使用安装包制作软件(因为第2种方法已足够我目前使用需求,所以没研究过制作软件,该帖不说了)

  介绍一下第一种安装方法:简单安装(方法稍显粗略)

使用bat批处理文件注册dll,只需记事本新建一个文本文件,比如我编译过后的dll名为Hello.dll,然后在新建的文本文件里写上简单一句话就OK了:
@echo off
regsvr32 /s Hello.dll
echo 安装成功,请重新打开excel
pause
然后将这个文本文件保存为后缀名为bat的批处理文件,并且将这个bat批处理文件与你的dll放置在同一文件夹下即可。卸载也是一样:
@echo off
regsvr32 /u Hello.dll
echo 卸载成功,请重新打开excel
pause
单纯功能区制作的COM加载项还算比较简单的安装,如果是自定义函数的安装用这一句话的bat就不太好用,还需要加点额外的代码,这个等后面制作自定义函数的时候再说~
介绍一下第一种安装方法:唬人式安装方式(该方法简单易上手,唬人必备,推荐使用)
使用YingInstall安装包制作软件(下载地址不发了,自己动手那是丰衣足食),该软件的优势在于傻瓜式制作exe安装包,不用写任何代码,界面比较通俗易懂,因为这个帖子是总结帖,所以exe安装包的制作我不写教程了,一句话:自己研究。
关于此软件有几个地方说明一下:
可制作许可协议
可制作软件使用说明
可制作注册码
可在程序安装完毕之后运行某一物件,笨方法你可以将方法1的bat批处理文件弄在这里也能实现自动加载
比较好用是可以自动注册dll控件,神了吧?不说了,自己研究研究吧~贴一张图调调胃口吧还是
QQ截图20160510134325.jpg
既然YingInstall这个软件你用会了那我想第三种方法说的那些安装包制作软件也不用学了就。
哦也,到此你基本从一开始制作COM加载项到打包部署都搞定了,怎么样?有没有朗朗清风的赶脚捏?学会了第二招,唬人还成问题吗?

TA的精华主题

TA的得分主题

发表于 2016-5-11 20:48 | 显示全部楼层
带劲儿 发表于 2016-5-10 13:44
OK,继续我们的话题,当编译完dll之后还需要注册一下dll才能在Excel里使用,我把这个注册称之为安装,这篇 ...

总结得有点复杂。

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-5-11 21:27 | 显示全部楼层
EH2003 发表于 2016-5-11 20:48
总结得有点复杂。

简单的就不来了,简单的在去年那个帖子里呢,嘿嘿,这个帖就是玩了这么久总结出来的,能用到的人会有用的

TA的精华主题

TA的得分主题

发表于 2016-5-11 21:34 | 显示全部楼层
带劲儿 发表于 2016-5-11 21:27
简单的就不来了,简单的在去年那个帖子里呢,嘿嘿,这个帖就是玩了这么久总结出来的,能用到的人会有用的

其实这两段 可以合并为一段:
其中101的代码如下:
<customUIxmlns="http://schemas.microsoft.com/office/2006/01/customui">
   <ribbon startFromScratch="false">
     <tabs>
其中102的代码如下:
      <tab id="myTab" label="少同制作" insertAfterMso="TabHome" >
<group id="Group1" label="你好Group">
<button id="rxMenuButton1" label="你好Button&#13;"imageMso="ViewDisplayInHighContrast" size="large"/>
</group>
</tab>
     </tabs>
   </ribbon>
</customUI>

TA的精华主题

TA的得分主题

发表于 2016-5-11 21:37 | 显示全部楼层
带劲儿 发表于 2016-5-11 21:27
简单的就不来了,简单的在去年那个帖子里呢,嘿嘿,这个帖就是玩了这么久总结出来的,能用到的人会有用的

这段 代码看起来去里雾的<group id="Group1" label="你好Group">
<button id="rxMenuButton1" label="你好Button&#13;"imageMso="ViewDisplayInHighContrast" size="large"/>
</group>

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-5-11 21:39 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
EH2003 发表于 2016-5-11 21:37
这段 代码看起来去里雾的

这不是xml制作功能区的代码吗,如果这个还不会先看看这个帖子呢
Excel 细品RibbonX(1-59) (转)-ExcelVBA程序开发-ExcelHome技术论坛 - http://club.excelhome.net/thread-898848-1-1.html
这个看完之后就可以了

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-5-11 21:43 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
YingInStall比其他的安装包制作软件好用多了,又简单似乎没人感兴趣呢

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-5-16 21:34 | 显示全部楼层
既然都说到功能区了今天我们玩点不一样的功能区可好?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-24 12:37 , Processed in 0.052868 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表