Forum des développeurs  

Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé.
Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Microsoft Office > Excel > VBA Excel

Réponse
 
Outils de la discussion
Vieux 10/10/2008, 16h16   #1 (permalink)
Membre à l'essai
 
Date d'inscription: septembre 2008
Âge: 22
Messages: 40
Par défaut Problème de variables dans un module

Bonjour,

J'aimerai utiliser une fonction dans un module.
Cette fonction fait plus de 300 lignes et je devrais l'appeler plusieurs fois dans une feuille de mon program principal.

Lorsque cette fonction est dans la feuille du programme principal, tout se deroule bien.
Mais lorsque je la copie colle dans le module et que je l'appelle dans le programme principal, j'ai une erreur de type '1004' (application-defined or object-defined error)

Dans cette fonction que je veux mettre dans le module, je recupere des variables du programme principale.
Je presume qu'il faut faire quelquechose pour que ces variables soient compatibles dans le module et le programme principal.
Mais je ne sait pas ce quoi faire.

Pouvez-vous m'aidez merci.
"Rone" est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 10/10/2008, 16h31   #2 (permalink)
Modératrice
 
Avatar de zazaraignée
 
Date d'inscription: février 2004
Localisation: Rimouski
Messages: 3 067
Par défaut

Lors de l'appel de la procédure en question, tu dois spécifier le nom du module. Si la procédure est déclarée Private, ça ne marchera pas. Il faut qu'elle soit Public (par défaut si non spécifié). Exemple d'appel:

Code :
Module1.maProcedure [etSesArguments]
[edit]
après vérification, il n'est pas nécessaire de spécifier le nom du module où se trouve la procédure. Mais celle-ci doit être publique.

Par contre, pour appeler depuis un module une procédure se trouvant dans un UserForm, il faut non seulement que celle-ci soit Publique, mais il faut aussi spécifier le nom du UserForm.
__________________
  • Pour les nouveaux : Mode d'emploi et aide aux nouveaux
  • et impérativement les règles du forum. Histoire de garder une ambiance amicale.
  • Noubliez pas les balises de Code pour vos listings : bouton # de l'éditeur. Et n'oubliez pas non plus de bouton
  • Je ne réponds pas aux questions posées par MP.
zazaraignée est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 10/10/2008, 16h33   #3 (permalink)
Rédacteur/Modérateur
 
Avatar de Pierre Fauconnier
 
Date d'inscription: novembre 2003
Localisation: Theux (Belgique)
Âge: 41
Messages: 3 112
Envoyer un message via Skype™ à Pierre Fauconnier
Par défaut

Bonjour

Je ne comprends pas bien les termes programme principal, feuille du programme principal et je la copie colle dans le module.

Normalement, les fonctions et procédures "générales" (non attachées à un objet particulier) sont placées dans un module standard (Insertion/module). En les plaçant là, on les met, par défaut, à disposition de tout le code de l'ensemble du projet.

Si ta fonction a besoin de variables pour être utilisée, tu as trois solutions:
1. Passer les paramètres désirés à la fonction lorsque tu l'appelles
2. Rendre toutes tes variables publiques en les déclarant dans un module standard, avant toute procédure ou fonction (Pas très conseillé)
3. Faire un mix des deux (encore plus déconseillé)

Si tu choisis l'option 2, tu auras peut-être besoin d'utiliser dans ta fonction des variables attachées à des objets précis (feuille, classeur, dans une moindre mesure Userform), tu devras alors préfixer ta variable du nom de l'objet dont elle est une propriété.

Pourquoi choisir l'option 1, puisque je ne conseille pas les autres? Parce que c'est ce qui va t'amener à écrire une fonction propre, et surtout portable (réutilisable ailleurs)

Tu pourras utilement lire le chapitre III-C de ce tutoriel de Morgane. Il concerne Outlook mais est transposable sur Excel
J'espère t'avoir aidé
__________________
Pierre Fauconnier
--------------------
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
Pensez au tag

Mon blog sur DVP - Mes petits papiers sur DVP
Je ne peux en aucun cas être tenu pour responsable des conséquences de l'utilisation des codes que je fournis dans le cadre des réponses apportées sur les forums, même s'il s'avérait que ces codes sont erronés ou amènent à des dysfonctionnements, de manière manifeste ou non.

Dernière modification par Pierre Fauconnier ; 10/10/2008 à 16h44
Pierre Fauconnier est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 10/10/2008, 16h41   #4 (permalink)
Modératrice
 
Avatar de zazaraignée
 
Date d'inscription: février 2004
Localisation: Rimouski
Messages: 3 067
Par défaut

Le temps que je modifie mon message, Pierre a eu le temps de donner une explication complète... Je deviens lente... ça veut dire qu'il est temps que je quitte. Allez! À demain tout l'monde!
__________________
  • Pour les nouveaux : Mode d'emploi et aide aux nouveaux
  • et impérativement les règles du forum. Histoire de garder une ambiance amicale.
  • Noubliez pas les balises de Code pour vos listings : bouton # de l'éditeur. Et n'oubliez pas non plus de bouton
  • Je ne réponds pas aux questions posées par MP.
zazaraignée est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 13/10/2008, 11h14   #5 (permalink)
Membre à l'essai
 
Date d'inscription: septembre 2008
Âge: 22
Messages: 40
Par défaut

Merci d'avoir repondu.
J'ai pas tres bien compris les reponses (je suis pas un familier de vba)

Mais pour porter des clarification.
quand j'utilise le terme programme principal je parle du dossier xls.
le terme feuille du programme principal se trouve etre une feuille du dossier xls, (pour le moment j'en ai six) qui est appellé Microsoft Excel Objects sous vba.
et enfin pour le copie colle... je voulais dire que je passe des lignes de codes qui etaient avant dans une feuille (Object) dans un module (içi sous module 1).

Serait-il possible de m'expliquer le terme
Citation:
Passer les paramètres désirés à la fonction lorsque tu l'appelles
car je pense que c'est que je cherche a faire. Mais je ne saisis pas vraiment.
Sinon pour le lien vers un tutoriel, je sais qu'il faut que je passe mes variables en public.

Mais j'ai des variables de meme noms dans d'autres procedures mais qui n'ont pas la meme fonction, et je les redefini a chaque debuts de procedures. Y-a-t'il un risque de probleme de declaration pour ces variables ?


Je m'explique:
J'ai la variable J qui est un compteur dans une procedure1, dans la procedure2 J correspond au numero d'une ligne. et j'ai besoin aussi de recuperer la valeur de J pour un module.


merci pour toutes reponses.
Si ce n'est pas tres clair, n'hesitez pas à me demander une clarification.
"Rone" est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 13/10/2008, 12h23   #6 (permalink)
Membre éprouvé
 
Date d'inscription: février 2007
Messages: 469
Par défaut

bonjour,

Peut tu nous montrer ton code.
patbou est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 13/10/2008, 12h56   #7 (permalink)
Membre à l'essai
 
Date d'inscription: septembre 2008
Âge: 22
Messages: 40
Par défaut

mon code fait a peu pres 500 lignes.
donc c'est un peu difficile de le montrer.

deplus le sujet est confidentiel.

désolé.
"Rone" est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 13/10/2008, 13h07   #8 (permalink)
Rédacteur/Modérateur
 
Avatar de Pierre Fauconnier
 
Date d'inscription: novembre 2003
Localisation: Theux (Belgique)
Âge: 41
Messages: 3 112
Envoyer un message via Skype™ à Pierre Fauconnier
Par défaut

Il est délicat de t'aider sans voir ton code.

Tu dis par ailleurs que, suite à lecture du tuto, tu as compris que tu devais mettre tes variables publiques...

Oui et non. Si tu déclares tes variables comme étant publiques à l'intérieur de module de feuille de calcul, tu ne peux quand même pas les utiliser telles quelles n'importe où dans ton code, mais tu dois les préfixer du nom de ta feuille...
__________________
Pierre Fauconnier
--------------------
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
Pensez au tag

Mon blog sur DVP - Mes petits papiers sur DVP
Je ne peux en aucun cas être tenu pour responsable des conséquences de l'utilisation des codes que je fournis dans le cadre des réponses apportées sur les forums, même s'il s'avérait que ces codes sont erronés ou amènent à des dysfonctionnements, de manière manifeste ou non.
Pierre Fauconnier est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 13/10/2008, 13h33   #9 (permalink)
Membre à l'essai
 
Date d'inscription: septembre 2008
Âge: 22
Messages: 40
Par défaut

voici comment je declare les variables dans la feuille vba qui est lié a la feuille 'compare'. que j'appele dans le programme sheets("compare")

Code :
Private Sub CB_compare_Click()
Dim k, j, l, i As Integer
Dim aux, aux1, aux2, aux3, weight_exceedance As Integer
...
apres je les utilise dans un programme qui fait 500 lignes.
comme je dois appeler de facon repeter ces 500 lignes, je veux les mettre dans un module (enregistrer sous le nom module1).

Comment dois-je declarer les variables j,k,l et i pour quel soit aussi defini dans le module?
"Rone" est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 13/10/2008, 13h42   #10 (permalink)
Rédacteur/Modérateur
 
Avatar de Pierre Fauconnier
 
Date d'inscription: novembre 2003
Localisation: Theux (Belgique)
Âge: 41
Messages: 3 112
Envoyer un message via Skype™ à Pierre Fauconnier
Par défaut

Heureusement que tu as lu le tutoriel

Code :
Public k, j, l, i As Integer
 
dans un module standard...

De plus, un code qui fait 500 lignes, brrr.. cela fait un peu peur. Il y aurait probablement moyen d'optimiser tout cela, mais vu que c'est confidentiel...
__________________
Pierre Fauconnier
--------------------
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
Pensez au tag

Mon blog sur DVP - Mes petits papiers sur DVP
Je ne peux en aucun cas être tenu pour responsable des conséquences de l'utilisation des codes que je fournis dans le cadre des réponses apportées sur les forums, même s'il s'avérait que ces codes sont erronés ou amènent à des dysfonctionnements, de manière manifeste ou non.
Pierre Fauconnier est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 13/10/2008, 13h43   #11 (permalink)
Membre habitué
 
Avatar de Ormonth
 
Date d'inscription: février 2008
Localisation: Loire Atlantique
Messages: 164
Par défaut

Bonjour,

si on considère qu'il vaut mieux prévoir que guérir.... ce post ne te donnera pas une solution, mais pourra te faire gagner énormément de temps dans l'avenir

Citation:
Je m'explique:
J'ai la variable J qui est un compteur dans une procedure1, dans la procedure2 J correspond au numero d'une ligne. et j'ai besoin aussi de recuperer la valeur de J pour un module.
Je dirai qu'il vaut mieux éviter toute ambiguité dans un code , il y a assez de sources d'erreur sans en rajouter... dans 6 mois ( je suis cool sur le délai...) tu relis et tu patines...

Donc évite, à la création ce genre de chose en ayant des noms de variables Explicites et les attribuant à une même catégorie dans différentes procédures selon leur portée.

Implicitement quand on voit un I, un J "tous nus"on pense à une variable compteur

Lis ceci :

http://argyronet.developpez.com/office/vba/convention/

Je te garantis que le temps de lecture (non négligeable) sera récupéré avec un coef multiplicateur important.

Dernier point, un code long avec des variables , fera que tu trouveras moins de gens pour t'aider, vu que leur passion n'est pas forcément le décrytage, n'est pas Champolion qui veut....

cordailement,

Didier
__________________
Didier Gonard

N'oubliez pas de mettre : ..quand c'est le cas !
Ormonth est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 13/10/2008, 13h54   #12 (permalink)
Membre à l'essai
 
Date d'inscription: septembre 2008
Âge: 22
Messages: 40
Par défaut

le code de 500 lignes n'est pas simplifiable malheuresment car cela traite beaucoup de cas de scenario possible.


je vous montre le probleme que j'arrive pas a regler.
ps: j'ai mis la procedure en public

Code :
If Sheets("compare").CB_type.Value = "A320" Then
        l = 2
        For j = 2 To k
        If Sheets("DATA base").Cells(j, 3).Value = "A320" Then
             
             
        compare_SA
             
             
             
        End If
        Next j
End If

apres la fonction compare_SA est appelé dans le module 'module1'

et le probleme est qu'il ne reconnait pas ensuite l'application ou la procedure. (erreur 1004)

Code :
Sub compare_SA()

'pour un hard landing
        If Sheets("compare").OB_hardlanding.Value = True Then
          If (Sheets("Data base").Range("a" & j).Text = "Hard landing" Or Sheets("Data base").Range("a" & j).Text = "Severe hard landing") Then
...

alors que si je met le code ci-dessus dans la premiere feuille, de cette façon:

Code :
'cas d'une comparaison pour l'A320
If Sheets("compare").CB_type.Value = "A320" Then
        l = 2
        For j = 2 To k
        If Sheets("DATA base").Cells(j, 3).Value = "A320" Then
        'pour un hard landing
        If Sheets("compare").OB_hardlanding.Value = True Then
          If (Sheets("Data base").Range("a" & j).Text = "Hard landing" Or Sheets("Data base").Range("a" & j).Text = "Severe hard landing") Then
...
tout marche bien

J'ai essayé de montrer des petits bout de programme sans trop en faire voir. mais je pense que vous pouvez savoir pour qu'elle boite je travaille avec les petits indices dedans.
"Rone" est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 13/10/2008, 14h06   #13 (permalink)
Membre éprouvé
 
Date d'inscription: février 2007
Messages: 469
Par défaut

Code :
If (Sheets("Data base").Range("a" & j).
et j dans ce cas là il correspond à quoi , sachant qu ' il n ' est pas déclaré dans la procédure "compare_SA"

Dernière modification par AlainTech ; 13/10/2008 à 16h59 Motif: Balises [code], pas [quote]
patbou est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 13/10/2008, 14h12   #14 (permalink)
Membre à l'essai
 
Date d'inscription: septembre 2008
Âge: 22
Messages: 40
Par défaut

la feuille "data base" est une feuille contenant une base de donnée.

Code :
If (Sheets("Data base").Range("a" & j).
et la colonne A est la colonne du type devenement. dans ce cas la, il s'agit de hard landing.

Dernière modification par AlainTech ; 13/10/2008 à 17h00 Motif: Balises [code], pas [quote]
"Rone" est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 13/10/2008, 14h29   #15 (permalink)
Membre éprouvé
 
Date d'inscription: février 2007
Messages: 469
Par défaut

as tu mis " option explicit " en tête du module , pour voir les variables non déclarées
patbou est déconnecté   Envoyer un message privé Réponse avec citation
NEWS MS-OFFICEFAQs OFFICETUTORIELS OFFICELIVRES OFFICESOURCES VBAACCESS

Réponse

Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Microsoft Office > Excel > VBA Excel

 
Offres d' emploi informatique sur Lesjeudis.com


Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non
Navigation rapide