【问题标题】:Add user defined function to Visual Studio Excel Add-in将用户定义的函数添加到 Visual Studio Excel 加载项
【发布时间】:2012-12-07 00:35:38
【问题描述】:

在 Visual Studio 中,我有一个 Excel 2010 插件项目。我怎样才能让该项目创建以下模块:

我知道我可以使用该模块保存该工作簿,然后将其与我的插件一起使用。如果我可以让我的插件创建该模块,那就太好了...

【问题讨论】:

  • 也许this 可能会有所帮助。
  • Nooooo! 走这条路之前要三思。我敦促您使用 UDF 方法,因此您的代码逻辑是 a) 防止 Excel 用户更改关键逻辑 难以检测到 b) 在一个加载项中且不会跨多个工作簿重复 c)不需要受信任的权限 d) 可单元测试 e) 用最新的语言编写等

标签: c# excel user-defined-functions excel-addins


【解决方案1】:

可以创建模块。但是,要使其正常工作,必须在 Excel 中选择“信任对 VB 项目模型的访问”的设置。如果未选择信任设置,则会引发拒绝访问的错误。

using Excel = Microsoft.Office.Interop.Excel;
using VB = Microsoft.Vbe.Interop;

Excel.Application eApp = new Excel.Application();

eApp.Visible = true;
Excel.Workbook eBook = eApp.Workbooks.Add();

VB.VBProject eVBProj = (VB.VBProject)eBook.VBProject;
VB._VBComponent vbModule = eVBProj.VBE.ActiveVBProject.VBComponents.Add(VB.vbext_ComponentType.vbext_ct_StdModule);

String functionText = "Function MyTest()\n";
      functionText += "MsgBox \"Hello World\"\n";
      functionText += "End Function";

vbModule.CodeModule.AddFromString(functionText);

【讨论】:

    【解决方案2】:

    我不认为 VSTO 支持 Excel UDF,一般建议是使用自动化插件(如 Sid 的链接所示)。

    另一个选项是从 VBA 调用托管 VSTO 函数。再次强调,不建议这样做,但可以这样做。

    (来自链接的教程回顾) 这是从 VBA 调用托管函数的任何简单方法。

    用你在 VSTO 中的函数创建一个类

    <System.Runtime.InteropServices.ComVisible(True)> _
    Public Class MyManagedFunctions
        Public Function GetNumber() As Integer
            Return 42
        End Function
    End Class
    

    在 VSTO 中将您的课程连接到 VBA

    Private Sub ThisWorkbook_Open() Handles Me.Open
        Me.Application.Run("RegisterCallback", New MyManagedFunctions)
    End Sub
    

    为托管代码创建 Hook 并为 VBA 中的函数创建一个包装器

    在电子表格或文档的 VBA 模块中

    Dim managedObject As Object
    
    Public Sub RegisterCallback(callback As Object)
        Set managedObject = callback
    End Sub
    
    Public Function GetNumberFromVSTO() As Integer
        GetNumberFromVSTO = managedObject.GetNumber()
    End Function
    

    现在您可以在单元格中输入 =GetNumberFromVSTO(),当 excel 启动时,单元格的值应该是 42。

    http://blogs.msdn.com/b/pstubbs/archive/2004/12/31/344964.aspx

    【讨论】:

    • 这就是我现在所拥有的。如果我可以发布插件而不必发布启用宏的工作簿(book1.xlsx)那就太好了 所以我想这是不可能的吧?
    【解决方案3】:

    如果您真正想做的是编写 .NET UDF,或组合 .NET 应用程序级命令和 UDF 插件,那么使用 VSTO 目前不是一个好的解决方案:
    我建议使用 Addin Express (成本)或Excel DNA(免费)。
    这两种方法都允许您创建 .NET XLL UDF 插件和自动化 UDF 插件(XLL UDF 插件提供显着的性能优势,但对 Excel 对象模型的访问稍有限制)

    【讨论】:

      【解决方案4】:

      VSTO 插件无法创建 UDF,因此您需要为函数创建单独的插件。尽管此插件可以与 VSTO 插件在同一个 DLL 中,但您无法在 VSTO 和 UDF 之间进行通信而无需特殊技巧。

      我有一个关于这个的blog post。它为您提供了一个完整的示例项目,其中包括 VSTO 和 UDF。

      这是 UDF 本身的基本结构。

      [Guid("3B81B6B7-3AF9-454F-AADF-FAF06E5A98F2")]
      [InterfaceType(ComInterfaceType.InterfaceIsDual)]
      [ComVisible(true)]
      public interface IFunctions
      {
          int MYINT();
      }
      
      [Guid("F58C591D-A22F-49AD-BC21-A086097DC26B")]
      [ClassInterface(ClassInterfaceType.None)]
      [ComVisible(true)]
      public class Functions : IFunctions 
      {
          public int MYINT()
          {
              return 42;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2021-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-09
        • 1970-01-01
        相关资源
        最近更新 更多