Amélioration du code

Bonjour, je suis relativement débutant et autodidacte dans le VBA et là, je bute... 🤔

J'ai créé une Macro qui me note un groupe de lettres suivant s'il y a des "OUI" dans une ou plusieurs autres colonnes de mon fichier. Voici le code actuel :

Sub Bouton1_Cliquer()

Columns("M:M").ClearContents

For X = 1 To 61

'Si OUI dans les colonnes N à U
If Cells(X, 15) = "OUI" Then Cells(X, 13) = "PF"
If Cells(X, 17) = "OUI" Then Cells(X, 13) = "DP"
If Cells(X, 19) = "OUI" Then Cells(X, 13) = "MSOL"
If Cells(X, 21) = "OUI" Then Cells(X, 13) = "SAP"
If Cells(X, 15) = "OUI" And Cells(X, 17) = "OUI" Then Cells(X, 13) = "PF + DP"
If Cells(X, 15) = "OUI" And Cells(X, 19) = "OUI" Then Cells(X, 13) = "PF + MSOL"
If Cells(X, 15) = "OUI" And Cells(X, 21) = "OUI" Then Cells(X, 13) = "PF + SAP"
If Cells(X, 17) = "OUI" And Cells(X, 19) = "OUI" Then Cells(X, 13) = "DP + MSOL"
If Cells(X, 17) = "OUI" And Cells(X, 21) = "OUI" Then Cells(X, 13) = "DP + SAP"
If Cells(X, 19) = "OUI" And Cells(X, 21) = "OUI" Then Cells(X, 13) = "MSOL + SAP"
If Cells(X, 15) = "NON" And Cells(X, 17) = "NON" And Cells(X, 19) = "NON" And Cells(X, 21) = "NON" Then Cells(X, 13) = "Non"

If Cells(X, 1) = "" Then Exit Sub

Next

End Sub

Pour vous donner un peu de contexte, je rentre de plus en plus de lignes au cours de la journée dans ce fichier et fais tourner la macro à chaque salve. Par exemple :

A 08h - 5 lignes - Activation de la Macro

A10h - 2 lignes de plus - Macro

11h - 7 lignes - Macro... etc...

Le problème c'est que à chaque fois, la macro rebalaye toute depuis la ligne 1, ce qui peut devenir longuet quand j'ai 40-50 lignes. Je voudrais donc modifier mon code pour qu'il démarre depuis la dernière ligne non vide de la colonne 13. Auriez-vous une idée pour y parvenir ?

Bonjour,

Puisqu'il s'agit chaque fois d'inscrire une valeur en colonne 13, tu ne peux pas te contenter d'une simple formule ?
Quel que soit ton point de vue sur le sujet, tu augmenterais tes chances d'obtenir une répons en joignant un extrait de ton fichier, avec des cas de figure différents et le résultat attendu pour chacun !

bonjour,

complétement d'accord avec u.milité

je concaténerai toutes tes colonnes pour former une clef puis par un recherchev irait chercher la valeur adéquat, ça serait très rapide à faire

si tu avais un fichier d'exemple je t'aurai fait la formule.

Mais en gros t'auras un recherchev(O2 & Q2 & S2 & U2; TableauRecherche;2) en M2

J'ai bien pensé à passer par une formule, mais la seule solution qui me vienne par formules, c'est un SI imbriqué modèle "usine à gaz". J'ai fait le choix de la Macro car ça me parait plus clair et simple qu'une fonction avec une dizaine de SI imbriqués.

Mon fichier se présente comme ça :

image

Je rentre mes données dans les colonnes A et B. Toutes les autres, c'est des formules qui vont piocher dans d'autres fichiers, sauf la colonne M qui est celle pour les résultats de la Macro. Les colonnes vertes et bleues passent à "OUI" suivant certaines conditions dans d'autres fichiers et, en fonction de là où apparaissent les "OUI", le résultat de la colonne M change grâce à la macro suivant s'ils sont dans la colonne PF, DP, MSOL... PF + DP... etc...

cf ma suggestion pour éviter ton si imbriqué de la mort

Re-bonjour,

Des formules ou des macros sur ... une image, je ne fais pas. Avec un extrait de fichier (juste les colonnes M et suivantes) je veux bien faire une proposition

Merci de votre aide.

Je viens de la tester et je vais opter pour la solution de WonderAleph. 👍

Je clos le sujet.

Bonne journée.

Re,

Je clos le sujet.

Dommage, j'aurais été curieux de voir la solution de WonderAleph mise en œuvre dans ton cas !

Avec le fichier je te le fais en 5 minutes :)

Sa solution (ou en tous cas, la façon dont je l'ai adaptée) donne ceci :

image

Colonne R : la formule =N2&O2&P2&Q2 (on peut aussi utiliser la formule CONCATENER(), pour ce que j'en sais, ça revient au même)

Colonne V : Toutes les combinaisons possibles de OUI et de NON.

Colonne W : Le message qui s'affichera en colonne M en fonction de la combinaison.

Colonne M : =SI(A2<>"";RECHERCHEV(R2;$V$2:$W$16;2;FAUX);"") Le SI en 1er est pour éviter d'avoir des "NON" partout dans les lignes où je n'ai encore rien saisi, sinon, ce n'est qu'une RECHERCHEV dans le tableau de références des colonnes V et W.

A l'utilisation du fichier, les colonnes N, O, P, Q, R, V et W seront masquées pour donner ceci :

image

Excellent,

Si tu veux tu peux directement passer la concaténation à ton recherchev pour ne pas avoir à fabriquer une colonne que tu finiras par masquer.

N'oublie pas de compléter ton profil et d'indiquer ta version d'Excel.

Ça fait un fameux tableau avec toutes les combinaisons possibles (heureusement, tu ne le crées qu'une fois !) et dans ta première image, on ne voyait pas le nombre de colonnes.
Bravo pour l'adaptation !

WonderAleph : Là par contre, je ne vois pas comment ça peut marcher..... Mettre le CONCATENER à la place de R2 pour la valeur recherchée, oui, mais si je n'ai pas le tableau des colonnes V et W, comment ça peut afficher le code associé (PF, DP, PF+DP...) ? Parce qu'alors, dans le RECHERCHEV, le tableau de recherche n'est plus défini?

=SI(A2<>"";RECHERCHEV(R2;$V$2:$W$16;2;FAUX);"")

U.Milité : Si j'ai pas compté de travers, (ou oublié de cas...) j'ai 15 cas possibles en comptant le cas avec que des NON. ^^

Sans fichier, je me suis peut être un peu avancé, il aurait fallut que tu nous le fournisse :p

Rechercher des sujets similaires à "amelioration code"