2010-08-05 17 views
0

J'ai le code VBA suivant dans un module d'un de mes fichiers .xlt:Erreur lors de l'appel fonction VBA à partir du code VSTO

Public Sub SetShapeTop(ByVal shapeName As String, ByVal topValue As Single) 
    ThisWorkbook.ActiveSheet.Shapes(shapeName).Top = topValue 
End Sub 

Dans mon VSTO add-in, j'ai le code C# suivant qui tente d'appeler cette fonction 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); 

cette ligne jette une exception, comme suit:

(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} 

Est-ce que je manque Someth ici? Si quelqu'un peut me diriger dans la bonne direction, je l'apprécierais vraiment ...!

Répondre

0

Ceci est une restriction de sécurité.

Accédez à Trust Center dans Excel et cochez la case Autoriser l'accès au modèle d'objet de projet VBA.

+0

Merci pour le conseil SLaks. Cependant les options sont toutes grisées! (Heureusement, la case à cocher Trust Access to VBA project model est cochée). Cela indique-t-il quelque chose? BTW, c'est un fichier .xlt (Excel 2003) que je cours en 2007. – code4life

+0

Les paramètres sont probablement contrôlés par votre administrateur de domaine. – SLaks

+0

Merci SLaks, va vérifier cela. – code4life

0

Votre code d'appel s'exécute-t-il dans le démarrage de votre VSTO Addin? Si c'est le cas, probablement tout n'a pas encore été chargé. Un moyen (stupide) de contourner ce problème consiste à le faire tourner jusqu'à ce qu'il fonctionne. Désolé le VB.NET, C# mais devrait être similaire

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

Aussi, jetez un oeil à cet article: Extend Your VBA Code With VSTO

Une chose à noter est que ce code échouera si l'accès approprié est non accordé aux macros VBA.

+0

non, ce n'est pas dans le démarrage d'Addin, c'est ailleurs. Je pensais que je définis tous les accès appropriés, mais obtenir cette erreur. – code4life