我用VB写了一个excel的add-in.
在add-in设计器的AddinInstance_OnConnection()函数中,我定义了一个叫munAAA的菜单项
Set mnuAAA = mnuA.Controls.Add(Type:=msoControlButton)
With mnuAAA
.Caption = "测试"
.OnAction = "AAA"
End With
然后,我又写了AAA这个函数.
但是,当我在excel中选取这个菜单后,excel报告不能找到AAA这个宏.
为什么呢?
我原来在VBA也是这么写的,没问题啊
我看MSDN上的示例,上面说OnAction是可选的,他直接用mnuAAA_Click()这个事件.我按照他的方法写了,结果运行后没有任何显示.
在add-in设计器的AddinInstance_OnConnection()函数中,我定义了一个叫munAAA的菜单项
Set mnuAAA = mnuA.Controls.Add(Type:=msoControlButton)
With mnuAAA
.Caption = "测试"
.OnAction = "AAA"
End With
然后,我又写了AAA这个函数.
但是,当我在excel中选取这个菜单后,excel报告不能找到AAA这个宏.
为什么呢?
我原来在VBA也是这么写的,没问题啊
我看MSDN上的示例,上面说OnAction是可选的,他直接用mnuAAA_Click()这个事件.我按照他的方法写了,结果运行后没有任何显示.
后来我查了MSDN等文献,发现.OnAction其实是从Excel加载的宏中寻找叫AAA的过程,而我的AAA在DLL本身之中,所以DLL当然找不到了.我看见别人的程序有一个解决办法,就是让.OnAction="mnuAAA_Click()",但是这就要求在声明mnuAAA时采用WithEvents关键字.
而我为了减少对Excel版本的依赖性,所以采用了late binding,因此需要把mnuAAA声明为Object,所以无法使用WithEvents.真愁死我了,
我用.OnAction = "AAA",程序就会跑到VBA宏中找AAA;
我想用.OnAction="mnuAAA_Click()",但是还没法用WithEvents关键字.
帮帮忙吧,已经快拖了两个礼拜了,还没搞定.
http://www.cpearson.com/excel/VbeMenus.aspx
都参考一下
程序总是认为OnAction属性后面那个是一个Macro的名字,然后根据它去找相应的宏,这就没问题了.
但是,我的代码是用VB写并编译成DLL的.因此,我的"AAA"在DLL内部,不是Macro,结果程序就报告"找不到这个宏".上面说的太啰嗦,画个图说明吧:
你给的例子:
代码是用VBA写的-->AAA实际上是.xla文件中的Macro-->程序根据.OnAction属性去找这个Macro-->执行,OK.
但我的情况却是这样:
代码是用VB写的,并且编译成了DLL-->AAA实际上是.DLL文件中的机器代码(不是宏)-->程序根据.OnAction属性在环境中去找这个叫AAA的Macro(程序总是认为OnAction后面总是一个宏)-->当然找不到.
建议还是在机器当前版本的excel下,用withEvents实现你可以这样定义
Public moApp As Object
Public moAppInst As ObjectPublic WithEvents moCBMeow As Office.CommandBarButton'所有版本office的菜单按钮都叫这个名字~
到其他版本上测试,如果有问题,再调试②可以用vb6代码写到excel vba里面去,,,,不过不太现实,因为有个前提:因为你写进去的时候要吧全部语句包装成字符串,调用的过程函数不是很复杂,就几行代码还行,多了会要吐血③就用vba做,包装成xla,注册,同样可以实现你需要的一模一样的功能,但是vba可能会被有意图的人看到源代码
Creating An XLA Add-In For Excelhttp://www.cpearson.com/excel/CreateAddIn.aspx花了大半天时间还是没搞定,不好意思我还会继续跟进的~