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 :

lister les valeurs différentes entre 2 plages de cellule


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    175
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 175
    Par défaut lister les valeurs différentes entre 2 plages de cellule
    bonjour,

    je voudrais lister les valeurs d'une plage de cellule d'un classeur qui ne sont pas dans une deuxième plage de cellule d'un autre classeur. Mon résultat sera ensuite listé dans un autre fichier.

    mais lorsque j'exécute mon code, mon programme semble être dans une boucle infinie.

    avez vous une idée?
    merci pour votre aide et votre temps

    mes différents fichier sont les suivants:
    mon classeur de départ: Recap-Calcul-" & NomCarte
    feuille: Recap

    mon classeur de comparaison:"FIDES-" & NomCarte
    feuille: "Recap-Fides"

    mon classeur qui liste: Composants_manquants-" & NomCarte
    feuille: Composants manquants


    voici mon code:

    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
    Windows("Recap-Calcul-" & NomCarte).Activate
        Set FL1 = Workbooks("Recap-Calcul-" & NomCarte).Worksheet("Recap")
        nb_lignes_totales_i = FL1.UsedRange.Rows.Count
        Set FL2 = Workbooks.Open(RepertoireTravail & "FIDES-" & NomCarte & ".xls").Worksheets("Recap-Fides")
        nb_lignes_totales_j = FL2.UsedRange.Rows.Count
     
        Workbooks.Add (1)
        ActiveWorkbook.SaveAs RepertoireTravail & "Composants_manquants-" & NomCarte & ".xls"
        Set sh = ActiveWorkbook.Worksheets.Add
        sh.Name = "Composants manquants"
        sh.Range("B1") = "Composants manquants dans Recap-Fides"
     
        k = 1
        i = 4
        j = 8
        Do While i <> nb_lignes_totales_i
                Do While j <> nb_lignes_totales_j
                    If FL1.Range("A" & i).Value <> FL2.Range("A" & j).Value Then
                    j = j + 1
                    Else: GoTo line9
                    End If
                Loop
                sh.Range("B" & (k + 1)) = FL1.Range("A" & i).Value
    line9:
                i = i + 1
     
        Loop

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Déjà corrige cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Do While i < nb_lignes_totales_i
    Pour le reste, je regarde mais a priori, je préfère parcourir une plage instanciée.
    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
        Dim Plage1 as range
        Dim Plage2 as range
    
        Set FL1 = Workbooks("Recap-Calcul-" & NomCarte).Worksheet("Recap")
        Set Plage1 = FL1.Range("A4:A" & FL1.UsedRange.Rows.Count)
        Set FL2 = Workbooks.Open(RepertoireTravail & "FIDES-" & NomCarte & ".xls").Worksheets("Recap-Fides")
        Set Plage2 = FL1.Range("B8:B" & FL2.UsedRange.Rows.Count)
        For each Cell1 in Plage1
             For each Cell2 in Plage2
                  If not FL1.Range("A" & i).Value <> FL2.Range("A" & j).Value Then _
                     exit For
             Next
             sh.Range("B" & (k + 1)) = FL1.Cell1.Value
    
        Next
    En rouge : Tu écris toujours sur la même adresse ? Avec ce code, k n'est incrémenté qu'une fois
    Tu vois ce que tu peux faire
    Un conseil : N'utilise JAMAIS de goto dans une boucle ! Tu vas faire planter ton appli avec perte des modifs.
    Dans ton code, tu pouvais le remplacer par "Exit do"
    Tu dis
    A+

    Edit
    Je remarque aussi que tu parcours la colonne B de FL2 et tu mets
    If FL1.Range("A" & i).Value <> FL2.Range("A" & j).Value Then
    Tu vois ça aussi

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    175
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 175
    Par défaut
    Merci ouskel'n'or pour ton code et tes conseils.

    j'ai repris ton code (sympa le coup des plages ), mais j'ai le même problème mon fichier s'ouvre et j'ai juste ma cellule A1 de remplie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sh.Range("A1") = "Composants manquants dans Recap-Fides"
    Citation Envoyé par ouskel'n'or
    Edit
    Je remarque aussi que tu parcours la colonne B de FL2 et tu mets
    Citation:
    If FL1.Range("A" & i).Value <> FL2.Range("A" & j).Value Then
    En fait FL1 appartient à un classeur, et FL2 à un autre. et les 2 plages sont situées en "A" de leur feuille respective.

    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
    Dim Plage1 As Range
        Dim Plage2 As Range
    
        Workbooks.Add (1)
        ActiveWorkbook.SaveAs RepertoireTravail & "Composants_manquants-" & NomCarte & ".xls"
        Set sh = ActiveWorkbook.Worksheets.Add
        sh.Name = "Composants manquants"
        sh.Range("A1") = "Composants manquants dans Recap-Fides"
    
        Set FL1 = Workbooks("Recap-Calcul-" & NomCarte & "xls").Worksheet("Récap")
        Set Plage1 = FL1.Range("A4:A" & FL1.UsedRange.Rows.Count)
        Set FL2 = Workbooks.Open(RepertoireTravail & "FIDES-" & NomCarte & ".xls").Worksheets("Recap-Fides")
        Set Plage2 = FL2.Range("A8:A" & FL2.UsedRange.Rows.Count)
        
        For Each Cell1 In Plage1
             For Each Cell2 In Plage2
                  If Not FL1.Range("A" & i).Value <> FL2.Range("A" & j).Value Then _
                     Exit For
             Next
             sh.Range("A" & (k + 1)) = FL1.Cell1.Value
             k = k + 1
    
        Next
    Je ne comprend pas comment est incrémenté i et j dans ce passage là du code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FL1.Range("A" & i).Value <> FL2.Range("A" & j)
    faut-il rajouter i=i+1 et j=j+1 avec des for each?

    A+

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut

    Dans ma boucle, j'ai oublié de modifier les deux lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        For each Cell1 in Plage1
             For each Cell2 in Plage2
                  If not Cell1.Value <> Cell2.value Then _
                     exit For
             Next
             sh.Range("B" & (k + 1)) = Cell1.Value
     
        Next
    J'ai dû être interrompu en cours de modif Désolé
    Teste ça et dis-moi
    A+

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    175
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 175
    Par défaut
    Ca me rassure
    Rajouter i=i+1 et j=j+1 avec des for each


    j'ai testé et toujours pas de liste dans "composants manquants"

    j'ai rajouté des MsgBox pour voir ce qu'il y avait comme valeur dans FL1.UsedRange.Rows.Count et FL2.UsedRange.Rows.Count
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        MsgBox "FL1.UsedRange.Rows.Count=" & FL1.UsedRange.Rows.Count
        MsgBox "FL2.UsedRange.Rows.Count=" & FL2.UsedRange.Rows.Count
    et j'ai un message juste pour FL2.UsedRange.Rows.Count
    je pense que le code bloque au niveau de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set FL1 = Workbooks("Recap-Calcul-" & NomCarte & "xls").Worksheets("Récap")
    Est ce que ma syntaxe est bonne sachant que mon fichier est déjà ouvert à l'exécution du code? (contrairement à FL2)

    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
        Dim Plage1 As Range
        Dim Plage2 As Range
        Dim FL1 As Worksheet
        Dim FL2 As Worksheet
    
        Workbooks.Add (1)
        ActiveWorkbook.SaveAs RepertoireTravail & "Composants_manquants-" & NomCarte & ".xls"
        Set sh = ActiveWorkbook.Worksheets.Add
        sh.Name = "Composants manquants"
        sh.Range("A1") = "Composants manquants dans Recap-Fides"
    
        Set FL1 = Workbooks("Recap-Calcul-" & NomCarte & "xls").Worksheets("Récap")
        Set Plage1 = FL1.Range("A4:A" & FL1.UsedRange.Rows.Count)
        Set FL2 = Workbooks.Open(RepertoireTravail & "FIDES-" & NomCarte & ".xls").Worksheets("Recap-Fides")
        Set Plage2 = FL2.Range("A8:A" & FL2.UsedRange.Rows.Count)
        
        MsgBox "FL1.UsedRange.Rows.Count=" & FL1.UsedRange.Rows.Count
        MsgBox "FL2.UsedRange.Rows.Count=" & FL2.UsedRange.Rows.Count
        
        For Each Cell1 In Plage1
             For Each Cell2 In Plage2
                  If Not Cell1.Value <> Cell2.Value Then _
                     Exit For
             Next
             sh.Range("A" & (k + 1)) = Cell1.Value
             k = k + 1
        Next

  6. #6
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    175
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 175
    Par défaut
    les cellules a copier sont des liens hypertexte,
    peut-être que mon problème vient de là?

    Cordialement
    alex.a

  7. #7
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Et le point, alors ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set FL1 = Workbooks("Recap-Calcul-" & NomCarte & ".xls").Worksheets("Récap")

  8. #8
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    175
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 175
    Par défaut
    merci désolé

    Ya du mieux, il me liste toutes les cellules présentes dans FL1.Range("A4:A" & FL1.UsedRange.Rows.Count), mais pas celle seulement dans ce fichier.


    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 Plage1 As Range
        Dim Plage2 As Range
        Dim FL1 As Worksheet
        Dim FL2 As Worksheet
     
        Workbooks.Add (1)
        ActiveWorkbook.SaveAs RepertoireTravail & "Composants_manquants-" & NomCarte & ".xls"
        Set sh = ActiveWorkbook.Worksheets.Add
        sh.Name = "Composants manquants"
        sh.Range("A1") = "Composants manquants dans Recap-Fides"
        Worksheets("Feuil1").Delete
     
        Set FL1 = Workbooks("Recap-Calcul-" & NomCarte & ".xls").Worksheets("Récap")
        Set Plage1 = FL1.Range("A4:A" & FL1.UsedRange.Rows.Count)
        Set FL2 = Workbooks.Open(RepertoireTravail & "FIDES-" & NomCarte & ".xls").Worksheets("Recap-Fides")
        Set Plage2 = FL2.Range("A8:A" & FL2.UsedRange.Rows.Count)
     
        k = 1
        For Each Cell1 In Plage1
             For Each Cell2 In Plage2
                  If Not Cell1.Value <> Cell2.Value Then _
                     Exit For
             Next
             sh.Range("A" & (k + 1)) = Cell1.Value
             k = k + 1
        Next

  9. #9
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Tu peux préciser ? Je ne comprends pas le pb.
    Là, tu cherches dans une feuille 2 un élément se trouvant sur la feuille 1.
    Quand l'égalité est trouvée, tu colles la donnée dans sh et tu passes à la cellule suivante dans F1
    Pour ça, tu parcours F1, cellule par cellule, et pour chaque cellule tu parcours feuille 2 à la recherche de même valeur. Il faut bien que tu parcours les deux feuilles.
    En fait je suis parti de ton idée de deux boucles Do While imbriquées...
    Quel est le pb ?
    A+

  10. #10
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    175
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 175
    Par défaut
    Je souhaiterais avoir la liste des valeurs de la feuille 1 qui ne sont pas dans la feuille 2.

    Le problème est que pour l'instant le code ne fait pas ce que je souhaite.
    Citation Envoyé par ouskel'n'or
    Là, tu cherches dans une feuille 2 un élément se trouvant sur la feuille 1.
    Quand l'égalité est trouvée, tu colles la donnée dans sh et tu passes à la cellule suivante dans F1
    je voudrais que si la donnée n'est pas trouvé dans la feuille 2, je la colle dans sh, et si l'égalité est trouvée je passe à la cellule de la feuille 1 suivante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    k = 1
        For Each Cell1 In Plage1
             For Each Cell2 In Plage2
                  If Not Cell1.Value <> Cell2.Value Then _
                     Exit For
             Next
             sh.Range("A" & (k + 1)) = Cell1.Value
             k = k + 1
        Next
    j'ai un peu de mal, mais il faudrait que le exit for renvoit à la cellule de Cell1 suivante.

  11. #11
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    175
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 175
    Par défaut
    En fait ça marche avec un goto
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    k = 1
        For Each Cell1 In Plage1
             For Each Cell2 In Plage2
                  If Not Cell1.Value <> Cell2.Value Then _
                  GoTo line9
             Next
             sh.Range("A" & (k + 1)) = Cell1.Value
             k = k + 1
    line9:
        Next

    Citation Envoyé par ouskel'n'or
    Un conseil : N'utilise JAMAIS de goto dans une boucle ! Tu vas faire planter ton appli avec perte des modifs.
    Ya t-il un autre moyen qui soit plus sur pour l'appli?
    merci

  12. #12
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Déclare un boolean et utilise-le comme condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    k = 1
        Dim Quitter as boolean
        For Each Cell1 In Plage1
             For Each Cell2 In Plage2
                  Quitter = not  Cell1.Value <> Cell2.Value
                  if quitter then Exit For
             Next
             if not quitter Then 
                  sh.Range("A" & (k + 1)) = Cell1.Value
                  k = k + 1
             endif
        Next
    Jamais de goto, surtout pas dans une boucle (sauf pour gestion d'erreur conduisant à la sortie de la macro) Parfaitement !

  13. #13
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    175
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 175
    Par défaut
    Ca marche

    Un grand à toi ouskel'n'or

    ps: en fait merci pour chaqu'une de tes réponses

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 18/05/2015, 12h31
  2. Réponses: 12
    Dernier message: 14/05/2008, 17h15
  3. Réponses: 8
    Dernier message: 09/11/2006, 14h01
  4. lister les valeurs d'un champs de type enum...
    Par korrigann dans le forum Requêtes
    Réponses: 6
    Dernier message: 27/04/2006, 15h44
  5. sélectionner les lignes différentes entre 2 tables
    Par PAYASS59 dans le forum Requêtes
    Réponses: 2
    Dernier message: 19/09/2005, 14h05

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