|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||||
|
Nouveau Membre du Club
![]() Inscription : avril 2007 Messages : 199 ![]() |
Bonjour,
J'ai un programme ou je dois inserer un code avec plus de 7 conditions. Or lorsque j'utilise la formule Si, cela me limite à 7 conditions au maximum. Pour une meilleur visibilité, j'ai copié seulement le code qui nous interesse : Code :
Et voici le code que j'essaie de créer mais qui ne fonctionne pas du tout Code :
merci |
||||
|
|
00
|
|
|
#2 |
|
Membre actif
![]() Inscription : novembre 2008 Messages : 188 ![]() |
Qu'est-ce qui ne fonctionne pas du tout?
Pas de plantage à l'exécution mais le résultat n'est pas celui escompté? Si ça plante à l'exécution, quelle est l'erreur et sur quelle ligne? |
|
|
00
|
|
|
#3 | ||||
|
Membre expérimenté
![]() Inscription : juillet 2008 Messages : 757 ![]() |
Ton premier probleme, c'est qu'en VBA, si tu met un IF, tu as besoin d'un END IF pour le cloturer
Code :
Donc comme tu l'as formulé la, il ne va pas compiler du tout parce qu'il lui manque les balises de fin de if Ton second probleme, c'est que si tu utilise le IF du VBA, ca ne met pas forcement une formule if dans la cellule (fais tourner mon exemple et tu verras que ce qu'il met en B2, c'est une bete chaine de caractere). Une des conséquences est que si tu étirescette cellule vers le bas, tu n'auras pas le résultat que tu veux, vu que tu vas étirer une valeur et non pas une formule. Ca se résoud en faisant une boucle en VBA qui va pour chacune de tes lignes (par exemple de 6 a d dans ton cas) faire ta formule vba mon exemple deviendrait quelque chose comme ca Code :
Essaye déja avec ca et dis nous si ca va mieux |
||||
|
|
00
|
|
|
#4 | ||
|
Nouveau Membre du Club
![]() Inscription : avril 2007 Messages : 199 ![]() |
Bonjour EmmanuelleC,
j'ai donc repris ton exemple et cela donne à peu prés cela : Code :
"erreur de compilation" "Next sans For" |
||
|
|
00
|
|
|
#5 | ||
|
Nouveau Membre du Club
![]() Inscription : avril 2007 Messages : 199 ![]() |
Rebonjour EmmanuelleC
J'ai reussi à corriger le bug mais un autre est apparu à la ligne 41 avec comme anomalie : " erreur de compilation" "erreur de syntaxe" Pourrais tu me dire quelle correction je dois faire : Merci Code :
|
||
|
|
00
|
|
|
#6 | ||
|
Expert Confirmé
![]() Inscription : décembre 2007 Messages : 1 903 ![]() |
Là, je ferais autrement, vu le nombre de conditions :
Code :
__________________
Les 4 règles d'airain du développement informatique sont, d'après Michael C. Kasten : 1)on ne peut pas établir un chiffrage tant qu'on a pas finalisé la conception 2)on ne peut pas finaliser la conception tant qu'on a pas complètement compris toutes les exigences 3)le temps de comprendre toutes les exigences, le projet est terminé 4)le temps de terminer le projet, les exigences ont changé Et le serment de non-allégiance : Je promets de n’exclure aucune idée sur la base de sa source mais de donner toute la considération nécessaire aux idées de toutes les écoles ou lignes de pensées afin de trouver celle qui est la mieux adaptée à une situation donnée. |
||
|
|
00
|
|
|
#7 |
|
Nouveau Membre du Club
![]() Inscription : avril 2007 Messages : 199 ![]() |
Bonjour el_slapper,
Cà bug toujours ... |
|
|
01
|
|
|
#8 | ||||||||
|
Membre éclairé
![]() Inscription : juillet 2011 Messages : 141 ![]() |
La première chose à faire est de décrire la feuille voyage avec les constantes identifiant les rangées et colonnes principales.
Ensuite on décrit les types de voyage, ville de départ et ville d'arrivée dans le tableau varTravel. Finalement la macro identifie la ville du voyage selon le sens départ ou arrivée. Code :
Sur la feuille Excel, on a en C1 : la chaîne "depart" sans accent et sans guillemets. De D6 à D10, on a des types de voyages comme "63c-1167". En C1, on a "DEPART" ou "ARRIVEE" en majuscule. En C11 on a : "national" et dessous de C12 à C15 des erreurs de formule #N/A avec de B12 à B15 un texte libre "à effacer" qui sera effacé. Citation:
Nombre de voyages identifiés : 10 De B6 à B15, la procédure TravelCity() a affiché : Citation:
|
||||||||
|
|
11
|
|
|
#9 |
|
Membre expérimenté
![]() Inscription : juillet 2008 Messages : 757 ![]() |
Si tu veux mettre avec du vba une formule dans une cellule (pas juste une valeur), il faut utiliser un .Formula = "formule" apres la cellule
Par exemple, si je veux mettre En C3 je vais utiliser le code suivant Code :
Cells(1,3).Formula = "=VLOOKUP(D1,A:B,2,FALSE)" |
|
|
00
|
|
|
#10 |
|
Nouveau Membre du Club
![]() Inscription : avril 2007 Messages : 199 ![]() |
je dois avouer que la reponse de MattChess me laisse sans voix
.je crois que jevais la laisser de coté car je suis débutant en VBA..desolé EmmanuelleC, comment devrais alors adapter ta reponse a cette ligne 41 qui bug |
|
|
00
|
|
|
#11 |
|
Membre expérimenté
![]() Inscription : juillet 2008 Messages : 757 ![]() |
Laisse sa réponse de coté mais pas longtemps
Je sais que quand on débute ca fait beaucoup d'un coup, et que c'est pas toujours simple de lire un code structuré par quelqu'un d'autre, mais si tu penses continuer a toucher a l'occasion a du VBA, revient passer du temps sur sa réponse quand tu auras 10 minutes de libre Pour ta formule, teste cette formulation Code :
Cells(i,2).Formula = "=VLOOKUP(D"& i &",'P:\Commun\Transport Securité\Docs Madjid\[matrice.xls]matrice hermes'!R1C1:R800C3,3,0)" |
|
|
00
|
|
|
#12 | |
|
Membre Expert
![]() Hervé Agent Technique Inscription : mars 2009 Messages : 823 ![]() |
Bonjour,
juste une remarque pour EmmnuelleC: Citation:
Code :
If Range("a1") = 1 Then Cells(1, 2) = "C'est un 1"
__________________
@+Si vous avez trouvé la solution à votre problème n'oubliez pas d'appuyer sur Et n'oubliez pas de voter en appuyant sur si ce message a repondu à vos attentes.Ou sur si ce n'est pas le cas |
|
|
|
01
|
|
|
#13 |
|
Nouveau Membre du Club
![]() Inscription : avril 2007 Messages : 199 ![]() |
EmmanuelleC,
N'y aurait il pas un soucis avec ton code Code :
Cells(i,2).Formula = "=VLOOKUP(D"& i &",'P:\Commun\Transport Securité\Docs Madjid\[matrice.xls]matrice hermes'!R1C1:R800C3,3,0)" |
|
|
00
|
|
|
#14 |
|
Nouveau Membre du Club
![]() Inscription : avril 2007 Messages : 199 ![]() |
je précise même que en rajoutant "else:", le code ne fonctionne pas
Code :
Else: Cells(i, 2).Formula = "=VLOOKUP(D " & i & " ,'P:\Commun\Transport Securité\Docs Madjid\[matrice.xls]matrice hermes'!R1C1:R800C3,3,0)" |
|
|
00
|
|
|
#15 |
|
Office & Excel ![]() ![]() ![]() |
Salut.
Je suis à peu près certain que c'est, comme très souvent, un problème de conception de classeur à la base. Si tu souhaites la solution optimale, tu pourrais peut-être nous expliquer en français, ce que tu comptes réaliser. Mettre des valeurs (comme les noms de ville) en dur dans du code, c'est à ne jamais faire. Il y a donc, d'abord, une réflexion à mener sur la conception du classeur et des feuilles, afin d'envisager les meilleurs outils à mettre en oeuvre pour la réalisation de ton travail.
__________________
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire) --------------- Ma nouvelle vidéo: comparer des listes via une MFC - Mes articles sur DVP Vous souhaitez rédiger pour DVP? Contactez-moi Amoureux de la langue française? Venez corriger nos ressources VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA... N'oubliez pas de VOTER (en bas à droite d'un message) --------------- |
|
00
|
|
|
#16 | ||||||||||
|
Membre éclairé
![]() Inscription : juillet 2011 Messages : 141 ![]() |
Citation:
J'ai regroupé l'initialisation du tableau des associations type du voyage, ville de départ et ville d'arrivée dans un tableau dynamique varTravel initialisé par la fonction TravelAssociations() : Code :
___________________________________________________________________ Citation:
Il n'y a rien de plus simple qu'une constante : nom = valeur ' Commentaire Code :
Public Const rowPoint = 1 ' Rangée du Point de départ ou d'arrivée Autrement dit le départ du voyage "63c-1167" correspondra-t-il à la ville ertein ? Entrez dans la procédure TravelCity() en pas à pas avec le débogueur. Ligne 17, on trouve le tableau des trajets type, départ, arrivée cité en début de message. Vous devriez reconnaître vos propres données structurées dans un tableau initialisé par la fonction TravelAssociations(). Au type de voyage "67c-2841", on fait correspondre la ville de départ cavaillon et la ville d'arrivée erstein. C'est beaucoup plus lisible que votre imbrication de If Then Else. Tout tient sur une seule ligne. Code :
Array("67c-2841", "cavaillon", "erstein"), _ Le calcul de la ligne du dernier voyage est exactement le même que le vôtre sauf que l'on n'a pas mis de constante en dur 65536 pour la rangée maximum de la colonne D mais on a demandé à Excel de faire le calcul. Code :
rowTravelEnd = Cells(Columns(colNational).Rows.Count, colTravel).End(xlUp).Row Il y a cinq voyages de D6 à D10. Le dernier est en ligne 10. Reste la boucle For Next, beaucoup plus simple que la vôtre car elle ne fait qu'une dizaine de lignes à comparer aux quarante lignes dans votre procédure test2(). 40 contre 15 ? Où est la complexité ? Code :
On récupère le type du voyage dans strTravelType, ainsi que le point de départ ou d'arrivée strPoint. Tout est dans les noms des variables préfixées par leur type :
Code :
Comme vous êtes en pas en pas dans la procédure, on peut interroger VBA. Dans la fenêtre d'Exécution immédiate (Ctrl+G) du VBE (Visual Basic Editeur) d'Excel, copier-coller et valider par ENTER : 4 La première association étant en 0 et la dernière en 4, il y a 5 associations dans le tableau varTravel. Vous pouvez interrogez ses valeurs par exemple pour le premier élément en 0 : 63c-1167 ertein clermont ferrand Ce sont vos données, vos associations. C'est beaucoup plus simple que l'inextricable imbrication de vos If Then Else. Code :
Dans la colonne colCity, on écrit le nom de la ville souhaitée. C'est fini. Plutôt que rejeter a priori la solution la plus courte, la plus structurée et commentée, il faut poser des questions ! ___________ En bas de ce message s'il vous a apporté des éléments de réponse pertinents, pensez également à voter en cliquant sur le bouton vert ci-dessous.
|
||||||||||
|
|
21
|
|
|
#17 | |||
|
Office & Excel ![]() ![]() ![]() |
Citation:
Code :
Il ne faut pas oublier que l'on est en Excel, donc, on peut travailler avec des plages, éventuellement transformées en tableau. Et c'est parce que l'on est en Excel que je reviens à la charge en insistant sur une bonne conception de classeur à la base. En VBA avec Excel, il est souvent plus rentable, en terme de maintenance notamment, de placer du code VBA en appoint d'un classeur bien conçu.
__________________
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire) --------------- Ma nouvelle vidéo: comparer des listes via une MFC - Mes articles sur DVP Vous souhaitez rédiger pour DVP? Contactez-moi Amoureux de la langue française? Venez corriger nos ressources VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA... N'oubliez pas de VOTER (en bas à droite d'un message) --------------- |
|||
|
20
|
|
|
#18 |
|
Nouveau Membre du Club
![]() Inscription : avril 2007 Messages : 199 ![]() |
Bonjour MattChess,
J'ai archive ta reponse pour l'analyser de plus pres car je dois t'avouer qu'il me faudrait du temps pour decortique ton code Et merci encore a EmmanuelleC et aux autres intervenants qui m'ont beaucoup aide ..
|
|
|
00
|
|
|
#19 | ||
|
Membre expérimenté
![]() Inscription : juillet 2008 Messages : 757 ![]() |
Citation:
Ah, j'ai trouvé je crois Il ne faut pas de ":" apres le else, mais surtout, j'avais testé avec ma propre url. Et apres, j'ai copié collé la tienne Tes colonnes ne sont probablement pas juste Pour mettre une formule, tu peux utiliser .Formula ou .FormulaR1C1 Dans le premier cas, tu dois écrire les lettres des colonnes et les n° des lignes (D1 par exemple), dans le second cas, tu dois écrire le nombre de colonne et de ligne de décalage par rapport a la cellule de départ (par exemple, si ton formule est en A1 et que tu veux tenir compte de quelque chose en D1, ca va etre RC[3] : meme ligne et 3 colonnes plus loin) Et ta formule de base mélange les deux modes, tu as Citation:
|
||
|
|
00
|
|
|
#20 | ||
|
Nouveau Membre du Club
![]() Inscription : avril 2007 Messages : 199 ![]() |
Bonjour EmmanuelleC.
J'ai remplace le code Code :
"=VLOOKUP( Code :
"=VLOOKUP(RC[2],'P:\Commun\Transport Securité\Docs Madjid\[matrice.xls]matrice hermes'!R1C1:R800C3,3,0)" je réaffiche ton programme pour une meilleur compréhension . Code :
Un message d'erreur s'affiche : erreur d'exécution 13 Incompatibilité de type En effet, les cellules de la colonne C , contiennent une formule qui renvoie deux type de valeurs : 1) du text dont "national" 2) l'argument erreur #N/A . Cette erreur est corrigée manuellement lorsque le programme est fini. Je souhaiterais, si c'est possible, inserer dans la ligne 42, un code qui permetterait au programme de continuer même s'il rencontre l'argument erreur #N/A. Merci d'avance |
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com