![]() |
| 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é. | |||||||
|
|||||||
![]() |
|
|
Outils de la discussion |
|
|
#1 (permalink) |
|
Membre à l'essai
![]() Date d'inscription: septembre 2008
Âge: 22
Messages: 40
|
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. |
|
|
|
|
|
#2 (permalink) |
![]() Date d'inscription: février 2004
Localisation: Rimouski
Messages: 3 067
|
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] 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.
__________________
|
|
|
|
|
|
#3 (permalink) |
![]() |
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 |
|
|
|
|
|
#4 (permalink) |
![]() Date d'inscription: février 2004
Localisation: Rimouski
Messages: 3 067
|
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!
__________________
|
|
|
|
|
|
#5 (permalink) | |
|
Membre à l'essai
![]() Date d'inscription: septembre 2008
Âge: 22
Messages: 40
|
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:
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. |
|
|
|
|
|
|
#8 (permalink) |
![]() |
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. |
|
|
|
|
|
#9 (permalink) |
|
Membre à l'essai
![]() Date d'inscription: septembre 2008
Âge: 22
Messages: 40
|
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 ... 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? |
|
|
|
|
|
#10 (permalink) |
![]() |
Heureusement que tu as lu le tutoriel
![]() Code :
Public k, j, l, i As Integer 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. |
|
|
|
|
|
#11 (permalink) | |
|
Membre habitué
![]() Date d'inscription: février 2008
Localisation: Loire Atlantique
Messages: 164
|
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:
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 cordailement, Didier
__________________
Didier Gonard N'oubliez pas de mettre : ..quand c'est le cas !
|
|
|
|
|
|
|
#12 (permalink) |
|
Membre à l'essai
![]() Date d'inscription: septembre 2008
Âge: 22
Messages: 40
|
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 ... 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. |
|
|
|
|
|
#13 (permalink) |
|
Membre éprouvé
![]() Date d'inscription: février 2007
Messages: 469
|
Code :
If (Sheets("Data base").Range("a" & j). Dernière modification par AlainTech ; 13/10/2008 à 16h59 Motif: Balises [code], pas [quote] |
|
|
|
|
|
#14 (permalink) |
|
Membre à l'essai
![]() Date d'inscription: septembre 2008
Âge: 22
Messages: 40
|
la feuille "data base" est une feuille contenant une base de donnée.
Code :
If (Sheets("Data base").Range("a" & j). Dernière modification par AlainTech ; 13/10/2008 à 17h00 Motif: Balises [code], pas [quote] |
|
|
|
|
![]() |
![]() |
||
Problème de variables dans un module
|
||
Offres d'
emploi informatique
sur Lesjeudis.com
|
| Outils de la discussion | |
|
|