FORUM Tom's Hardware » Programmation » VB / VBA / VBS » probleme objet Excel.application
 

probleme objet Excel.application

Il y a 384 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici
Ajouter une réponse



 Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet : probleme objet Excel.application
 
Plus d'informations

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

je renvoie mon objet excel.application

Code :
  1. Public Function MacroTest(c As Integer)Déclarations des variables
  2. Public xls As Excel.Application
  3. Set xls = New Excel.Application
  4. ...
  5. MacroTest = xls
  6. Dim name As String



et lorsque je fais le code suivant, dans une formulaire

Code :
  1. Module2.Macro1(Module1.MacroTest)



il me donne une erreur de type alors je ne comprends pas pourquoi
mon de macro1
est

Code :
  1. public function Macro1(xls As Excel.Application)
  2. ...
  3. End function




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

Plus d'informations

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 :
  1. Public function Macro1(<Paramètre in> ) as <paramètre out>


---------------
S'il n'y a pas de solution c'est qu'il n'y pas de problème
zeb
Profil : Modérateur libre
Plus d'informations

Code :
  1. Public Function MacroTest(c As Integer)Déclarations des variables


N'importe quoi !

 
Code :
  1. public function Macro1(xls As Excel.Application)


Où est le type de retour de la fonction ?

 

Ligne 5, manque le Set !

 

GRILLED :)


Message édité par zeb le 14-06-2007 à 10:48:22

---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
Plus d'informations

Code :
  1. Public Function MacroTest(c As Integer) As Excel.application
  2. Public xls As Excel.Application
  3. Set xls = New Excel.Application
  4. ...
  5. Set MacroTest = xls
  6. Dim name As String



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

Code :
  1. public Sub Macro1(xls As Excel.application)


pour l'instant il renvoi rien

Il me met toujorus incompatibilité de type en montrant

Code :
  1. Module2.Macro1(xls)


Message édité par darkspoilt le 14-06-2007 à 11:07:45
zeb
Profil : Modérateur libre
Plus d'informations

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


---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
Plus d'informations

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

Tu pourrais très bien faire

Code :
  1. 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 :
  1. if xls is nothing then msgbox "je renvoie du vide"


---------------
S'il n'y a pas de solution c'est qu'il n'y pas de problème
zeb
Profil : Modérateur libre
Plus d'informations

Faux Freeman,
Ligne 3, l'instance Excel est bien créée.


---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
Plus d'informations

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

Plus d'informations

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.


---------------
S'il n'y a pas de solution c'est qu'il n'y pas de problème
Plus d'informations

comment je peux faire pour qu'elle existe encore alors??

Plus d'informations

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 :
  1. Public Function MacroTest(c As Integer) As Excel.application
  2.   Dim xls As Excel.Application
  3.   Set xls = New Excel.Application
  4.   '...
  5.   Set MacroTest = xls
  6. end function
  7. Public sub MacroPrincipal
  8.   Dim monappli as excel.application
  9.   set monappli = MacroTest(1)
  10. end sub


C'est comme cela qu'on gère le passage de paramètre.


---------------
S'il n'y a pas de solution c'est qu'il n'y pas de problème
Plus d'informations

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.

Plus d'informations

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 :
  1. 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.


---------------
S'il n'y a pas de solution c'est qu'il n'y pas de problème
Plus d'informations

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

Plus d'informations

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.


Message édité par Freeman23 le 14-06-2007 à 11:58:03

---------------
S'il n'y a pas de solution c'est qu'il n'y pas de problème
Plus d'informations

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

Plus d'informations

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

Code :
  1. Set appli = Module1.MacroTest(c)
  2.     appli.Sheet(1).Range("A57" ).Select
  3.     Module2.Macro1 (appli)



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

voila la structure Module2.Macro1

Code :
  1. Sub Macro1(xls As Excel.Application)
  2. xls.Sheet(1).Range("B58" ).Select 'C'est un exemple pour vérifier si on controle la bonne fenetre
  3. ...
  4. End Sub


Message édité par darkspoilt le 14-06-2007 à 13:28:26
zeb
Profil : Modérateur libre
Plus d'informations

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

Ce que tu peux faire aussi pendant les test, c'est :

appli.Visible = True



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])


---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
Plus d'informations

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.


---------------
S'il n'y a pas de solution c'est qu'il n'y pas de problème
zeb
Profil : Modérateur libre
Plus d'informations

Ben dis donc darkspoilt, tu as Freeman+Zeb qui sont d'accord et en même temps :)


---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
Plus d'informations

Tu vas devoir nous payer l'apéro :D


---------------
S'il n'y a pas de solution c'est qu'il n'y pas de problème
Plus d'informations