OVH Cloud OVH Cloud

Tri, doublons et homonymes

16 réponses
Avatar
Stéphane
Bonjour,
J'ai 2 bases de données sous Excel : Mailing1.xls et Mailing2.xls contenant
chacune les mêmes champs (Nom, Prénom, Adresse etc...)
Il faut que je récupére les données de Mailing2.xls et que je les intègre à
Mailing1.xls en prenant soin d'éliminer les doublons et ne pas écraser les
homonymes.
Ca fait des lustres que je me torture les mèninges et je patauge.
Auriez vous une piste.

D'avance merci
Stéphane

10 réponses

1 2
Avatar
naudy cédric
Le plus simple serait d'utiliser un base access avec une clé primaire...
Avec Excel, il faut gérer ça soi-même et ce n'est pas forcément évident.

Cédric

"Stéphane" wrote in message
news:bmh2fk$h0i$
Bonjour,
J'ai 2 bases de données sous Excel : Mailing1.xls et Mailing2.xls


contenant
chacune les mêmes champs (Nom, Prénom, Adresse etc...)
Il faut que je récupére les données de Mailing2.xls et que je les intègre


à
Mailing1.xls en prenant soin d'éliminer les doublons et ne pas écraser les
homonymes.
Ca fait des lustres que je me torture les mèninges et je patauge.
Auriez vous une piste.

D'avance merci
Stéphane




Avatar
Stéphane
"naudy cédric" a écrit dans le message de
news:
Le plus simple serait d'utiliser un base access avec une clé primaire...
Avec Excel, il faut gérer ça soi-même et ce n'est pas forcément évident.

Cédric



Tout à fait d'acord, mais mon pb est que ce n'est pas moi qui me sert de ces
fichiers, que les personnes qui les utilisent ne connaissent qu'Excel et que
c'est moi dois me débrouiller avec le schmilblic...

Stéphane


"Stéphane" wrote in message
news:bmh2fk$h0i$
> Bonjour,
> J'ai 2 bases de données sous Excel : Mailing1.xls et Mailing2.xls
contenant
> chacune les mêmes champs (Nom, Prénom, Adresse etc...)
> Il faut que je récupére les données de Mailing2.xls et que je les


intègre
à
> Mailing1.xls en prenant soin d'éliminer les doublons et ne pas écraser


les
> homonymes.
> Ca fait des lustres que je me torture les mèninges et je patauge.
> Auriez vous une piste.
>
> D'avance merci
> Stéphane
>
>




Avatar
Patrice Henrio
Quel est la différence entre doublon et homonymes. A partir de là, on doit
pouvoir automatiser le travail.

"Stéphane" a écrit dans le message de
news:bmh2fk$h0i$
Bonjour,
J'ai 2 bases de données sous Excel : Mailing1.xls et Mailing2.xls


contenant
chacune les mêmes champs (Nom, Prénom, Adresse etc...)
Il faut que je récupére les données de Mailing2.xls et que je les intègre


à
Mailing1.xls en prenant soin d'éliminer les doublons et ne pas écraser les
homonymes.
Ca fait des lustres que je me torture les mèninges et je patauge.
Auriez vous une piste.

D'avance merci
Stéphane




Avatar
Hervé
Salut Stéphane,
Code issu du VBE d'Excel donc à adapter (relation tardives ou précoce).Le
code utilise ADO, à toi de voir si cela convient. Dans ce cas de figure, les
2 classeurs doivent être ouverts mais il est possible de les avoir fermés en
utilisant ADO pour ajouter. Teste pour voir :

Private Sub ConnecterCLasseur(ConnectCL As Object, _
Fichier As String, _
Entete As Boolean, _
LectureSeule As Boolean, _
Optional Rs)

'avec relation précoce (cocher référence)
'Set ConnectCL = New ADODB.Connection
'If Not IsMissing(Rs) Then
' Set Rs = New ADODB.Recordset
'End If

'avec relation tardive
Set ConnectCL = CreateObject("ADODB.Connection")
If Not IsMissing(Rs) Then
Set Rs = CreateObject("ADODB.Recordset")
End If

ConnectCL.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Fichier & ";" & _
"Extended Properties=""Excel 8.0;" & _
"HDR=" & IIf(Entete = True, "YES", "NO") & _
";IMEX=" & IIf(LectureSeule = True, 1, 2) & ";"""
End Sub

Sub CompterEnrgistrements(Retour, _
CheminClasseurCible As String, _
NomFeuille As String, _
Plage As String, _
ChaineSQL As String)

'avec relation précoce (cocher référence)
'Dim ConnectCL As ADODB.Connection
'Dim Rs As ADODB.Recordset

'avec relation tardive
Dim ConnectCL As Object
Dim Rs As Object
'si la base n'a pas d'entête, mettre à false et utiliser
'"F" et le numéro de colonne à la place des noms dans SQL
'(voir plus bas)
ConnecterCLasseur ConnectCL, CheminClasseurCible, True, False, Rs

With Rs
.CursorType = 1
.LockType = 3
.Open "SELECT * FROM `" & NomFeuille & "$" & _
Plage & "` WHERE " & ChaineSQL, ConnectCL
Retour = .RecordCount
End With

ConnectCL.Close

Set Rs = Nothing
Set ConnectCL = Nothing
End Sub

Sub Modifier()
Dim CL_Mailing1 As Workbook
Dim CL_Mailing2 As Workbook
Dim FE_Mailing1 As Worksheet
Dim FE_Mailing2 As Worksheet
Dim PlageMailing1 As Range
Dim PlageMailing2 As Range
Dim Retour As Long
Dim Chaine As String
Dim I As Integer, J As Integer

Set CL_Mailing1 = Workbooks("Mailing1.xls")
Set CL_Mailing2 = Workbooks("Mailing2.xls")
Set FE_Mailing1 = CL_Mailing1.Worksheets("Feuil1")
Set FE_Mailing2 = CL_Mailing2.Worksheets("Feuil1")

With FE_Mailing1
'adapter la dernière colonne pour test = F
Set PlageMailing1 = .Range(.[A1], .[F65536].End(xlUp))
End With
With FE_Mailing2
'les valeurs sont récupérées avec Offset à partir
'de la colonne A
Set PlageMailing2 = .Range(.[A1], .[A65536].End(xlUp))
End With

J = PlageMailing1.Rows.Count

For I = 2 To PlageMailing2.Rows.Count
With PlageMailing2(2, 1)
'à adapter selon les champs de recherche
'les valeurs String entre apostrophes les dates entre dièses
'les Integer et long sans rien
'sans entête de colonnes valeur à False
' Chaine = "F1 = '" & .Value & "' "
' Chaine = Chaine & " AND F2 = '" & .Offset(0, 1).Value & "' "
' Chaine = Chaine & " AND F3 = '" & .Offset(0, 2).Value & "' "
' Chaine = Chaine & " AND F4 = '" & .Offset(0, 3).Value & "' "
'avec entêtes de colonnes valeur à True
Chaine = "Nom = '" & .Value & "' "
Chaine = Chaine & " AND Prénom = '" & .Offset(0, 1).Value & "' "
Chaine = Chaine & " AND Adresse = '" & .Offset(0, 2).Value & "' "
Chaine = Chaine & " AND CP = '" & .Offset(0, 3).Value & "' "
End With
CompterEnrgistrements Retour, _
CL_Mailing1.FullName, _
"Feuil1", PlageMailing1.Address(0, 0), _
Chaine
'la plage "PlageMailing1" n'est pas redimensionnée pour la
'recherche car la plage "PlageMailing2" est sensée ne pas
'avoir de doublon
'dans ce cas de figure, les 2 classeurs doivent être ouvert
'mais il est possible avec ADO de travailler les 2 classeurs fermés
If Retour = 0 Then
J = J + 1
Range(PlageMailing2(I, 1), PlageMailing2(I, 6)).Copy
PlageMailing1(J, 1)
End If
Next I

Set PlageMailing1 = Nothing
Set PlageMailing2 = Nothing
Set FE_Mailing1 = Nothing
Set FE_Mailing2 = Nothing
Set CL_Mailing1 = Nothing
Set CL_Mailing2 = Nothing

End Sub

Hervé.

"Stéphane" a écrit dans le message news:
bmh2fk$h0i$
Bonjour,
J'ai 2 bases de données sous Excel : Mailing1.xls et Mailing2.xls


contenant
chacune les mêmes champs (Nom, Prénom, Adresse etc...)
Il faut que je récupére les données de Mailing2.xls et que je les intègre


à
Mailing1.xls en prenant soin d'éliminer les doublons et ne pas écraser les
homonymes.
Ca fait des lustres que je me torture les mèninges et je patauge.
Auriez vous une piste.

D'avance merci
Stéphane




Avatar
Hervé
Oups...
Une petite erreur dans le compteur =>With PlageMailing2(I) au lieu de With
PlageMailing2(2, 1)
Hervé.

"Hervé" a écrit dans le message news:

Salut Stéphane,
Code issu du VBE d'Excel donc à adapter (relation tardives ou précoce).Le
code utilise ADO, à toi de voir si cela convient. Dans ce cas de figure,


les
2 classeurs doivent être ouverts mais il est possible de les avoir fermés


en
utilisant ADO pour ajouter. Teste pour voir :

Private Sub ConnecterCLasseur(ConnectCL As Object, _
Fichier As String, _
Entete As Boolean, _
LectureSeule As Boolean, _
Optional Rs)

'avec relation précoce (cocher référence)
'Set ConnectCL = New ADODB.Connection
'If Not IsMissing(Rs) Then
' Set Rs = New ADODB.Recordset
'End If

'avec relation tardive
Set ConnectCL = CreateObject("ADODB.Connection")
If Not IsMissing(Rs) Then
Set Rs = CreateObject("ADODB.Recordset")
End If

ConnectCL.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Fichier & ";" & _
"Extended Properties=""Excel 8.0;" & _
"HDR=" & IIf(Entete = True, "YES", "NO") & _
";IMEX=" & IIf(LectureSeule = True, 1, 2) & ";"""
End Sub

Sub CompterEnrgistrements(Retour, _
CheminClasseurCible As String, _
NomFeuille As String, _
Plage As String, _
ChaineSQL As String)

'avec relation précoce (cocher référence)
'Dim ConnectCL As ADODB.Connection
'Dim Rs As ADODB.Recordset

'avec relation tardive
Dim ConnectCL As Object
Dim Rs As Object
'si la base n'a pas d'entête, mettre à false et utiliser
'"F" et le numéro de colonne à la place des noms dans SQL
'(voir plus bas)
ConnecterCLasseur ConnectCL, CheminClasseurCible, True, False, Rs

With Rs
.CursorType = 1
.LockType = 3
.Open "SELECT * FROM `" & NomFeuille & "$" & _
Plage & "` WHERE " & ChaineSQL, ConnectCL
Retour = .RecordCount
End With

ConnectCL.Close

Set Rs = Nothing
Set ConnectCL = Nothing
End Sub

Sub Modifier()
Dim CL_Mailing1 As Workbook
Dim CL_Mailing2 As Workbook
Dim FE_Mailing1 As Worksheet
Dim FE_Mailing2 As Worksheet
Dim PlageMailing1 As Range
Dim PlageMailing2 As Range
Dim Retour As Long
Dim Chaine As String
Dim I As Integer, J As Integer

Set CL_Mailing1 = Workbooks("Mailing1.xls")
Set CL_Mailing2 = Workbooks("Mailing2.xls")
Set FE_Mailing1 = CL_Mailing1.Worksheets("Feuil1")
Set FE_Mailing2 = CL_Mailing2.Worksheets("Feuil1")

With FE_Mailing1
'adapter la dernière colonne pour test = F
Set PlageMailing1 = .Range(.[A1], .[F65536].End(xlUp))
End With
With FE_Mailing2
'les valeurs sont récupérées avec Offset à partir
'de la colonne A
Set PlageMailing2 = .Range(.[A1], .[A65536].End(xlUp))
End With

J = PlageMailing1.Rows.Count

For I = 2 To PlageMailing2.Rows.Count
With PlageMailing2(2, 1)
'à adapter selon les champs de recherche
'les valeurs String entre apostrophes les dates entre dièses
'les Integer et long sans rien
'sans entête de colonnes valeur à False
' Chaine = "F1 = '" & .Value & "' "
' Chaine = Chaine & " AND F2 = '" & .Offset(0, 1).Value & "' "
' Chaine = Chaine & " AND F3 = '" & .Offset(0, 2).Value & "' "
' Chaine = Chaine & " AND F4 = '" & .Offset(0, 3).Value & "' "
'avec entêtes de colonnes valeur à True
Chaine = "Nom = '" & .Value & "' "
Chaine = Chaine & " AND Prénom = '" & .Offset(0, 1).Value & "' "
Chaine = Chaine & " AND Adresse = '" & .Offset(0, 2).Value & "' "
Chaine = Chaine & " AND CP = '" & .Offset(0, 3).Value & "' "
End With
CompterEnrgistrements Retour, _
CL_Mailing1.FullName, _
"Feuil1", PlageMailing1.Address(0, 0), _
Chaine
'la plage "PlageMailing1" n'est pas redimensionnée pour la
'recherche car la plage "PlageMailing2" est sensée ne pas
'avoir de doublon
'dans ce cas de figure, les 2 classeurs doivent être ouvert
'mais il est possible avec ADO de travailler les 2 classeurs


fermés
If Retour = 0 Then
J = J + 1
Range(PlageMailing2(I, 1), PlageMailing2(I, 6)).Copy
PlageMailing1(J, 1)
End If
Next I

Set PlageMailing1 = Nothing
Set PlageMailing2 = Nothing
Set FE_Mailing1 = Nothing
Set FE_Mailing2 = Nothing
Set CL_Mailing1 = Nothing
Set CL_Mailing2 = Nothing

End Sub

Hervé.

"Stéphane" a écrit dans le message news:
bmh2fk$h0i$
> Bonjour,
> J'ai 2 bases de données sous Excel : Mailing1.xls et Mailing2.xls
contenant
> chacune les mêmes champs (Nom, Prénom, Adresse etc...)
> Il faut que je récupére les données de Mailing2.xls et que je les


intègre
à
> Mailing1.xls en prenant soin d'éliminer les doublons et ne pas écraser


les
> homonymes.
> Ca fait des lustres que je me torture les mèninges et je patauge.
> Auriez vous une piste.
>
> D'avance merci
> Stéphane
>
>




Avatar
Stéphane
"Patrice Henrio" a écrit dans le
message de news:
Quel est la différence entre doublon et homonymes. A partir de là, on doit
pouvoir automatiser le travail.



Je n'ai pas été assez explicite dans mon esprit le doublon est Mr Dupont
Maurice 23 rue de la gare et Mr Dupont Maurice 23 rue de la gare, (c'est la
même personne présente dans les 2 fichier d'origine qui ne doit apparraître
qu'une seule fois dans le fichier définitif) l'homonyme est Mr Dupont
Maurice 23 rue de la gare et Mr Dupont Maurice 104 place de la Mairie (ce
sont 2 personnes différentes ils doivent apparaître tous les 2 dans le
fichier final)

Stéphane
Avatar
Stéphane
"Hervé" a écrit dans le message de news:

Oups...
Une petite erreur dans le compteur =>With PlageMailing2(I) au lieu de With
PlageMailing2(2, 1)
Hervé.



Ok merci, je vais tester ça.

Stéphane
Avatar
Patrice Henrio
Pour ma part je ferai tout en VBA, avec une macro.

Je récupère la feuille de Mailing2.xls qui m'intéresse et la colle dans une
nouvelle feuille de Mailing1.xls. J'appelle cette feuille "Travail" par
exemple, je suppose que la feuille qui m'intéresse dasn mailing1 est appelé
"Feuille 1"
Pour chaque ligne non vide de "Travail",
je compare la première valeur (colonne 1) avec la première valeur de chaque
ligne de "Feuille 1".
Si "Feuille 1" est triée sur la première colonne c'est encore mieux.
Si il n'y a aucune égalité on rajoute en dernière ligne, la ligne concernée
de travail.
En cas d'égalité je commpare chaque champs, si égalité parfaite, je passe au
suivant, si différence sur un champ je retourne au cas où il n'y a pas
égalité.
Je n'ai pas eu le temps de tester mais ça doit donner quelque chose comme
cela.

Public Sub Intégrer_2_dans_1
Dim DernièreLigne as integer 'Dernière ligne de "Feuille 1"
Dim LCT integer 'Ligne courante de "Travail"
Dim LCF integer 'Ligne courante de "Feuille 1"
Dim L as integer, C as integer 'Compteurs de lignes et de colonnes
Dim V as string 'Stockage de valeurs
'On suppose que "Travail" et "Feuille 1" ne comportent pas de lignes vides
'On suppose de plus que "Feuille 1" est triée sur la première colonne et
reste triée
'On suppose que "Feuille 1" est triée sur la première colonne
DernièreLigne=1
While Workshettes("Feuille 1").cells(DernièreLigne,1)<>""
DernièreLigneÞrnièreLigne+1
Wend
LCT=1
LCF=1
While Worksheets("Travail").Cells(LCT,1)<>""
While Worksheets("Travail").cells(LCT,1)<Worksheets("Feuille
1").cells(LCF,1)
LCF=LCF+1
Wend
If LCF<DernièreLigne then
If Not Doublon(LCT,LCF) then
For LÞrnièreLigne to LCF+1 step -1
For C=1 to 3 'Ici mettre le nombre de colonnes nécessaires
Worksheets("Feuille 1").cells(L,C)=Worksheets("Feuille
1").cells(L-1,C)
Next C
Next L
End If
For C=1 to 3 'Ici mettre le nombre de colonnes nécessaires
Worksheets("Feuille
1").cells(LCF,C)=Worksheets("Travail").cells(LCT,C)
Next C
DernièreLigneÞrnièreLigne+1
End If
LCT=LCT+1
Wend
End Sub

Private Function Doublon(L1 as integer, L2 as integer) as Boolean
Dim Résultat as boolean, C as integer
Résultat=(Worksheets("Feuille
1").cells(L1,1)=Worksheets("Travail").Cells(L2,1))
C=1
While Résultat and (C<3) 'mettre ici le nombre de colonnes concernées
C=C+1
Résultat=(Worksheets("Feuille
1").cells(L1,C)=Worksheets("Travail").Cells(L2,C))
Wend
Doublon=Résultat
End Function


"Stéphane" a écrit dans le message de
news:bmkea6$5e0$

"Patrice Henrio" a écrit dans le
message de news:
> Quel est la différence entre doublon et homonymes. A partir de là, on


doit
> pouvoir automatiser le travail.

Je n'ai pas été assez explicite dans mon esprit le doublon est Mr Dupont
Maurice 23 rue de la gare et Mr Dupont Maurice 23 rue de la gare, (c'est


la
même personne présente dans les 2 fichier d'origine qui ne doit


apparraître
qu'une seule fois dans le fichier définitif) l'homonyme est Mr Dupont
Maurice 23 rue de la gare et Mr Dupont Maurice 104 place de la Mairie (ce
sont 2 personnes différentes ils doivent apparaître tous les 2 dans le
fichier final)

Stéphane




Avatar
Stéphane
"Patrice Henrio" a écrit dans le
message de news: #
Pour ma part je ferai tout en VBA, avec une macro.



Je crois que tu as raison, je cherche midi à 14 h.
J'ai rapidement regardé ton code ta variable V n'est pas utilisée. Tu
n'aurais pas oublié un morceau en route ? ;-)

Merci pour ton aide
Stéphane
Avatar
Patrice Henrio
Je l'avais prévue lors de la conception mais en déroulant la liste à partir
de la fin je n'en ai pas eu besoin.

Si tu testes dis-moi si ça marche car je l'ai fait à l'aveugle.

"Stéphane" a écrit dans le message de
news:bmn1f7$9cu$

"Patrice Henrio" a écrit dans le
message de news: #
> Pour ma part je ferai tout en VBA, avec une macro.
>
Je crois que tu as raison, je cherche midi à 14 h.
J'ai rapidement regardé ton code ta variable V n'est pas utilisée. Tu
n'aurais pas oublié un morceau en route ? ;-)

Merci pour ton aide
Stéphane




1 2