probleme objet Excel.application

  • Auteur de la discussion darkspoilt
  • Date de début

darkspoilt

Expert
Bonjour mon probleme est simple j'aimerais renvoyer kom valeur mon Objet Excel.Application

je renvoie mon objet excel.application

[cpp]Public Function MacroTest(c As Integer)Déclarations des variables
Public xls As Excel.Application
Set xls = New Excel.Application
...
MacroTest = xls
Dim name As String[/cpp]

et lorsque je fais le code suivant, dans une formulaire

[cpp]Module2.Macro1(Module1.MacroTest)[/cpp]

il me donne une erreur de type alors je ne comprends pas pourquoi
mon de macro1
est
[cpp]public function Macro1(xls As Excel.Application)
...
End function[/cpp]


En gros je demande comment passer le meme objet xls de mon module 1 a mon module 2
Merci d'avance
 

Freeman23

Expert
Déjà banni la déclaration publique dans une fonction tu met Dim et c'est tout.
Ensuite une fonction doit renvoyer qqch. Le VBA c'est pas du C...

Code:
Public function Macro1(<Paramètre in>) as <paramètre out>
 

zeb

Modérateur
Code:
Public Function MacroTest(c As Integer)Déclarations des variables
N'importe quoi !

Code:
public function Macro1(xls As Excel.Application)
Où est le type de retour de la fonction ?

Ligne 5, manque le Set !

GRILLED :)
 

darkspoilt

Expert
[cpp]Public Function MacroTest(c As Integer) As Excel.application
Public xls As Excel.Application
Set xls = New Excel.Application
...
Set MacroTest = xls
Dim name As String[/cpp]

meme comme cela il me met une erreur d'incompatibilité de type
avec Module2.Macro1

[cpp]public Sub Macro1(xls As Excel.application)[/cpp]
pour l'instant il renvoi rien

Il me met toujorus incompatibilité de type en montrant [cpp]Module2.Macro1(xls)[/cpp]
 

zeb

Modérateur
La variable xls est détruite à la sortie de la fonction MacroTest et l'instance EXCEL qui va avec.
 

Freeman23

Expert
Tu ne fais que déclarer l'objet Excel.application

Tu pourrais très bien faire
Code:
Dim xls as new Excel.application
Sauf que cela ne créé rien donc tu renvoie nothing. Pour t'en assurer rajoute ceci à la ligne 4
Code:
if xls is nothing then msgbox "je renvoie du vide"
 

darkspoilt

Expert
oui mais je le rempli ensuite et je fais des manipulation sur un classeur excel et ta pas d'apparition de msgbox
 

Freeman23

Expert
Autant pour moi mais ce que je veux dire c'est que tu n'as pas créé le process qui va avec.
Dans tous les cas la variable xls n'existe plus comme la dit Zeb, d'ou ma remarque sur le public dans la fonction.
 

Freeman23

Expert
Ben soit tu récupère le résultat de la variable dans une autre fonction soit tu la gère public de module ou encore via une classe d'objet.

La première étant la plus logique tu devrais faire.
Code:
Public Function MacroTest(c As Integer) As Excel.application
   Dim xls As Excel.Application
   Set xls = New Excel.Application
   '...
   Set MacroTest = xls
end function 

Public sub MacroPrincipal
   Dim monappli as excel.application

   set monappli = MacroTest(1)
end sub
C'est comme cela qu'on gère le passage de paramètre.
 

darkspoilt

Expert
Je l'avais essayé ayssi
avec après Module2.Macro1(monappli) j'avais essayé la chose mais j'ai la meme erreur
Sinon j'ai vu qu'il existé des ByRef, vu que c'est comme des pointeurs en C mais je vois pas comment et surtout ou le mettre.
 

Freeman23

Expert
MacroPrincipal est ton programme principal, c'est sur que tu peux faire 200 fonctions pareilles sans que tu y arrives de cette facon... MonAppli n'existe que dans la fonction.
C'était une exemple tu peux pas mettre en paramètre une variable de sortie dans macro1 comme tu l'a fait.

Sinon tu dois l'appeler comme ca :

Code:
Macro1(MacroTest(c))
Et encore j'ai un doute

Mais surtout j'en vois pas l'interet...

T'as Macro1 doit appeler ta MacroTest et récupérer le résultat dans une variable. Macro1 dans mon cas c'était MacroPrincipal.
 

darkspoilt

Expert
L'interet est que je fais de l'automation et le truc c'est selon des condition il fera certaines action et des fois non voila pourquoi je fais ca mais en gros
Mon programme principal exécute MacroTest sui renvoie un objet Excel.Application et que je réutilise dans Macro1 selon les condition c'est ca que je veux faire car je ne fais que de l'automation
Et de plus le nombre de ligne est limité donc il me faut continuer en changeant de module
 

Freeman23

Expert
Tu peux créér une procedure par module si tu veux, ou bien toute dans un seul il n'y a pas de problème si tu les déclare public elles seront visibles partout.

Je vois pas de quelle limite tu parles.
 

darkspoilt

Expert
bah une fois j'ai entréer trop de ligne dans mon code bah visual basic editore ne veut pas exécuter le programme
mais justement ma procédure est par module c'est pour ce que mon probleme existe mon objet Excel ne veut pas etre envoyer pour etre transmis
 

darkspoilt

Expert
Bon je reussi a récupérer mon objet Excel.Application
je sais que je le fait bien car je fais une manipulation dessus sur le programme principâl
[cpp] Set appli = Module1.MacroTest(c)
appli.Sheet(1).Range("A57").Select
Module2.Macro1 (appli)[/cpp]

mais il me met qu'il y a une erreur de type à la linge 3

voila la structure Module2.Macro1

[cpp]Sub Macro1(xls As Excel.Application)
xls.Sheet(1).Range("B58").Select 'C'est un exemple pour vérifier si on controle la bonne fenetre
...
End Sub[/cpp]
 

zeb

Modérateur
Ligne 3: Macro1 est une procédure, Sub, donc vire les parenthèses.

Ce que tu peux faire aussi pendant les test, c'est :
[fixed]appli.Visible = True[/fixed]

Ton histoire de mettre une macro par module me paraît ridicule. (Parce que je n'ai pas trop compris ton explication non plus [:spamafote])
 

Freeman23

Expert
Il n'y a pas besoin de préciser les modules. Par contre tu dois mettre Public avant sub pour les déclarer public. (c'est peut etre par défaut...)

A la ligne 3 tu n'a pas besoin de parenthèse. Comprenez que les procedures ou actions n'ont pas besoin de parenthèse en VBA.

Si en virant les parenthèses, ca ne marche pas, essaie de déclarer xls dans Macro1 en tant qu'Object.

Par contre combien de ligne de code en tout, car ta limite ca me parait très suspect pour avoir fais des modules de plusieur millier de ligne je n'ai jamais eu ce problème.
 

zeb

Modérateur
Ben dis donc darkspoilt, tu as Freeman+Zeb qui sont d'accord et en même temps :)
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 158
Messages
6 718 522
Membres
1 586 444
Dernier membre
ubik13
Partager cette page
Haut