C# 从VSTO代码调用VBA函数时出错

C# 从VSTO代码调用VBA函数时出错,c#,excel,vsto,excel-2007,vba,C#,Excel,Vsto,Excel 2007,Vba,我的一个.xlt文件的模块中有以下VBA代码: Public Sub SetShapeTop(ByVal shapeName As String, ByVal topValue As Single) ThisWorkbook.ActiveSheet.Shapes(shapeName).Top = topValue End Sub 在我的VSTO加载项中,我有以下C#代码试图调用该VBA函数: m_worksheet.Application.Run("SetShapeTop", kv.Key

我的一个.xlt文件的模块中有以下VBA代码:

Public Sub SetShapeTop(ByVal shapeName As String, ByVal topValue As Single)
  ThisWorkbook.ActiveSheet.Shapes(shapeName).Top = topValue
End Sub
在我的VSTO加载项中,我有以下C#代码试图调用该VBA函数:

m_worksheet.Application.Run("SetShapeTop", kv.Key, kv.Value, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
  Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
  Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
  Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
该行抛出一个异常,如下所示:

(Excerpt from my log4net logs)

[Exception: COMException]
{Target: Cluster Report}
{Invoked Method: Macro execution}
{Target Method: Cluster Report}
{Parameters: }
{Message: Cannot run the macro 'SetShapeTop'. The macro may not be available in this workbook or all macros may be disabled.}
{Stack trace: 
Server stack trace: 


Exception rethrown at [0]: 
  at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
  at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
  at Microsoft.Office.Interop.Excel._Application.Run(Object Macro, Object Arg1, Object Arg2, Object Arg3, Object Arg4, Object Arg5, Object Arg6, Object Arg7, Object Arg8, Object Arg9, Object Arg10, Object Arg11, Object Arg12, Object Arg13, Object Arg14, Object Arg15, Object Arg16, Object Arg17, Object Arg18, Object Arg19, Object Arg20, Object Arg21, Object Arg22, Object Arg23, Object Arg24, Object Arg25, Object Arg26, Object Arg27, Object Arg28, Object Arg29, Object Arg30)
  at MSA.Excel.ClusterPresenter.RenderReport(IReportData reportData, IResponseReportParameters reportParams, Worksheet worksheet) in C:\workspace\MSABasketlink\2.0\MSA.Library.UI\Presentation\ClusterPresenter.cs:line 647} 

我是不是遗漏了什么?如果有人能给我指出正确的方向,我将非常感激

这是一个安全限制


转到Excel中的信任中心,检查对VBA项目对象模型的信任访问。

您的调用代码是否在VSTO加载项的启动中运行?如果是这样,可能还没有加载所有内容。解决这个问题的一个(愚蠢的)方法就是运行它,直到它工作为止。对不起,VB.NET,但C#应该是类似的

Dim hasRun As Integer
Do 
    hasRun = Me.Application.Run("SetShapeTop", kv.Key, kv.Value)
Until hasRun > 0
另外,请看这篇文章:

需要注意的一点是,此代码 如果选择了适当的访问权限,则将失败 未授予VBA宏


谢谢你的小费。但是,这些选项都是灰色的!(幸运的是选中了信任访问VBA项目模型复选框)。这说明了什么吗?顺便说一句,这是一个.xlt文件(Excel 2003),我在2007年运行。设置可能由您的域管理员控制。感谢SLaks,我将对此进行检查。不,它不在加载项的启动中,它在其他地方。我以为我设置了所有适当的访问权限,但是得到了这个错误。