7
votes

Valeur de retour d'accès de la fonction VBA dans .NET?

J'ai le code suivant dans VBA (qui réside dans un classeur Excel 2007): xxx

Si j'invoque la multiplication à partir d'un autre code VBA, il renvoie la valeur correcte. Cependant, lorsque j'appelle multiplier de C #: xxx

... La multiplication a lieu (je peux vérifier cela en ajoutant un traçage à la fonction multipliée dans VBA) mais la valeur renvoyée n'est pas disponible dans mon code C #; renvoyé est toujours null .

peut-être que quelqu'un pourrait me dire comment obtenir la valeur de retour de Multiple de mon code C #? < / p>


3 commentaires

J'ai été capable de contourner cela en modifiant multiplier () pour définir la valeur d'une cellule sur la valeur de retour et lire la valeur de cette cellule de C #. Moche mais ça marche.


Une idée de la raison pour laquelle cela fonctionne d'un module mais pas de la feuille?


Aucun que j'ai peur. En fait, je n'ai pas fait de travail significatif sur Microsoft Stuff depuis 2011, cela va probablement aller non-répondre à moins que quelqu'un d'autre puisse aider ...


3 Réponses :


-4
votes

Essayez de modifier votre fonction multiplier pour être comme le code ci-dessous:

Public Function Multiply(a As Double, b As Double) As Double
    return a * b
End Function


3 commentaires

Ce n'est même pas valide VBA. Voir: Office. microsoft.com/en-in/excel-help/...


Vous ne pouvez pas utiliser le mot-clé de retour dans VBA - vous devez définir la valeur de retour sur le nom de la fonction E.G. Multipliez = A * B, qui était dans la question initiale.


Ceci est vb.net, pas VBA.



4
votes

Avez-vous essayé de déplacer votre fonction à un module régulier dans Excel (pas un module de feuille)?


2 commentaires

J'ai créé un nouveau module, déplacé la fonction à cela et j'ai changé "feuille1.Multiphe" sur "myModule.Multiphe". Travaillé parfaitement, merci :-) Une seule question: Était-ce une perspicacité que vous avez acquise par expérience ou est-ce réellement documenté quelque part? Les informations sur MSDN, etc. sont assez clairsemées pour appeler VBA via. Interop.


@Ducanbayne feuille1 est un objet , une instance d'une feuille de calcul classe. Afin de faire appel à des membres d'une classe, vous avez besoin d'une instance - et de l'instance FILLED1 Vit uniquement dans l'exécution VBA, .NET ne le voit pas. Les modules standard sont juste que: les modules procéduraux exposant le code exécutable par les membres du public; Vous n'avez pas besoin (vous ne pouviez quand même pas) instancier pour appeler ses membres. C'est pourquoi cela fonctionne dans module1 et non dans la feuille .



0
votes

Un exemple simple:

Le test tableur.xlsm a module1 contenant: xxx

avec < Code> objexcel Déjà défini sur la feuille de calcul ... xxx

... produit Bonjour 1234 dans le message contextuel.

Parce que j'avais testé à l'origine cela avec ? module1.test () (avec succès) dans la fenêtre immédiate VBA, j'essaie initialement d'obtenir objexcel.run ("module1.test ()") Pour travailler - mais je recevais une erreur: ne peut pas exécuter la macro .... La macro peut ne pas être disponible dans ce classeur ou toutes les macros peuvent être désactivées. - Suppression des supports ont fait le tour. < / p>


0 commentaires