Afficher un résultat en fonction de la valeur de 2 colonnes

Résolu/Fermé
simon7339 Messages postés 68 Date d'inscription lundi 10 mars 2014 Statut Membre Dernière intervention 10 avril 2018 - Modifié par Whismeril le 30/12/2014 à 23:31
pijaku Messages postés 12259 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 9 août 2022 - 31 déc. 2014 à 08:14
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

pijaku Messages postés 12259 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 9 août 2022 2 708
Modifié par pijaku le 31/12/2014 à 08:14
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 🎶
0