IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Comparaison de valeurs et utilisation de variables [XL-2003]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 77
    Par défaut Comparaison de valeurs et utilisation de variables
    Bonjour à tous,

    J'ai cherché sur le ouaib, mais je n'ai malheureusement rien trouvé qui répondait à mon problème ... ou bien je n'ai pas tout compris, ce qui est aussi possible ! Alors je pose mon problème ici.

    J'ai deux tableaux d'une longueur variable selon les requêtes qui les alimentent.
    Le 1er (tableau A) ne comporte qu'une colonne avec des adresses mail.
    Le 2ème (tableau B) comporte plusieurs colonnes dont la C qui contient aussi des adresses mail.
    Dans ma macro, je souhaite :
    - d'une part déclarer des variables pour simplifier les formules de comparaison
    - d'autre part et ensuite prendre la première adresse du tableau A, voir si elle existe dans le tableau B et vider toutes les cellules qui comportent cette adresse, et ainsi de suite tant qu'il y a des cellules remplies tant dans le tableau A que dans le B.
    Pour cela j'ai créé deux boucles imbriquées Do ... Loop Until (voir le simili-code ci-dessous dans lequel je voudrai simplifier les formules de comparaison par l'utilisation de variables, et surtout les faire fonctionner !).

    -------------------------------------------------------------------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    ' Variables de comptage pour la boucle
        Dim i As Integer ' Variable de comptage pour le tableau A
        Dim j As Integer ' Variable de comptage pour le tableau B
    ' Compteur de ligne à partir de la 2ème ligne (1ère ligne = titre de colonne)
        i = 2 ' variable n° de ligne du tableau A
        j = 2 ' variable n° de ligne du tableau B
        ' Lancement du calcul en boucle
        ' La colonne A du tableau B (Sheets(1)) contient les adresses mail.
        ' Les boucles tournent tant qu'il y a une valeur dans la colonne A des deux tableaux.
    '
    ' Début des boucles
    Do
        Do
        ' Si la cellule Range("A" & i), 4ème feuille, tableau A n'est pas vide,
        ' alors l'adresse mail (colonne C du tableau B) est comparée au contenu du tableau A
            If ligne(i), 4ème feuille, tableau A visible And valeur de Range("A" & i), 4ème feuille, tableau A <> "" And valeur de Range("A" & i), 4ème feuille, tableau A = valeur de Range("C" & j), 1ère feuille, tableau B Then
                valeur de Range("C" & j), 1ère feuille, tableau B = ""
            Else
                valeur de Range("C" & j), 1ère feuille, tableau B = valeur de Range("C" & j), 1ère feuille, tableau B
            End If
        ' On passe à la ligne suivante du tableau B
            j = j + 1
        ' Boucle tant que la cellule Range("A" & j), 1ère feuille, tableau B n'est pas vide
        Loop Until valeur de Range("A" & j), 1ère feuille, tableau B = ""
        ' FIN DE LA 1ère BOUCLE
        ' On passe à la ligne suivante du tableau A
        ' et on reprend l'analyse du fichier à traiter avec la nouvelle valeur du tableau A
        ' ou l'analyse s'arrête s'il n'y a plus de valeur dans la cellule Range("A" & i)
        i = i + 1
    ' Boucle tant que la cellule Range("A" & i), 4ème feuille, tableau A n'est pas vide
    Loop Until valeur de Range("A" & i), 4ème feuille, tableau A = ""
    ' FIN DE LA 2ème BOUCLE
    -------------------------------------------------------------------------

    Mais pour l'instant, je n'arrive pas à la faire fonctionner car je n'arrive pas à créer, voire à utiliser les variables créées pour essayer de simplifier le code.
    Est-ce que l'un d'entre-vous peut me sortir de cette ornière ? Merci d'avance.

    Cordialement
    Bruno

    Excel 2003
    Windows XP pro

  2. #2
    Expert confirmé Avatar de jfontaine
    Homme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Juin 2006
    Messages
    4 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Contrôleur de Gestion

    Informations forums :
    Inscription : Juin 2006
    Messages : 4 756
    Par défaut
    Bonjour,

    Afin de faciliter la lecture du code, merci d'utiliser les balises prévues à cet effet (icone #)

    Choix de la variable : Si le tableau comporte plus de 32767 lignes, la variable sera en dépassement de capicité. Privilégier les variables de type Long
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim i As Long
    Dim j As Long
    Pour les boucles voici la méthode que j'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
     
    Dim i As Long
    Dim j As Long
     
    i = 2
     
    Sheets("feuil1").Select
     
    Do While Sheets("Feuil1").Range("A" & i).Value <> ""
     
        j = 2
        Do While Sheets("feuil2").Range("C" & j).Value <> ""
     
            If Sheets("feuil2").Range("C" & j).Value = Sheets("Feuil1").Range("A" & i).Value Then
     
                Sheets("Feuil1").Range("B" & i).Value = Sheets("feuil2").Range("D" & j).Value
     
            End If
     
            j = j + 1
     
        Loop
     
        i = i + 1
    Loop
    Bon courage

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 77
    Par défaut
    Bonsoir Jérôme,

    Désolé pour l'oubli des balises C'est corrigé.

    Je te remercie pour ta réponse. Je l'étudie (car j'aime bien comprendre), je la teste et je te tiens au courant.

    Y a-t-il un moyen de simplifier les formules avec l'utilisation de variables, par exemple une variable pour la valeur suivante : Sheets("feuil2").Range("C" & j) ?
    J'ai oublié de préciser que les tableaux sont dans deux fichiers différents. Il faut donc rajouter Windows() aux formules. Me trompes-je ?

    Bruno

  4. #4
    Membre Expert Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Par défaut
    Citation Envoyé par brunop3165 Voir le message
    Il faut donc rajouter Windows() aux formules. Me trompes-je ?

    Bruno
    Oui enfin non mais c'est pas le mieux, utilise plutot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    workbooks(NomDuclasseur).worksheets(....
    ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    workbooks(Classeur1.xls").workSheets("Feuil1").Range("B" & i).Value=workbooks("Classeur2.xls").workSheets("feuil2").Range("D" & j).Value
    Après pour ce qui est d'utiliser des variables je ne voi pas trop l'intéret tu n'utilise pas la même cellule de manière récurente. Enfin si tu veux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dim var1 as range
    set var1= workbooks("Classeur2.xls").Sheets("feuil2").Range("D" & j).Value

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 77
    Par défaut
    Bonjour à tous,

    J'ai testé deux versions de codes en mixant les infos données par Krovax et jfontaine d'un côté (Code 1), et en mixant d'un autre les infos de Krovax et ce que j'avais déjà fait (Code 2). Les résultats sont identiques dans les deux cas, à savoir :
    - la variable j s'incrémente à chaque tour de boucle (j'ai testé jusqu'à j = 611000 !),
    - la valeur des variables CelluleControle et CelluleFichierATraiter restent celles de j = 2.

    De plus, dans le tableau de valeurs que j'utilise pour mes tests, la cellule j114 est vide, la boucle devrait donc s'arrêter et i devrait passer à i = 6 ... ce qui n'est pas le cas. Est-ce un problème de format du contenu des cellules ? Pour info, la colonne ne contient que des noms de personnes.

    Enfin, quelles que soient les méthodes utilisées, la cellule Cj ne se vide pas si son contenu est identique à celui de la cellule Ai de l'autre tableau

    Est-ce que vous pourriez m'aider à sortir de ce pétrin ?

    Pour info, voici les codes utilisés.

    Code 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    '
    ' ____________________________________________________________________________________
    ' DECLARATION DES VARIABLES
    '
        ' Variables de comptage pour les boucles
        Dim i As Integer ' Variable de comptage pour la feuille des exclus
        Dim j As Integer ' Variable de comptage pour le fichier des boites pleines
        ' Déclaration des valeurs de départ de i et j
        i = 5
        j = 2
        ' Variables de nommage des cellules
        Dim CelluleExclus As Range
        Dim CelluleFichierATraiter As Range
        Dim CelluleControle As Range
    '
    ' ____________________________________________________________________________________
    ' Déclaration des valeurs des variables de nommage des cellules et lignes
    '
        Set CelluleExclus = ThisWorkbook.Worksheets(4).Range("A" & i)
        Set CelluleControle = Workbooks(FichierATraiter).Worksheets(1).Range("A" & j)
        Set CelluleFichierATraiter = Workbooks(FichierATraiter).Worksheets(1).Range("C" & j)
    '
    ' ____________________________________________________________________________________
     
    ' Début des boucles
        ThisWorkbook.Worksheets(4).Activate
     
        Do While CelluleExclus.Value <> ""
            Do While CelluleControle.value <> ""
            ' Egalement testé :
            ' Do While Len(CelluleControle) > 0    
                If CelluleFichierATraiter.Value = CelluleExclus.Value Then
                    CelluleFichierATraiter.Value = ""
                    ' Egalement testé :
    		' CelluleFichierATraiter.ClearContents
                Else
                    CelluleFichierATraiter.Value = CelluleFichierATraiter.Value
                End If        
                j = j + 1        
            Loop 
            i = i + 1
        Loop


    Code 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    '
    ' ____________________________________________________________________________________
    ' DECLARATION DES VARIABLES
    '
        ' Variables de comptage pour les boucles
        Dim i As Integer ' Variable de comptage pour la feuille des exclus
        Dim j As Integer ' Variable de comptage pour le fichier des boites pleines
        ' Déclaration des valeurs de départ de i et j
        i = 5
        j = 2
        ' Variables de nommage des cellules
        Dim CelluleExclus As Range
        Dim CelluleFichierATraiter As Range
        Dim CelluleControle As Range
    '
    ' ____________________________________________________________________________________
    ' Déclaration des valeurs des variables de nommage des cellules et lignes
    '
        Set CelluleExclus = ThisWorkbook.Worksheets(4).Range("A" & i)
        Set CelluleControle = Workbooks(FichierATraiter).Worksheets(1).Range("A" & j)
        Set CelluleFichierATraiter = Workbooks(FichierATraiter).Worksheets(1).Range("C" & j)
    '
    ' ____________________________________________________________________________________
    '
    ' Début des boucles
        Do
            Do
            ' Si la cellule "Windows(FichierATraiter).Sheets(1).Range("C" & j)" n'est pas vide,
            ' alors l'adresse mail est comparée au contenu de la feuille des exclus
                If CelluleExclus.Value <> "" And CelluleExclus.Value = CelluleFichierATraiter.Value Then
                    CelluleFichierATraiter.Value = ""
                Else
                    CelluleFichierATraiter.Value = CelluleFichierATraiter.Value
                End If
            ' On passe à la ligne suivante du fichier à traiter
                j = j + 1
            ' Boucle tant que la cellule "Windows(FichierATraiter).Sheets(1).Range("A" & j)" n'est pas vide
            Loop Until CelluleControle.Value = ""
            ' FIN DE LA 1ère BOUCLE
            ' On passe à la ligne suivante de la feuille de contrôle
            ' et on reprend l'analyse du fichier à traiter avec la nouvelle valeur des exclus
            ' ou l'analyse s'arrête s'il n'y a plus de valeur dans la cellule "Windows(FichierMacro).Sheets(4).Range("A" & i)"
            i = i + 1
        ' Boucle tant que la cellule "Windows(FichierMacro).Sheets(4).Range("A" & i)" n'est pas vide
        Loop Until CelluleExclus.Value = ""
        ' FIN DE LA 2ème BOUCLE

  6. #6
    Membre Expert Avatar de Krovax
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 888
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 888
    Par défaut
    Tu affect les ceulle avant d'entrer dans la boucle du coup quand tu vait varier i et j tu travaille toujours sur les meme cellule.
    CelluleExclus sera toujours A5
    CelluleControle toujours a2

    tu doit mettre les set a l'interieur de la boucle quand tu teste en mode pas a pas pense a vérifier que les variables tel que tes cellule évolu bien comme tu le souhaite

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 08/06/2010, 12h15
  2. Réponses: 2
    Dernier message: 20/11/2009, 15h13
  3. Variables qui perdent leur valeur lorsqu'utilisées dans fonction
    Par damlarumeur dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/02/2009, 09h05
  4. [SQL2K5] Astuce pour utiliser une variable à valeur multiple
    Par Jinroh77 dans le forum Développement
    Réponses: 0
    Dernier message: 28/05/2008, 14h27
  5. Réponses: 6
    Dernier message: 29/11/2007, 16h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo