自动化加载项与COM加载项

San*_*ndy 13 c# excel events automation add-in

我是一个附加编程的新手,需要以下方案的帮助:

我有一个C#Excel自动化加载项,可以调用几个UDF.我希望在自动化加载项加载时进行用户名和密码检查,用户可以在其中输入用户可以输入其详细信息的屏幕时加载加载项.如何使用自动化插件完成?

如何使用自动化插件一般完成事件处理?我想在用户按下F9计算某些单元格中的UDF公式时进行一些计算.

是否有任何文章解释自动化插件中的事件处理?

Mik*_*lum 28

通常,自动化加载项不是为处理这种功能而设计的.您可以使用加载项实现IDTExtensibility2来获取对运行加载项的"Excel.Application"对象的引用.从那里,您可以访问"Excel.Application"类的所有事件.但是,自动化加载项通常不是为处理Excel对象模型事件而设计的 - 它仅用于支持用户定义的函数(UDF).

我想在自动化插件加载时进行用户名和密码检查,用户可以输入其详细信息的屏幕必须在加载时弹出.如何使用自动插件完成?

当您的自动化加载项首次加载时,请注意尝试执行操作.自动化加载项是需求加载的,这意味着在Excel需要它之前不会加载它.当用户开始将自动化加载项的第一个用户定义函数(UDF)输入单元格时,通常会加载它.问题是,当用户仍在编辑单元格时,大多数编程命令在尝试执行时将失败.因此,如果您在加载项首次加载时尝试执行此类操作,则在Excel处于不允许您的代码安全执行的模式下,很有可能会加载它.(有关详细信息,请参阅:自动化加载项加载时Excel失败.)

要解决此问题,您可以使用托管COM加载项,该加载项旨在处理Excel对象模型事件.如果您愿意,您的托管COM加载项甚至可以加载您的自动化加载项; 或托管的COM加载项类和自动化加载项类都可以驻留在同一个程序集中,在这种情况下,它们可以直接通信.

如何使用自动化插件一般完成事件处理?当用户按F9计算某些单元格中的udf公式时,我想要进行一些计算.

检测F9键何时被击中可以通过订阅'Excel.Application.SheetCalculate'事件来完成,该事件将在任何工作表完成计算时触发.在这种情况下,可以出于任何原因触发计算 - 而不仅仅是按下F9键.如果你想特别捕获F9键,那么你需要使用'Application.OnKey'回调,它只能通过VBA获得.但是,您可以将项目中的类公开给COM,并从VBA加载项调用它,该加载项从"Application.OnKey"事件中调用.

有关自动化加载项的文章,请参阅:

有关托管COM加载项的文章,请参阅:

有关COM加载项和自动化加载项的文章,请参阅:

有关讨论使用调用托管应用程序的VBA加载项的文章,请参阅:

我知道这需要消化很多,但希望这可以帮助你.总的来说,我建议使用托管COM加载项来处理用户界面功能.托管COM加载项保存的数据可以轻松地与自动化加载项共享,既可以通过加载项引用公共程序集,也可以同时使托管COM加载项类和自动化加载项 - 在同一集会内举行的班级.

我希望这会有所帮助,请问您是否希望我进一步澄清任何内容.

- 迈克

后续答复:

非常感谢链接和指针.我浏览了这些链接,并对需要完成的工作有了充分的了解.:)

很高兴它有所帮助.:)这是很多阅读,我建议你打印出来并全部阅读.你正在寻找一些相当先进的东西,所以你对这个话题的了解越多,你就会越好.

如果我使用基于COM的插件来处理我的excel事件,我如何合并我的UDF函数?

托管COM加载项无法公开UDF函数.您仍然需要一个自动加载项.但是,如果需要,您的托管COM加载项类和自动化加载项类都可以位于同一个程序集中.因此,您的COM加载项可以向用户询问您所需的信息,并且当运行其中的UDF时,这些值可供自动化加载项使用.

它们是否会在公式窗格中作为常规函数公开,类似于使用自动化插件的情况?

自动化加载项公开的UDF将自动包含在"插入函数"向导中,位于与自动化加载项名称匹配的类别下.但是,该描述不会自动包含为Excel内置函数提供的信息.默认功能通常很好,但如果您希望为"插入函数"向导提供更完整的信息,这本身就是一个复杂的主题.请参阅:Excel 2007 UDF:如何添加函数描述,参数帮助.

假设我需要调用一个公式getcube,它返回一个公共双重getcube(double a){return a*a*a; }

当我的插件使用定义我的UDF的自定义接口和IDTExtensibility2时,我该如何处理这种情况?你能用一个例子解释这个案子吗?

到目前为止,我认为没有必要根据您在此处显示的内容实现IDTExtensibility2,您只需要一个标准的自动化插件.对于标准自动化加载项,您应该阅读在.NET中编写Excel 用户定义函数在C#中编写自定义Excel工作表函数.有关如何为托管COM加载项实现IDTExtensibility2的讨论,请参阅在自动化加载项中实现IDTExtensibility2.

有没有办法在自动化插件上实现IDTExtensibility2以访问Excel.Application对象,还是应该为它创建一个单独的COM插件?

您绝对可以直接在自动化加载项中实现IDTExtensibility2,无需为此创建托管COM加载项.再次,请参阅在自动化加载项中实现IDTExtensibility2.但是,您希望实现的是对Excel对象模型使用事件处理.虽然这可以使用自动化插件来完成,但它是非标准的,并不是自动化插件旨在执行的任务.特别是,您希望在首次加载自动化加载项时获得用户输入信息; 这可能是一个特别棘手的情况,这就是为什么我建议您为此任务使用托管COM加载项.有关此内容的更多信息,请参阅自动化加载项加载时Excel失败.

为了澄清,托管COM加载项和自动化加载项只是已经COM可见并且已正确注册的类.没有理由为什么这两个类不能存在于同一个程序集中.而且,由于您希望您的功能包括UDF和Excel对象模型事件处理,因此包含托管COM加载项和自动化加载项的单个程序集将使您能够处理所需的所有功能Excel期望的方式.

我知道这需要消化很多,但如果你仔细阅读我在这里建议的文章,我认为它会有意义......

麦克风