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
| Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
'Déclarations ============================================
Dim Cel As Range
Dim F As Worksheet
Dim Tab_V()
Dim Doublon()
Dim X As Long, Y As Long
Dim Flg As Boolean
Dim AAA As String
'Validit =================================================
If Intersect(Target, Sh.Range("A:B")) Is Nothing Then Exit Sub
'si ça ne concerne pas A ou B, on sort
'MEI =====================================================
ReDim Tab_V(1 To 4, 0 To 0)
'dimensionnement du tableau : 1 ligne de 4 colonnes par cellules
'Chargement du tableau ===================================
Flg = True
'Drapeau à Vrai
For Each Cel In Intersect(Target, Sh.Range("A:B"))
'chaque cellule contenue dans
'intersection cellules modifiées-colonnes A ou B de la feuille en cours
If Not (IsEmpty(Sh.Cells(Cel.Row, "A")) Or IsEmpty(Sh.Cells(Cel.Row, "B"))) Then
'les colonnes A et B de la ligne de la cellule ne sont pas vide
For X = 0 To UBound(Tab_V, 2)
'pour x= 1 à dernier indice 2 du tableau
If Tab_V(4, X) = Cel.Row Then
'si la ligne de la cellule en cours est égale à la colonne
'4 de la ligne du tableau testée (onglet reste le même)
Flg = False
'drapeau à Faux
Exit For
'sortir de la boucle
End If
Next X
If Flg Then
'si drapeau à vrai
ReDim Preserve Tab_V(1 To 4, 0 To UBound(Tab_V, 2) + 1)
'augmenter de 1 le nb de lignes du tableau en conservant les
'variables déjà remplies
Tab_V(1, UBound(Tab_V, 2)) = Cells(Cel.Row, "A")
'1re colonne = A
Tab_V(2, UBound(Tab_V, 2)) = Cells(Cel.Row, "B")
'2me colonne = B
Tab_V(3, UBound(Tab_V, 2)) = Sh.Name
'3me colonne = nom de la feuille
Tab_V(4, UBound(Tab_V, 2)) = Cel.Row
'4me colonne = n°ligne
Else
Flg = True
End If
End If
Next Cel
'validité de recgerche des doublons ======================
If UBound(Tab_V, 2) = 0 Then Exit Sub
'si l'indice max de ligne est resté à 0, on sort
ReDim Doublon(1 To 2, 0 To 0)
'initialisation tableu 2 indice (1 à 2, 0 à 0)
'Recherche et stockage des doublons ======================
For Each F In ThisWorkbook.Sheets
'pour chaque feuille de ce classeur
For Y = 1 To IIf(F.Range("B65536").End(xlUp).Row > F.Range("A65536").End(xlUp).Row, _
F.Range("A65536").End(xlUp).Row, F.Range("B65536").End(xlUp).Row)
'Pour Y=1 à si(dernière ligne en B > dernière ligne en A alors A sinon B)
For X = 1 To UBound(Tab_V, 2)
'pour x=1 à dernier indice du 2ème indice
If Tab_V(1, X) = F.Range("A" & Y) And _
Tab_V(2, X) = F.Range("B" & Y) And _
(Tab_V(3, X) <> F.Name Or _
Tab_V(4, X) <> Y) Then
'si A ET B = TAB_V(A & B) ET
'[(onglet<>tab_v(onglet)) ou (lig<>tab_v(lig)] alors
' traitement doublon
ReDim Preserve Doublon(1 To 2, 0 To UBound(Doublon, 2) + 2)
'on ajoute 2 à l'indice max
Doublon(1, UBound(Doublon, 2) - 1) = F.Name
Doublon(2, UBound(Doublon, 2) - 1) = Y
Doublon(1, UBound(Doublon, 2)) = Tab_V(3, X)
Doublon(2, UBound(Doublon, 2)) = Tab_V(4, X)
Exit For
End If
Next X
Next Y
Next F
'validité d'affichage des doublons =======================
If UBound(Doublon, 2) = 0 Then Exit Sub
'si le max du 2me indice de doublon =0 on sort
'affichage des doublons ==================================
For X = 1 To UBound(Doublon, 2)
With Sheets(Doublon(1, X))
'mise en préfixe de la feuille
If .Rows(1).Hidden = False Then
'si la 1re ligne(ligne de titre) n'est pas masquée, alors
.UsedRange.Rows.Hidden = True
'le point en début rajoute le préfixe
'on masque les lignes
End If
.Rows(Doublon(2, X)).Hidden = False
'on affiche la ligne du doublon
End With
Next X
MsgBox Chr(13) & "Les lignes affichées contiennent des doublons" & _
Chr(13) & "merci de les traiter" & Chr(13), vbCritical + vbOKOnly, _
"DOUBLONS TROUVÉS"
End Sub |
Partager