Rechercher une plage identique dans BdD
Bonjour à toutes et tous,
Voici mon souci.
J'ai 2 feuilles, 1 nommée "BdD" et l'autre "Feuil1" d'ou je fais ma recherche.
Dans une plage de cellules j'ai des données qui peuvent êtres numériques ou alphabétiques.
Dans l'exemple joins, ces données sont sur une plage de 7 lignes et 5 colonnes, mais c'est pour vous simplifier mon exemple, car en réalité, dans la base de donnée, c'est + de 5000 lignes sur 22 colonnes.
Mon but est de rechercher si, dans ma base de données j'ai déjà une (ou plusieurs) plage(s) de données identiques à la plage entière de la feuille 1, et que je puisse rapidement la retrouver dans la base de données, soit en donnant le n° de la première ligne de la ou les plage(s) concernée(s)
J'ai essayé un TCD, mais je n'arrive pas au résultat rechercher, également par rechercheV et H, mais le résultat est idem.
Est-ce faisable avec une formule Excel ? (j'en doute)
Ou alors avec un code VBA ? (plus plausible)
Ou tout simplement impossible
Pourriez-vous me dire ce que vous en pensez.
Merci d'avance pour vos conseil et aide.
Cordialement
Dubdub22
Bonjour,
Une piste :
Sub Test()
Dim PlgBase As Range
Dim PlgRech As Range
Dim Cel As Range
Dim CelTrouve As Range
Dim Tbl()
Dim I As Long
Dim J As Long
Dim K As Integer
Dim L As Long
Dim Chaine1 As String
Dim Chaine2 As String
Dim Message As String
Dim Adr As String
'défini les plages sur toute la feuille à partir de A5
Set PlgRech = DefPlage(Worksheets("Feuil1"), 5)
Set PlgBase = DefPlage(Worksheets("BdD"), 5)
'les deux plages doivent avoir le même nombre de colonnes
If PlgRech.Rows(1).Cells.Count <> PlgBase.Rows(1).Cells.Count Then
MsgBox "Les plages n'ont pas le même nombre de colonnes, ceci va mettre fin à la procédure !": Exit Sub
End If
'une fois le contrôle effectué, la plage est définie seulement sur la colonne A à partir de A5
With Worksheets("BdD"): Set PlgBase = .Range(.Cells(5, 1), .Cells(.Rows.Count, 1).End(xlUp)): End With
'concatène les valeurs devant être recherchées
For Each Cel In PlgRech: Chaine1 = Chaine1 & Cel.Value: Next Cel
'recherche le premier caractère de la plage dans la colonne A de la feuille "BdD"
Set CelTrouve = PlgBase.Find(PlgRech(1, 1).Value, , xlValues, xlWhole)
If Not CelTrouve Is Nothing Then
Adr = CelTrouve.Address
Do
J = CelTrouve.Row
Chaine2 = ""
'concatène le nombre de caractères identique à la chaîne Chaine1
For I = 1 To PlgRech.Count
K = K + 1
If K > PlgRech.Rows(1).Cells.Count Then: K = 1: J = J + 1
Chaine2 = Chaine2 & Worksheets("BdD").Cells(J, K).Value
Next I
K = 0: J = 0
'si les deux chaînes son identiques, stocke l'adresse de la cellule se trouvant
'en haut et à gauche de la plage (donc, la cellule ayant la valeur cherchée)
If Chaine1 = Chaine2 Then
L = L + 1: ReDim Preserve Tbl(1 To L)
Tbl(L) = CelTrouve.Address(0, 0)
End If
'continue la recherche
Set CelTrouve = PlgBase.FindNext(CelTrouve)
Loop While CelTrouve.Address <> Adr
End If
'si le tableau a été initialisé, concatène pour le message
If Not Not Tbl Then
For I = 1 To UBound(Tbl): Message = Message & Tbl(I) & vbCrLf: Next I
MsgBox "La série a été trouvée dans les cellules :" & vbCrLf & Message
End If
End Sub
Function DefPlage(Fe As Worksheet, Optional L As Long = 1, Optional C As Long = 1) As Range
On Error GoTo Fin
With Fe
Set DefPlage = .Range(.Cells(L, C), _
.Cells(.Cells.Find("*", .[A1], -4123, , _
1, 2).Row, .Cells.Find("*", .[A1], -4123, , _
2, 2).Column))
End With
Exit Function
Fin:
Set DefPlage = Nothing
End FunctionCe code a été fait en fonction de ton classeur exemple, si l'original est construit différemment, il te faudra adapter !
Bonjour Thèse,
Merci pour votre réponse rapide et efficace, cela fonctionne parfaitement après adaptation à mon fichier.
Juste une petite demande, sauriez-vous si j'ai plusieurs fois une plage identique, si le code va me les détectées également, je n'ai pas regardé, trop content de ce que vous avez fait en 1 ou deux heures, alors que je planche sur le sujet depuis plus de quinze jours, sans aucun résultat.
Encore merci
Cordialement
Dubdub22
Bonjour,
Juste une petite demande, sauriez-vous si j'ai plusieurs fois une plage identique, si le code va me les détectées également
Désolé, je ne saisis pas bien le sens de ta demande
"Plusieurs fois un plage identique" mais c'est ce que fait le code puisqu'il trouve deux fois la séquence dans ton fichier exemple !
Ou alors il y a quelque chose qui m'échappe
Bonjour Theze,
Merci pour ta réponse, effectivement je n'ai pour le moment pas trouvé de plages identiques sur mon fichier, alors suite à ta réponse j'ai fait un essai sur le fichier test, et effectivement, cela fonctionne parfaitement, il me met bien deux n° de cellule.
Encore merci de ton aide, rapide et efficace
Cordialement
Dubdub22
Content de t'avoir aidé