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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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

+ 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