XL 2013 Code VBA pour comparer deux colonnes et extraction des différences

Cyrilou44

XLDnaute Nouveau
Bonjour,

j'essaye d'adapter une macro (qui se nomme "Comparaison") trouver sur un forum pour comparer deux colonnes de deux feuilles différentes, la colonne C (comparaison à partir de la ligne 5) de l'onglet "Gestion alarmes disable inhibit" et la colonne E (comparaison à partir de la ligne 2) de l'onglet "Export client event" et une fois la comparaison faite je souhaiterai extraire la liste des différences et qu'elle apparaisse à partir de P5 sur l'onglet "Gestion alarmes disable inhibit".

Merci pour votre aide.
 

Pièces jointes

  • Alarmes inhibit disable DEE.xlsm
    72.8 KB · Affichages: 21

Bebere

XLDnaute Barbatruc
Bonjour
Cyrilou bienvenue
but supprimer les égalités et mettre les différences en P
VB:
Sub Comparaison()
    Dim Plag1 As Range, Plag2 As Range, L As Long
    Dim Tablo1, Tablo2, aa()
    Dim a As Long, B As Integer, C As Long, D As Integer

    Sheets("Gestion alarmes disable inhibit").Select
    Range("P5:P200").ClearContents    'efface la plage de réception

    Application.ScreenUpdating = False
    L = Sheets("Gestion alarmes disable inhibit").Range("C65000").End(xlUp).Row
    Set Plag1 = Sheets("Gestion alarmes disable inhibit").Range("C5:C" & L)    'première plage de recherche
    L = Sheets("Export client event").Range("E65000").End(xlUp).Row

    Set Plag2 = Sheets("Export client event").Range("E2:E" & L)    'plage de comparaison
    'Set Plag3 = Sheets("Gestion alarmes disable inhibit").Range("P5") 'début de plage de réception des différences
    'comparaison des plages

    'If Plag1.Rows.Count <> Plag2.Rows.Count Then
    'MsgBox "Les plages à comparer ne sont pas identiques"
    'Exit Sub
    'End If

    Tablo1 = Plag1: Tablo2 = Plag2: D = 1
    For B = 1 To UBound(Tablo2, 1)
        For a = 1 To UBound(Tablo1, 1)
            If Tablo1(a, 1) = Tablo2(B, 1) Then
                C = C + 1
                'Plag3(C, D) = Tablo1(A, B)
                Tablo1(a, 1) = "": Tablo2(B, 1) = ""    'supprime les égaux
            End If
        Next
    Next

    For a = 1 To UBound(Tablo1, 1)
        If Tablo1(a, 1) <> "" Then C = C + 1: ReDim Preserve aa(1 To 1, 1 To C): aa(1, C) = Tablo1(a, 1)
    Next

    For B = 1 To UBound(Tablo2, 1)
        If Tablo2(B, 1) <> "" Then C = C + 1: ReDim Preserve aa(1 To 1, 1 To C): aa(1, C) = Tablo2(B, 1)
    Next
    aa = Application.Transpose(aa)
    Sheets("Gestion alarmes disable inhibit").Range("P5").Resize(UBound(aa, 1), 1) = aa
End Sub
 

Cyrilou44

XLDnaute Nouveau
Bonjour,

Merci pour la réponse. Après test, je m'aperçoit que je n'ai pas l'extraction des différences dans la colonne P mais plutôt un copier coller des deux colonnes à comparer.

Sub Comparaison()
Dim Plag1 As Range, Plag2 As Range, L As Long
Dim Tablo1, Tablo2, aa()
Dim a As Long, B As Integer, C As Long, D As Integer

L = Sheets("Gestion alarmes disable inhibit").Range("C65000").End(xlUp).Row
Set Plag1 = Sheets("Gestion alarmes disable inhibit").Range("C5:C" & L) 'première plage de recherche
L = Sheets("Export client event").Range("E65000").End(xlUp).Row

Set Plag2 = Sheets("Export client event").Range("E2:E" & L) 'plage de comparaison
'Set Plag3 = Sheets("Gestion alarmes disable inhibit").Range("P5") 'début de plage de réception des différences
'comparaison des plages

'If Plag1.Rows.Count <> Plag2.Rows.Count Then
'MsgBox "Les plages à comparer ne sont pas identiques"
'Exit Sub
'End If

Sheets("Gestion alarmes disable inhibit").Select
Range("P5:p200").ClearContents 'efface la plage de réception
Application.ScreenUpdating = False
Tablo1 = Plag1: Tablo2 = Plag2: D = 1
For B = 1 To UBound(Tablo2, 1)
For a = 1 To UBound(Tablo1, 1)
If Tablo1(a, 1) = Tablo2(B, 1) Then
C = C + 1
'Plag3(C, D) = Tablo1(A, B)
Tablo1(a, 1) = "": Tablo2(B, 1) = "" 'supprime les égaux
End If
Next
Next

For a = 1 To UBound(Tablo1, 1)
If Tablo1(a, 1) <> "" Then C = C + 1: ReDim Preserve aa(1 To 1, 1 To C): aa(1, C) = Tablo1(a, 1)
Next

For B = 1 To UBound(Tablo2, 1)
If Tablo2(B, 1) <> "" Then C = C + 1: ReDim Preserve aa(1 To 1, 1 To C): aa(1, C) = Tablo2(B, 1)
Next
aa = Application.Transpose(aa)
Sheets("Gestion alarmes disable inhibit").Range("P5").Resize(UBound(aa, 1), 1) = aa
End Sub
 

chris

XLDnaute Barbatruc
Bonjour à tous
Merci pour la réponse. Après test, je m'aperçoit que je n'ai pas l'extraction des différences dans la colonne P mais plutôt un copier coller des deux colonnes à comparer.

Aucun point commun entre les deux listes : ceci explique cela.
A noter qu'il existe un doublon sur l'ongtet Gestion alarmes disable inhibit

Tu n'utilises pas correctement les tableaux structurés :
  • pourquoi ne pas avoir utilisé la ligne 3 de l'onglet Gestion alarmes disable inhibit comme titres du tableau TBaseDonnee ?
  • pourquoi des lignes vides
Par ailleurs quand on se réfère à des tableaux en VBA, il faut se servir des objets ListObjects et non des plages classiques et on ne réfère plus à la ligne 65000 depuis 12 ans où Excel en a plus d'un million...

Faisable aisément avec PowerQuery en addon à partir de 2010 et intégré à partir de 2016
 
Dernière édition:

chris

XLDnaute Barbatruc
Re

Comme indiqué cela nécessite d'installer l'add on si tu as 2013

Sinon si tu utilises correctement les deux bases avec 2 tableaux structurés respectant les règles (tableau TBaseDonnee intégrant le ligne 3 et sans aucune ligne vide et la plage de l'onglet Export client event mise sous forme de tableau nommé Export)
le code amendé ainsi fonctionne mais, comme déjà dit, les points étant tous différents tu obtiens l'union des deux...
VB:
Sub Comparaison()
Dim Plag1 As Range, Plag2 As Range
Dim Tablo1, Tablo2, aa()
Dim a As Long, B As Integer, C As Long, D As Integer

Set Plag1 = Sheets("Gestion alarmes disable inhibit").ListObjects("TBaseDonnee").ListColumns(1).DataBodyRange 'première plage de recherche

Set Plag2 = Sheets("Export client event").ListObjects("Export").ListColumns(5).DataBodyRange 'plage de comparaison

Sheets("Gestion alarmes disable inhibit").Select

Range("P4:p2000").ClearContents 'efface la plage de réception
Application.ScreenUpdating = False
Tablo1 = Plag1: Tablo2 = Plag2: D = 1
For B = 1 To UBound(Tablo2, 1)
    For a = 1 To UBound(Tablo1, 1)
        If Tablo1(a, 1) = Tablo2(B, 1) Then
            C = C + 1
            Tablo1(a, 1) = "": Tablo2(B, 1) = "" 'supprime les égaux
        End If
    Next
Next

For a = 1 To UBound(Tablo1, 1)
    If Tablo1(a, 1) <> "" Then C = C + 1: ReDim Preserve aa(1 To 1, 1 To C): aa(1, C) = Tablo1(a, 1)
Next

For B = 1 To UBound(Tablo2, 1)
    If Tablo2(B, 1) <> "" Then C = C + 1: ReDim Preserve aa(1 To 1, 1 To C): aa(1, C) = Tablo2(B, 1)
Next
aa = Application.Transpose(aa)
Sheets("Gestion alarmes disable inhibit").Range("P4").Resize(UBound(aa, 1), 1) = aa

End Sub
 

chris

XLDnaute Barbatruc
Re

Pour le code tu n'as respecté les préalables
Sinon si tu utilises correctement les deux bases avec 2 tableaux structurés respectant les règles (tableau TBaseDonnee intégrant le ligne 3 et sans aucune ligne vide et la plage de l'onglet Export client event mise sous forme de tableau nommé Export)

J'ai vu que tu as installé PowerQuery.
Pas le temps maintenant mais je regarderai ce soir et te dirais quoi corriger
 

chris

XLDnaute Barbatruc
Re

Donc supprimer les lignes vides de TBaseDonnee (qui s'arrête donc à la ligne 97)
Nommer le tableau de l'onglet Export client event Export et ne pas laisser Tableau2. Le tableau s'arrête à la ligne 15

Dans les deux cas je te conseille de supprimer physiquement les lignes en trop car elles semblent ne pas être réellement vides.

Supprimer le contenu de la cellule P3 de l'onglet Gestion alarmes disable inhibit

Pour ajouter un tableau à PowerQuery : Onglet PowerQuery, A partir d'un tableau
Après l'ouverture de PowerQuery au 1er ajout, sortir par Fermer et Charger dans, Connexion seulement afin de ne pas dupliquer tous azimuts les tableaux
Une fois les 2 requêtes dans PowerQuery :
  • Sur la requête TBaseDonnee
    • sélectionner la colonne Repère du point,
      • clic droit, supprimer les autres colonnes
      • clic droit supprimer les doublons
  • Sur la requête Export
    • sélectionner la colonne Point et effectuer les mêmes manip
    • changer son titre en Repère du point
  • Créer une nouvelle requête :
    • clic droit à gauche sous la liste des requêtes : Nouvelle requête, Combiner, Ajouter les requêtes comme nouvelles
    • sélectionner TBaseDonnee en primaire et Export en seconde table et valider
      L'ensemble des points des 2 sources est listé
    • Onglet Transformer, Regrouper : regrouper par repère, opération compter les lignes
    • Filtrer la nouvelle colonne : Filtre numérique =1 (permet d'éliminer ceux qui existe dans les 2 listes)
    • Supprimer la colonne
    • trier la colonne Point
    • Renommer la requête Ecart
  • Sortir par Fermer et Charger dans, Connexion seulement
Dans Excel se placer en P3 de l'onglet de l'onglet Gestion alarmes disable inhibit, onglet Données, Connexions existantes, sélectionner Ecart

Pour mettre à jour il suffira d'utiliser Données, Actualiser Tout
 
Dernière édition:

Discussions similaires

Réponses
22
Affichages
734

Statistiques des forums

Discussions
312 046
Messages
2 084 850
Membres
102 686
dernier inscrit
Franck6950