在visual studio中,我有一个Excel2010外接程序项目。如何让项目创建以下模块:
我知道我可以将该工作簿与该模块一起保存,然后在我的插件中使用它。如果我可以让我外接程序创建模块,那就太好了……
发布于 2012-12-22 02:00:16
可以创建模块。但是,要执行此操作,必须在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);
发布于 2012-12-21 19:19:12
我不认为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
发布于 2012-12-27 17:18:27
如果您真正想要做的是编写VSTO,或者组合.NET应用级命令和UDFs,那么使用VSTO目前不是一个好的解决方案:
我推荐使用Addin Express (付费)或Excel DNA (免费)。
这两者都允许您创建Excel外接程序和自动化UDF外接程序(XLL外接程序提供了显著的性能优势,但对.NET对象模型的访问略有限制)
https://stackoverflow.com/questions/13956104
复制