自动化加载项与COM加载项

我是附加程序的新手,需要以下scheme的帮助:

我有一个C#Excel自动化插件,它调用几个UDF 。 在自动加载项加载期间,我想要进行用户名和密码检查,在加载项加载时,用户可以input其详细信息的屏幕必须popup。 如何使用自动化加载项来完成?

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

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

一般来说,自动化加载项并不是为了处理这种function而devise的。 您可以让您的加载项实现IDTExtensibility2,以获得对运行加载项的“Excel.Application”对象的引用。 从那里,你可以访问“Excel.Application”类的所有事件。 但是,自动化插件通常不是为了处理Excel对象模型事件而devise的,它仅用于支持用户定义的函数(UDF)。

我想在自动加载项加载期间进行用户名和密码检查,用户可以在其中input其详细信息的屏幕必须在加载时popup。如何使用自动加载项来完成此操作?

当您首次加载自动化插件时,请小心尝试采取措施。 自动化加载项是需求加载的,也就是说,只有在Excel需要时才加载。 当用户开始将自动化加载项的第一个用户定义函数(UDF)input到单元格中时,它通常会加载。 问题是,当用户仍在编辑单元格时,尝试执行时大多数编程命令将失败。 因此,如果您在加载项首次加载时尝试执行此类操作,那么加载Excel时处于不允许您的代码安全执行的模式的可能性相当大。 (有关详细信息,请参阅: 自动加载项加载时Excel失败 。

为了解决这个问题,你可以使用一个托pipe的COM加载项来代替,它被devise来处理Excel对象模型事件。 如果需要,您的托pipeCOM加载项甚至可以加载您的自动化加载项; 或者托pipe的COM加载项类和自动化加载项都可以驻留在同一个程序集中,在这种情况下,它们可以直接进行通信。

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

通过订阅“Excel.Application.SheetCalculate”事件来检测F9键何时被触发,任何时候任何工作表都已经完成计算。 在这种情况下,计算可以由于任何原因而被触发,而不仅仅是触碰F9键。 如果您希望专门捕捉F9键,则需要使用仅通过VBA提供的“Application.OnKey”callback。 但是,您可以将项目中的类暴露给COM,并使用从“Application.OnKey”事件中调用的VBA加载项调用它。

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

  • 在.NET中为Excel编写用户定义的函数
  • 在C#中编写自定义Excel工作表函数
  • 在自动化加载项中实现IDTExtensibility2
  • 自动化加载项加载时Excel失败
  • 如何通过Visual Studio安装程序包部署.NET自动化加载项

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

  • 如何使用Visual C#.NET构buildOffice COM加载项
  • 使用Visual C#.NET和Visual Basic .NET构buildMicrosoft Office外接程序

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

  • Excel COM加载项和自动化加载项
  • 构build和部署一个.NET COM程序集

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

  • 一个简单的C#DLL – 我如何从Excel,Access,VBA,VB6中调用它?
  • 如何在VSTO托pipe代码中创buildExcel UDF
  • 从COM组件调用.NET组件

我知道这是很多消化,但希望这可以让你去。 总的来说,我会推荐一个托pipe的COM加载项来处理你的用户界面function。 由托pipe的COM加载项保存的数据可以轻松地与自动化加载项共享,既可以通过使两个加载项引用通用程序集,也可以通过同时拥有托pipe的COM加载项类和自动加载项,在同一个集会内举行。

我希望这有帮助,请问你是否希望我进一步澄清。

迈克

后续回复:

非常感谢链接和指针。 我通过链接,并有一个公平的想法,需要做什么:)

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

如果我正在使用基于COM的插件来处理我的Excel事件,我该如何结合我的UDFfunction?

托pipe的COM加载项不能公开UDF函数。 你仍然需要一个自动化插件。 但是,如果需要,您的托pipe的COM加载项类和您的自动化加载项都可以在同一个程序集中。 因此,您的COM加载项可能会向用户询问您需要的信息,并且在UDF运行时,这些值将可用于自动化加载项。

它们是否会在公式窗格中显示为类似于使用自动插件的常规function?

自动加载项所公开的UDF将自动包含在“插入函数”向导中,并与自动化加载项的名称匹配。 但是,说明不会自动包含为Excel内置函数提供的信息。 默认的function通常很好,但是如果你想为“插入function”向导提供更完整的信息,这本身就是一个复杂的话题。 请参阅: Excel 2007 UDF:如何添加函数描述,参数帮助 。

说我需要调用一个公式getcube返回一个数字的立方体public double getcube(double a){return a * a * a; }

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

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

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

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

为了说明,托pipe的COM加载项和自动化加载项只是已经被做成COM可见并且正确注册的类。 这两个类不能在同一个程序集中存在是没有道理的。 而且,由于听起来您希望您的function同时包含UDF和Excel对象模型事件处理,因此包含受pipe理的COM加载项和自动加载项的单个程序集将使您能够处理所需的所有functionExcel预期的方式。

我知道这是很多消化,但如果你仔细阅读我在这里build议的文章,我认为这是有道理的…

麦克风