我用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()这个事件.我按照他的方法写了,结果运行后没有任何显示.

解决方案 »

  1.   

    为什么不把AAA这个宏代码编进addin?
      

  2.   

    找不到AAA是因为在addin instance 里面真的是找不到AAA这个函数的宏AAA在其宿主excel里面,楼主可以试着指出AAA的全路径试一试语法我也得去查,~ 所以,楼主也自己去查查~
      

  3.   

    我可能没说清楚我的"AAA"过程就是在DLL程序中.
    后来我查了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关键字.
    帮帮忙吧,已经快拖了两个礼拜了,还没搞定.
      

  4.   

    http://www.fontstuff.com/VBA/vbatut03.htm
    http://www.cpearson.com/excel/VbeMenus.aspx
    都参考一下
      

  5.   

    谢谢了~不过,那两个网页都是介绍如何在VBA中写Add-in.
    程序总是认为OnAction属性后面那个是一个Macro的名字,然后根据它去找相应的宏,这就没问题了.
    但是,我的代码是用VB写并编译成DLL的.因此,我的"AAA"在DLL内部,不是Macro,结果程序就报告"找不到这个宏".上面说的太啰嗦,画个图说明吧:
    你给的例子:
    代码是用VBA写的-->AAA实际上是.xla文件中的Macro-->程序根据.OnAction属性去找这个Macro-->执行,OK.
    但我的情况却是这样:
    代码是用VB写的,并且编译成了DLL-->AAA实际上是.DLL文件中的机器代码(不是宏)-->程序根据.OnAction属性在环境中去找这个叫AAA的Macro(程序总是认为OnAction后面总是一个宏)-->当然找不到.
        
        
      

  6.   

    那么,楼主你先实现了当前excel版本下的,其他版本的容后再说,总有办法的~
      

  7.   

    楼主,你发到我邮箱的附件收到了不好意思,没有解决onAction调用addin内部过程函数http://social.msdn.microsoft.com/forums/en-US/vsto/thread/67649532-35b7-4a7b-a570-e63800584e30有这么一句the OnAction property can only refer to public Subs in a valid VBA project embedded in an Excel workbook file. For anything else, you need to use the Click event.①
    建议还是在机器当前版本的excel下,用withEvents实现你可以这样定义
    Public moApp As Object 
    Public moAppInst As ObjectPublic WithEvents moCBMeow As Office.CommandBarButton'所有版本office的菜单按钮都叫这个名字~
    到其他版本上测试,如果有问题,再调试②可以用vb6代码写到excel vba里面去,,,,不过不太现实,因为有个前提:因为你写进去的时候要吧全部语句包装成字符串,调用的过程函数不是很复杂,就几行代码还行,多了会要吐血③就用vba做,包装成xla,注册,同样可以实现你需要的一模一样的功能,但是vba可能会被有意图的人看到源代码
      

  8.   

    再给你一些资料~
    Creating An XLA Add-In For Excelhttp://www.cpearson.com/excel/CreateAddIn.aspx花了大半天时间还是没搞定,不好意思我还会继续跟进的~
      

  9.   

    我也遇到过这个问题,比较难办啊,把MSDN翻遍了也没个说明,只能调用宏
      

  10.   

    遇到同样问题,我用了WithEvents但是用起来有问题,不知道哪里没有处理好,总是重复调用EXCEL宿主,在网上弄的一段代码也一样<a href="http://hi.baidu.com/szrensd/blog/item/0cd954e7bcc7a528b9382036.html">http://hi.baidu.com/szrensd/blog/item/0cd954e7bcc7a528b9382036.html</a>老被禁用
      

  11.   

    不能将菜单SUB过程和调用的SUB过程放在在Excel对象中,放在模块中就可以用OnAction调用Sub了!同时,补充一下,如果让菜单SUB过程打开Excel直接运行,Open代码反而不能放在模块中,要放入Excel对象中。具体Excel对象,模块,类模块自己继续研究。:)