Comparaison de 2 fichiers

Fermé
cnw Messages postés 19 Date d'inscription samedi 14 décembre 2013 Statut Membre Dernière intervention 15 décembre 2013 - 14 déc. 2013 à 22:33
cnw Messages postés 19 Date d'inscription samedi 14 décembre 2013 Statut Membre Dernière intervention 15 décembre 2013 - 15 déc. 2013 à 20:35
Bonsoir,

J'ai besoin d'aide sur VBA (help please !!), je dois comparait 2 fichiers xls contenant tous les deux des données dont un matricule sur la colonne E pour le 1er fichier et la colonne I du second fichier.
En suite, vérifier pour chaque ligne du fichier 1 (clé = matricule) sont existence dans le fichier 2 (colonne I), en là parsant de haut vert le bas, si valeur existe au moins une fois, prendre la dernière valeur et copier la valeur de la colonne A de cette même ligne dans la colonne A du 1er fichier.

merci d'avance pour votre aide.

14 réponses

Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
Modifié par Polux31 le 15/12/2013 à 10:09
Bonjour,

Quelques questions:

- Il y a t'il un titre dans tes colonnes E du fichier 1 et I du fichier 2 ?
- Dans quel fichier se trouve la macro que tu veux faire ?
- Qu'est ce qui déclenche la macro ?


A+
«Ce que l'on conçoit bien s'énonce clairement, Et les mots pour le dire arrivent aisément.»
Nicolas Boileau
0
cnw Messages postés 19 Date d'inscription samedi 14 décembre 2013 Statut Membre Dernière intervention 15 décembre 2013
15 déc. 2013 à 10:48
Bonjour,

Merci d'avance pour votre aide.

-Les deux colonnes s'appellent Matricule dans les deux fichiers.
-LA Macro doit être sur le fichier principal (fichier 1).
-Le declancheur peut-être à l'ouverture du fichier prencipal ou bien dans une feuille avec un bouton.

Merci encore.

Martin.
0
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
Modifié par Polux31 le 15/12/2013 à 12:19
Re

Copier le code ci dessous dans un module et affecter la fonction au déclancheur:

Option Explicit

'-- /!\ NE PAS OUBLIER DE COCHER LA REFERENCE Microsoft ActiveX Data Object xx Library

Public Sub CompareChampMatricule()
Dim Cn As ADODB.Connection
Dim Rst As ADODB.Recordset
Dim Cd As ADODB.Command
Dim fichier As String
Dim feuille As String
Dim wk As Workbook
Dim ws As Worksheet
Dim ligne As Long
Dim newLigne As Long

    '--- Initialisation ---
    Set Cn = New ADODB.Connection
    Set wk = ThisWorkbook
    Set ws = wk.Worksheets("Feuil1")  'A adapter ...
    fichier = "D:\CCM\monFichier2.xlsx"  'A adapter ...
    feuille = "Feuil1"
    ligne = 2
    '------------------
    
    '--- Connexion au fichier source ---
    With Cn
        .Provider = "Microsoft.Jet.OLEDB.4.0"
        .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
            & fichier & ";Extended Properties=""Excel 12.0;HDR=YES;"""
        .Open
    End With
    '-----------------
    
    '--- Traitement -----
    While ws.Range("E" & ligne).Value <> ""
        Set Cd = New ADODB.Command
        Cd.ActiveConnection = Cn
        Set Rst = New ADODB.Recordset
        Cd.CommandText = "SELECT Matricule FROM [" & feuille & "$] WHERE Matricule = '" & ws.Range("E" & ligne).Value & "'"
        Rst.Open Cd, , adOpenKeyset, adLockOptimistic
        Rst.MoveFirst
        If Rst.RecordCount > 0 Then
            Rst.MoveLast
            newLigne = ws.Range("A" & Rows.Count).End(xlUp).Row
            ws.Range("A" & newLigne + 1).CopyFromRecordset Rst
            Set Rst = Nothing
            Set Cd = Nothing
            Query = ""
        End If
        ligne = ligne + 1
    Wend
    '-----------
    
    '--- Libération des objets et de la mémoire
    Set wk = Nothing
    Set ws = Nothing
    Cn.Close
    Set Cn = Nothing
    '-------------------------
    
End Sub


;0)

«Ce que l'on conçoit bien s'énonce clairement, Et les mots pour le dire arrivent aisément.»
Nicolas Boileau
0
cnw Messages postés 19 Date d'inscription samedi 14 décembre 2013 Statut Membre Dernière intervention 15 décembre 2013
15 déc. 2013 à 12:29
Bonjour,

Merci pour votre aide,

comment faire cette action ?
'-- /!\ NE PAS OUBLIER DE COCHER LA REFERENCE Microsoft ActiveX Data Object xx Library

Martin
0
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
15 déc. 2013 à 12:36
Dans l'éditeur VB -> Outils -> Références ... chercher dans la liste et cocher la référence.

;0)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cnw Messages postés 19 Date d'inscription samedi 14 décembre 2013 Statut Membre Dernière intervention 15 décembre 2013
15 déc. 2013 à 12:42
Bonjour,

Après des recherches sur le NET j'ai fini par trouvé.
Au lancement du VBA, j'ai eu une erreur sur une variable non initialisée:

Erreur de compilation : variable non définie :

(ligne Query = "")

Martin
0
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
15 déc. 2013 à 12:43
Oups !!! c'est une erreur de ma part ... tu peux suprimer cette ligne
0
cnw Messages postés 19 Date d'inscription samedi 14 décembre 2013 Statut Membre Dernière intervention 15 décembre 2013
15 déc. 2013 à 13:03
Bonjour,

Erreur d'exécution:

-2147217904 (80040e10)
Erreur Automation

je ne comprends rien !!

Martin
0
cnw Messages postés 19 Date d'inscription samedi 14 décembre 2013 Statut Membre Dernière intervention 15 décembre 2013
15 déc. 2013 à 13:07
Bonjour,

Je viens de faire du pas-à-pas et ça bloque à la ligne :

Rst.MoveFirst

Martin
0
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
Modifié par Polux31 le 15/12/2013 à 13:12
Tu as modifié les 2 lignes :

Set ws = wk.Worksheets("Feuil1")  'A adapter ...
fichier = "D:\CCM\monFichier2.xlsx"  'A adapter ...


Assures toi de l'extension du fichier Excel ...

«Ce que l'on conçoit bien s'énonce clairement, Et les mots pour le dire arrivent aisément.»
Nicolas Boileau
0
cnw Messages postés 19 Date d'inscription samedi 14 décembre 2013 Statut Membre Dernière intervention 15 décembre 2013
15 déc. 2013 à 13:22
Bonjour,

Oui j'ai bien changé les valeurs :

    Set ws = wk.Worksheets("Suivi")  'A adapter ...
fichier = "Liste mensuelle des effectifs en 10_13.xlsx" 'A adapter ...
feuille = "Base mensuelle"

Martin
0
cnw Messages postés 19 Date d'inscription samedi 14 décembre 2013 Statut Membre Dernière intervention 15 décembre 2013
15 déc. 2013 à 13:24
Bonjour,

Pouvez-vous l'expliquer les deux lignes suivantes SVP ?

newLigne = ws.Range("A" & Rows.Count).End(xlUp).Row
            ws.Range("A" & newLigne + 1).CopyFromRecordset Rst



Martin
0
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
15 déc. 2013 à 13:30
Ca permet de copier le contenu de la colonne I du fichier 2 dans la colonne A du fichier 1 ...

Je viens de voir que j'ai mal interperté la demande ...

Quel est l'entête de la colonne A dans le Fichier 2 ?

Il faut mettre le chemin complet ici :

fichier = "Liste mensuelle des effectifs en 10_13.xlsx"
'Par exemple : "C:\MonDossier\MonRepertoire\Liste mensuelle des effectifs en 10_13.xlsx"
0
cnw Messages postés 19 Date d'inscription samedi 14 décembre 2013 Statut Membre Dernière intervention 15 décembre 2013
15 déc. 2013 à 13:37
Le fichier 2 est un fichier mensuel qui permettra de mettre à jour le fichier 1.
Exemple :

Dans le fichier 2 je peux avoir plusieurs lignes du même matricule (mois m-1, m-2, ...etc) et je dois parser le fichier pour prendre la valeur (colonne A) du mois m dans le fichier 1 colonne A.

Je mets à jour et je test

Marin
0
cnw Messages postés 19 Date d'inscription samedi 14 décembre 2013 Statut Membre Dernière intervention 15 décembre 2013
15 déc. 2013 à 13:43
Bonjour,

Pour être sûr que mon fichier 2 est bien sélectionné, j'ai modifié la ligne :

fichier = "C:\Users\mmeguellati\Downloads\VBA-natacha\Liste mensuelle des effectifs en 10_13.xlsx"  'A adapter ...


en

fichier = Application.GetOpenFilename("Fichiers Excels, *.xls*")



toujours la même erreur :

-2147217904 (80040e10)
Erreur Automation

Martin
0
cnw Messages postés 19 Date d'inscription samedi 14 décembre 2013 Statut Membre Dernière intervention 15 décembre 2013
15 déc. 2013 à 13:48
l'erreur vient de cette ligne :

  Rst.Open Cd,  ,adOpenKeyset, adLockOptimistic

entre Cd et la seconde virgule j'ai un vide . Est-ce normal ?

Martin
0
cnw Messages postés 19 Date d'inscription samedi 14 décembre 2013 Statut Membre Dernière intervention 15 décembre 2013
15 déc. 2013 à 15:02
Faudrait-il pas ajouter Cn dans Cd,[ICI] , ?
0
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
15 déc. 2013 à 14:18
Tu as cocher quelle référence ?

Et il me faudrait l'entête de la colonne A du fichier 2 !!!
0
cnw Messages postés 19 Date d'inscription samedi 14 décembre 2013 Statut Membre Dernière intervention 15 décembre 2013
15 déc. 2013 à 14:24
J'ai mis Microsoft ActiveX Data Objects 6.1 Library;

l'entête de la colonne A du fichier 2 est Date_de_naissance

Martin
0
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
15 déc. 2013 à 15:04
Tu as quelle version d'Excel ? J'ai 2007 et ça fonctionne chez moi. J'ignore s'il y a des modif au niveau du Provider ...

Remplace :
Cd.CommandText = "SELECT Matricule FROM [" & feuille & "$] WHERE Matricule = '" & ws.Range("E" & ligne).Value & "'"

Par
Cd.CommandText = "SELECT Date_de_naissance FROM [" & feuille & "$] WHERE Matricule = '" & ws.Range("E" & ligne).Value & "'"
0
cnw Messages postés 19 Date d'inscription samedi 14 décembre 2013 Statut Membre Dernière intervention 15 décembre 2013
15 déc. 2013 à 15:33
J'ai la version 2010

toujours la même erreur !

Martin
0
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
15 déc. 2013 à 15:39
J'ai trouvé ça concernant le provider : https://www.connectionstrings.com/excel-2013/
0
cnw Messages postés 19 Date d'inscription samedi 14 décembre 2013 Statut Membre Dernière intervention 15 décembre 2013
15 déc. 2013 à 20:35
Je dois faire quelque chose ? une conf à modifier ?

Martin
0
cnw Messages postés 19 Date d'inscription samedi 14 décembre 2013 Statut Membre Dernière intervention 15 décembre 2013
15 déc. 2013 à 15:37
Bonjour,

J'essaie de faire une macro qui fait la même chose que le votre mais ça bloque :

Option Explicit

Sub ImporterColonnes()
Dim Fichier, WbkCopy As Workbook, WbkColle As Workbook
Dim Colonnes(), col As Integer, Resultat As Variant
Dim NWbkColle As Integer, MWbkCopy As Integer, DWbkColle As Integer



  'On attribue à la variable WbkColle le fichier actuel (celui qui contient la macro)
  Set WbkColle = ThisWorkbook
  'A adapter : Nom des entêtes de colonnes à importer
  Colonnes = Array("Matricule")
  
  'Sélection du fichier
  Fichier = Application.GetOpenFilename("Fichiers Excels, *.xls*")
  'En cas de clic sur "ANNULER"
  If Fichier <> False Then
    'On ouvre le fichier en question
    Set WbkCopy = Workbooks.Open(Fichier)
    
    With WbkCopy.Sheets("Base mensuelle") '==> ADAPTER NOM de la feuille
      'Boucle sur toutes les entêtes des colonnes
      For col = 2 To .Cells(2, .Cells.Columns.Count).End(xlToLeft).Column
        'teste si l'entête correspond à un des noms des colonnes à copier
        Resultat = Application.Match(.Cells(2, col), Colonnes, 0)
        'Si l'entête est trouvée (colonne à copier)
        If Not IsError(Resultat) Then
          'Copié - Collé ==> ADAPTER NOM de la feuille ou coller ("TRUC" à remplacer)
          '.Columns(Col).Copy WbkColle.Sheets("COLLER").Cells(1, Cells.Columns.Count).End(xlToLeft).Offset(0, 1)
          'impression pop-up les colonnes Matricule sont bien là
        
        End If ' si l'entête existe bien
      Next col
            
    'rechercher avec mise-à-jour correspendance valeur
        
    For NWbkColle = 4 To WbkColle.Sheets("Suivi").Range("E65536").End(xlUp).Row
    For MWbkCopy = 4 To WbkCopy.Sheets("Base mensuelle").Range("I65536").End(xlUp).Row
    For DWbkColle = 4 To WbkColle.Sheets("Suivi").Range("M65536").End(xlUp).Row
    
    If InStr(WbkCopy.Sheets("Base mensuelle").Range("I" & MWbkCopy), WbkColle.Sheets("Suivi").Range("E" & NWbkColle)) <> 0 Then
        'Copié - collé
         WbkCopy.Sheets("Base mensuelle").Range("I" & MWbkCopy).Copy WbkColle.Sheets("Suivi").Range("M" & DWbkColle)
    
    End If
   Next NWbkColle
   Next MWbkCopy
   Next DWbkColle
    
    End With
       
    WbkCopy.Close
  End If
Set WbkCopy = Nothing
Set WbkColle = Nothing
End Sub



J'ai une erreur de compilation :

référence de validation de contrôle
0
cnw Messages postés 19 Date d'inscription samedi 14 décembre 2013 Statut Membre Dernière intervention 15 décembre 2013
15 déc. 2013 à 15:38
J'ai une erreur de compilation :

référence de validation de contrôle incorrecte dans Next ; Next NWbkColle
0