Afficher un résultat en fonction de la valeur de 2 colonnes [Résolu/Fermé]

Signaler
Messages postés
68
Date d'inscription
lundi 10 mars 2014
Statut
Membre
Dernière intervention
10 avril 2018
-
Messages postés
12186
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
15 octobre 2020
-
Bonjour à tous,

Je bloque sur un problème depuis plusieurs heures. J'ai réussi à le résoudre avec une fonction SI(ET) et l'enregistreur de Macro mais je souhaiterais comprendre le fonctionnement de VBA pour progresser et ne plus me contenter de l'enregistreur...

En gros imaginons une colonne A avec soit des IN soit des OUT

Une colonne B avec soit des chiffres (1,2 ou 3) ; soit rien ou soit un texte ("Autres").

Je souhaiteras développer une macro qui va vérifier la valeur dans la colonne A et dans la colonne B pour me donner :

Si en cellule A = "OUT" et dans la colonne B <>"" (différent de rien) alors

=>Msg Box (pour la MsgBox votre forum m'a donné la réponse se matin) pour les intéressés allez voir mes conversations.


Je suis parti sur qqch comme ça

Dim x As Integer "Pour la colonne B"
Dim y As String "Pour la colonne A"

x = ActiveCell.Value
y = ActiveCell.Value


Ensuite je comprends qu'il faut que j'aille faire vérifier mes cellules les unes après les autres avec une boucle Loop Until ou quelque chose comme ça et qu'ensuite quand x<>"" et y = "OUT" lancement de la Msgbox.

Voilà j'espère que certains d'entre vous pourront m'aider afin de progresser.

Merci pour ce forum.

EDIT: Spécification du langage dans la coloration syntaxique.

1 réponse

Messages postés
12186
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
15 octobre 2020
2 497
Bonjour,

Tu n'es pas très bien parti.

Tu dis :
Dim x As Integer "Pour la colonne B"
Dim y As String "Pour la colonne A"


Puis
x = ActiveCell.Value
y = ActiveCell.Value

Or ActiveCell ne peut pas être à la fois en colonne A ET en colonne B, ActiveCell étant LA (et l'unique) cellule active.

Il te faut, pour rester simple, boucler, en effet, sur toutes les cellules de ta colonne A.
Pour cela, il te faut, au préalable, déterminer qu'elle est la première cellule et qu'elle est la dernière.
La première cellule, ce n'est pas difficile, c'est toi qui la fixe. Par exemple Range("A2") (qui s'écrit également Cells(2, 1)). Pour la dernière cellule, il te faut la déterminer. Pour cela il existe plusieurs méthodes (voir cette fiche pratique). En voici une :
Dim DernLign As Long
DernLign = Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row


Donc, après cela, tu peux boucler sur toutes les cellules entre A-2 et A-DernLign.
Voici deux façons de procéder, simples, mais il y en a d'autres...
Avec la syntaxe Range
Dim Lign As Long, DernLign As Long
'on détermine la dernière ligne
DernLign = Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row
'boucle de la ligne 2 à la dernière
For Lign = 2 To DernLign
    'si la cellule A-Lign = OUT Alors
    If Range("A" & Lign) = "OUT" Then
        'ICI ton traitement si A = OUT
    Else
        'ICI ton traitement si A <> OUT
        'en gros on ne fait rien, donc le Else est inutile
    End If
'Ligne suivante
Next Lign

Avec la syntaxe Cells
Dim Lign As Long, DernLign As Long
'on détermine la dernière ligne
DernLign = Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row
'boucle de la ligne 2 à la dernière
For Lign = 2 To DernLign
    'si la cellule A-Lign = OUT Alors
    If Cells(Lign, 1) = "OUT" Then
        'ICI ton traitement si A = OUT
    Else
        'ICI ton traitement si A <> OUT
        'en gros on ne fait rien, donc le Else est inutile
    End If
'Ligne suivante
Next Lign


Nota : Dans les syntaxes :
Range("A" & Lign) = "OUT"
et
Cells(Lign, 1) = "OUT"
je n'ai pas ajouté le
.Value
. En effet, en VBA, Value est la propriété par défaut. Tu peux l'ajouter pour une meilleure compréhension du code.

Nota 2 : Il peux s'avérer nécessaire, dans certains cas, de référencer également la feuille.
Pour cela, remplacer :
Range("A" & Lign) = "OUT"
et
Cells(Lign, 1) = "OUT"
par :
Sheets("Feuil189").Range("A" & Lign).Value = "OUT"
et
Sheets("Feuil189").Cells(Lign, 1).Value = "OUT"
s'il s'agit de la feuille nommée : Feuil189...
EDIT : j'ai ajouté les .Value pour te montrer que cela ne change rien...

🎼 Cordialement,
Franck 🎶