Re : import lignes data sans doublons
bonsoir Kim,Pierre-Jean,Jean-Marie
le code suivant peut être
'J'ai plusieurs fichiers xls, construits selon la même architecture.
'Une première ligne de "titres", puis des données, sur chacune des lignes.
'Je souhaite qu'un autre fichier "synthétise" tous les
'fichiers "sources".
'Une solution de consolidation utilisant ADO :
'Les données sont lues sans ouvrir les fichiers source et copiées
'dans le fichier cible à la suite des données déjà présentes.
'Les données lues et recopiées sont les données entières de la feuille passée en
'paramètre Source.
'fs, mpfe
Sub TestConso()
Dim Fich1$, Fich2$, Source1$, Source2$, Cible$
Fich1 = "D:\Fichier1.xls"
Fich2 = "D:\Fichier2.xls"
Source1 = "Feuil1"
Source2 = "Feuil1"
Cible = "Feuil1"
ConsoDatas Fich1, Source1, Cible
ConsoDatas Fich2, Source1, Cible
End Sub
Public Sub ConsoDatas(NomFichier$, FeuilleSource$, FeuilleCible$)
'Va chercher dans le classeur NomFichier (sans l'ouvrir) les données
'de la feuille FeuilleSource et les copie dans la feuille FeuilleCible
'du classeur actif, à la suite des données (éventuellement) déjà présentes.
'(La ligne d'entêtes de FeuilleSource n'est pas importée)
'inspiré de Rob Bovey, mpep
'nécessite une référence à la librairie
'Microsoft ActiveX Data Object 2.x Library
Dim rsData As ADODB.Recordset
Dim szConnect As String
Dim szSQL As String
Dim Li&, FeuilleDest
''' Crée la chaîne de connexion
szConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & NomFichier & ";" & _
"Extended Properties=Excel 8.0;"
' La requête est basée sur le nom de la feuille. Ce nom
' doit se terminer par un $ et doit être entouré de crochets droits.
szSQL = "SELECT * FROM [" & FeuilleSource & "$];"
Set rsData = New ADODB.Recordset
rsData.Open szSQL, szConnect, adOpenForwardOnly, _
adLockReadOnly, adCmdText
'où envoyer les données :
Set FeuilleDest = ActiveWorkbook.Sheets(FeuilleCible)
Li = FeuilleDest.Range("A65536").End(xlUp).Row + 1
'envoi sur la première ligne vide
If Not rsData.EOF Then
FeuilleDest.Range("A" & Li).CopyFromRecordset rsData
Else
'si la source était vide...
MsgBox "Aucun enregistrement renvoyé.", vbCritical
End If
''' On nettoie pour finir...
rsData.Close
Set rsData = Nothing
End Sub
bonne route