Ton*_*Nam 12 c# excel user-defined-functions excel-addins
在visual studio中,我有一个Excel 2010加载项目.如何让该项目创建以下模块:

我知道我可以使用该模块保存该工作簿,然后将其与我的添加一起使用.如果我可以让我的插件创建该模块,这将是很好的...
Sor*_*eri 10
可以创建模块.但是,要使其工作,必须在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);
Run Code Online (Sandbox Code Playgroud)
我不认为 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
Run Code Online (Sandbox Code Playgroud)
将您的类连接到 VSTO 中的 VBA
Private Sub ThisWorkbook_Open() Handles Me.Open
Me.Application.Run("RegisterCallback", New MyManagedFunctions)
End Sub
Run Code Online (Sandbox Code Playgroud)
为托管代码创建 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
Run Code Online (Sandbox Code Playgroud)
现在您可以在单元格中输入 =GetNumberFromVSTO(),当 Excel 启动时,单元格值应为 42。
http://blogs.msdn.com/b/pstubbs/archive/2004/12/31/344964.aspx