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 :

Cherche lignes pas en double


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2013
    Messages : 38
    Par défaut Cherche lignes pas en double
    Bonjour à tous,

    Dans le tableau ci joint il y a 3 onglets : "Listing_vide_chaine" ; "MH ENTRANT" ; "MH SORTANT".
    je voudrais faire une macro qui va comparer les tableaux des deux onglet "MH ENTRANT" et "MH SORTANT".
    Et pour chaque ligne qui n'est PAS dans les deux tableaux d’après la colonne 1 ("Opération") et la colonne ("Code article"), la ligne soit copié dans l'onglet "Listing_vide_chaine".

    J'ai essayé de quelque chose, mais avec les boucle for et if je suis rapidement limité et cela semble très chronophage.

    Listing vide de ligne Vers_A.xlsm

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    Public BDD As FileDialog 'déclare la variable BDD (Boîte de Dialogue Dossier)
    Public CA As String 'déclare la variable CA (Chemin d'Accès)
    Public CD As Workbook 'déclare la variable CD (Classeur Destination)
    Public OD As Worksheet 'déclare la variable OD (Onglet Destination)
    Public FS_SORTIE As String 'décalre la variable FS (Fichier Source)
    Public FS_ENTRANT As String 'décalre la variable FS (Fichier Source)
    Public CS_SORTIE As Workbook 'déclare la variable CS (Classeur Source)
    Public OS_SORTIE As Worksheet 'déclare la variable OS (Onglet Source
    Public MH_SORTIE As String
    Public CS_ENTRANT As Workbook 'déclare la variable CS (Classeur Source)
    Public OS_ENTRANT As Worksheet 'déclare la variable OS (Onglet Source)
    Public MH_ENTRANT As String
    Public DEST As Range 'déclare la variable DEST (celllue de DESTination)
    Public Derligne_1 As Long
    Public Derligne_2 As Long
    Public Derligne_3 As Long
    Public Num_ope_entrant As Long
    Public Num_ope_sortie As Long
    Public LigneA As Long
    Public LigneB As Long
    Public Art_entrant As String
    Public Art_sortie As String
    Public rng As Range
     
    Sub Comparatif_données()
     
    Derligne_1 = Worksheets(3).Cells(Rows.Count, 1).End(xlUp).Row 'cherche la derniere ligne du tableau
    Derligne_2 = Worksheets(4).Cells(Rows.Count, 1).End(xlUp).Row 'cherche la derniere ligne du tableau
     
     
    For LigneA = Derligne_1 To 2 Step -1
        Num_ope_sortie = Worksheets(3).Cells(LigneA, 1).Value
        Art_sortie = Worksheets(3).Cells(LigneA, 3).Value
     
            For LigneB = Derligne_2 To 2 Step -1
                Num_ope_entrant = Worksheets(4).Cells(LigneB, 1).Value
                Art_entrant = Worksheets(4).Cells(LigneB, 3).Value
     
                    If Num_ope_sortie = Num_ope_entrant Then
     
                        If Art_sortie <> Art_entrant Then
                            Worksheets(3).Activate
                            Range(Cells(LigneA, 1), Cells(LigneA, 6)).Select
                            Selection.Copy
                            Worksheets(2).Activate
                            Derligne_3 = Worksheets(2).Cells(Rows.Count, 1).End(xlUp).Row 'cherche la derniere ligne du tableau
                            Cells(Derligne_3 + 1, 1).Select
                            ActiveSheet.Paste
                        End If
     
                    End If
     
            Next
     
    Next
     
    End Sub
    Si quelqu'un a une idée.

    merci

  2. #2
    Membre Expert
    Homme Profil pro
    ingénieur
    Inscrit en
    Mars 2015
    Messages
    1 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ingénieur
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2015
    Messages : 1 290
    Par défaut
    Bonjour

    c'est très facile avec Power Query sans aucune macro
    vous transformez vos 2 plages en tableau structurés (Menu Insertion Tableau)
    vous chargez ces 2 tableaux dans Power Query (Menu Données/A partir d'un tableau ou d'une plage)
    Puis vous fusionnez vos 2 requêtes sur les 2 champs Opération et Code Article (Dans l'éditeur PQ : menu Accueil et Fusionner des requêtes)

    ensuite une jointure Gauche opposée vous donnera la liste des éléments de la première table qui sont absents de la seconde
    et inversement pour obtenir les éléments qui sont dans la seconde et pas dans la première

    vous chargez le résultat obtenu dans votre onglet "Listing_vide_chaine"

    Stéphane

  3. #3
    Membre émérite Avatar de Alex020181
    Homme Profil pro
    Prestataire informatique développeur d'application Excel, Access, VBA
    Inscrit en
    Juin 2012
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Prestataire informatique développeur d'application Excel, Access, VBA

    Informations forums :
    Inscription : Juin 2012
    Messages : 601
    Par défaut
    Bonjour,

    Tu partais d'un bon raisonnement mais en VBA il y a plus rapide.

    En PJ une proposition.

    Teste et dis-nous.
    Fichiers attachés Fichiers attachés

  4. #4
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2013
    Messages : 38
    Par défaut
    Bonjour à tous,

    Merci @Alex020181, ça marche super bien.

    Effectivement c'est plus rapide que mon idée de départ.
    Je vais étudier ton code pour une prochaine fois.

    Merci.

  5. #5
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2013
    Messages : 38
    Par défaut
    Bonjour,

    J'ai fait mis en commentaire une partie du code pour conserver uniquement les lignes uniques entre les tableaux MH ENTRANT et MH SORTANT et qui sont uniquement dans le tableau MH SORTANT.
    Dans l'ensemble ça fonctionne, mais il y a des moments ou il prend en compte des lignes qui sont en double dans les deux tableaux.
    je comprend pas d’où ça vient.

    Listing vide de ligne Vers_A avx(1).xlsm

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    Option Explicit
    Sub comparatif_donnees_lanceur()
     
    Dim colonne_cours As Long
     
    Dim nbre_lignes_max_colonne_cours As Long
    Dim nbre_lignes_max_mh_entrant As Long
    Dim nbre_lignes_max_mh_sortant As Long
     
    Dim tablo_entrant()
    Dim tablo_sortant()
    Dim tablo_final()
     
    Dim index_tablo_entrant As Long
    Dim index_tablo_sortant As Long
     
    Dim index_1_tablo_final As Long
    Dim index_2_tablo_final As Long
     
    Dim cle_cours As Variant
     
    Dim dico_entrant As Dictionary
    Set dico_entrant = New Dictionary
     
    Dim dico_sortant As Dictionary
    Set dico_sortant = New Dictionary
     
    On Error Resume Next
    Sheets("Listing_vide_chaine").ShowAllData
    Sheets("MH ENTRANT").ShowAllData
    Sheets("MH SORTANT").ShowAllData
    On Error GoTo 0
     
    Sheets("Listing_vide_chaine").Columns("A:XFD").EntireColumn.Hidden = False
    Sheets("Listing_vide_chaine").Rows("1:1048576").EntireRow.Hidden = False
     
    Sheets("MH ENTRANT").Columns("A:XFD").EntireColumn.Hidden = False
    Sheets("MH ENTRANT").Rows("1:1048576").EntireRow.Hidden = False
     
    Sheets("MH SORTANT").Columns("A:XFD").EntireColumn.Hidden = False
    Sheets("MH SORTANT").Rows("1:1048576").EntireRow.Hidden = False
     
    Sheets("Listing_vide_chaine").Range("A2:XFD1048576").Clear
     
    For colonne_cours = 1 To 5
     
        nbre_lignes_max_colonne_cours = Sheets("MH ENTRANT").Cells(1048576, colonne_cours).End(xlUp).Row
     
        If nbre_lignes_max_colonne_cours > nbre_lignes_max_mh_entrant Then
     
            nbre_lignes_max_mh_entrant = nbre_lignes_max_colonne_cours
     
        End If
     
    Next colonne_cours
     
    For colonne_cours = 1 To 5
     
        nbre_lignes_max_colonne_cours = Sheets("MH SORTANT").Cells(1048576, colonne_cours).End(xlUp).Row
     
        If nbre_lignes_max_colonne_cours > nbre_lignes_max_mh_sortant Then
     
            nbre_lignes_max_mh_sortant = nbre_lignes_max_colonne_cours
     
        End If
     
    Next colonne_cours
     
    If nbre_lignes_max_mh_entrant > 1 And nbre_lignes_max_mh_sortant > 1 Then
     
        tablo_entrant() = Sheets("MH ENTRANT").Range("A2:F" & nbre_lignes_max_mh_entrant).Value
        tablo_sortant() = Sheets("MH SORTANT").Range("A2:F" & nbre_lignes_max_mh_sortant).Value
     
        ReDim tablo_final(nbre_lignes_max_mh_entrant + nbre_lignes_max_mh_sortant - 1, 5)
     
        For index_tablo_entrant = 1 To nbre_lignes_max_mh_entrant - 1
     
            dico_entrant(tablo_entrant(index_tablo_entrant, 1) & " | " & tablo_entrant(index_tablo_entrant, 3)) = index_tablo_entrant + 1
     
        Next index_tablo_entrant
     
        For index_tablo_sortant = 1 To nbre_lignes_max_mh_sortant - 1
     
            dico_sortant(tablo_sortant(index_tablo_sortant, 1) & " | " & tablo_sortant(index_tablo_sortant, 3)) = index_tablo_sortant + 1
     
        Next index_tablo_sortant
     
    '    For Each cle_cours In dico_entrant.Keys
     
    '        If Not dico_sortant.Exists(cle_cours) Then
     
    '            For index_2_tablo_final = 0 To 5
     
    '                tablo_final(index_1_tablo_final, index_2_tablo_final) = tablo_entrant(dico_entrant(cle_cours), index_2_tablo_final + 1)
     
    '            Next index_2_tablo_final
     
    '            index_1_tablo_final = index_1_tablo_final + 1
     
    '        End If
     
    '    Next cle_cours
     
        For Each cle_cours In dico_sortant.Keys
     
            If Not dico_entrant.Exists(cle_cours) Then
     
                For index_2_tablo_final = 0 To 5
     
                    tablo_final(index_1_tablo_final, index_2_tablo_final) = tablo_sortant(dico_sortant(cle_cours), index_2_tablo_final + 1)
     
                Next index_2_tablo_final
     
                index_1_tablo_final = index_1_tablo_final + 1
     
            End If
     
        Next cle_cours
     
        If index_1_tablo_final > 0 Then
     
            Sheets("Listing_vide_chaine").Range("A2:F" & index_1_tablo_final + 1) = tablo_final
     
        End If
     
    End If
     
    MsgBox "Comparaison terminée", vbInformation, "C'est fait"
     
    End Sub
    merci

  6. #6
    Membre émérite Avatar de Alex020181
    Homme Profil pro
    Prestataire informatique développeur d'application Excel, Access, VBA
    Inscrit en
    Juin 2012
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Prestataire informatique développeur d'application Excel, Access, VBA

    Informations forums :
    Inscription : Juin 2012
    Messages : 601
    Par défaut
    Exact. Un décalage d'index dans mon code précédent (pour la faire courte le code ne récupérait ps la bonne valeur dans un tableau mémoire, il récupérait la valeur de l'index suivant).

    Correction en PJ.

    PS J'ai également traité dans cette version le cas de la comparaison des données qui ne seraient pas de la même casse (càd maj ou min)
    Fichiers attachés Fichiers attachés

  7. #7
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2013
    Messages : 38
    Par défaut
    Ca fonctionne super bien merci.

    Je me suis douté qu'il y avait un décalage dans un compteur mais j'ai pas vue le ReDim.

    Merci beaucoup

  8. #8
    Membre émérite Avatar de Alex020181
    Homme Profil pro
    Prestataire informatique développeur d'application Excel, Access, VBA
    Inscrit en
    Juin 2012
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Prestataire informatique développeur d'application Excel, Access, VBA

    Informations forums :
    Inscription : Juin 2012
    Messages : 601
    Par défaut
    Le ReDim n'était pas le souci. Je l'ai redimensionné uniquement par souci de prise en compte de la longueur du tableau.

    Le souci était dans l'index dans ces 2 lignes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    dico_entrant(tablo_entrant(index_tablo_entrant, 1) & " | " & tablo_entrant(index_tablo_entrant, 3)) = index_tablo_entrant + 1
    
    ...
    
    dico_sortant(tablo_sortant(index_tablo_sortant, 1) & " | " & tablo_sortant(index_tablo_sortant, 3)) = index_tablo_sortant + 1

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 30/01/2011, 11h53
  2. [POI] Deleter une ligne (pas mettre à blanc)
    Par Jabbal'H dans le forum Documents
    Réponses: 5
    Dernier message: 26/05/2008, 17h13
  3. Retour a la ligne pas pris en compte depuis un textarea
    Par avogadro dans le forum Langage
    Réponses: 3
    Dernier message: 26/11/2006, 04h37
  4. [.NET]Cherche ligne pour écrire dedans
    Par fab3131 dans le forum MFC
    Réponses: 7
    Dernier message: 02/06/2006, 14h21
  5. [Mail] Les sauts de lignes pas pris en compte
    Par Anduriel dans le forum Langage
    Réponses: 15
    Dernier message: 14/12/2005, 19h13

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