代码之家  ›  专栏  ›  技术社区  ›  code4life

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

  •  0
  • code4life  · 技术社区  · 15 年前

    我的一个.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} 
    

    我是不是漏了什么?如果有人能给我指出正确的方向,我真的很感激。。。!

    2 回复  |  直到 7 年前
        1
  •  1
  •   SLaks    15 年前

    转到Excel中的信任中心并选中对VBA项目对象模型的信任访问。

        2
  •  0
  •   Todd Main    15 年前

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

    Dim hasRun As Integer
    Do 
        hasRun = Me.Application.Run("SetShapeTop", kv.Key, kv.Value)
    Until hasRun > 0
    

    另外,请看这篇文章: Extend Your VBA Code With VSTO

    如果适当的访问失败