Reécupération d'informations d'un fichier à l'autre

Bonsoir,

Voilà mon problème: j'ai un fichier "prod" qui regroupe plusieurs clients et un fichier"suiviClient". J’essaie de créer une macro qui va copier la date d'edition du fichier prod vers le fichier suiviClient mais apparemment sans succès.

Voici la macro utilisée:

Sub suivclient_date()

Dim nbli

nbli = Cells(1, 1).CurrentRegion.Rows.Count

For i = 4 To nbli

If Cells(i, 19) <> "" Then

Workbooks.Open Filename:=Cells(i, 1)

nblis = Cells(1, 1).CurrentRegion.Rows.Count

For k = 4 To nblis

If ThisWorkbook.Sheets("A éditer").Cells(i, 3) = _

ActiveSheet.Cells(k, 5) And ThisWorkbook.Sheets("A éditer").Cells(i, 4) = _

ActiveSheet.Cells(k, 6) Then

ActiveSheet.Cells(k, 18).Value = ThisWorkbook.Sheets("A éditer").Cells(i, 19)

End If

Next

ActiveWorkbook.Close

ThisWorkbook.Save

'Next

End If

Next

End Sub

Merci d'avance pour votre aide.

Bonne soirée,

Enidan033

13prod.xlsm (21.48 Ko)
8suiviclient.xlsx (14.64 Ko)

Bonjour Enidan033

J'ai beau essayé de lire ton code, je n'en comprends la logique...

Je veux dire que tu as l'air de comparer des choux et des carottes. je m'explique :

  1. tu compares la 3ème colonne du fichier "prod" nommée "Date validation Cde" (qui est composée d'un numéro de cde du style AA-NUM visiblement) avec la 5ème colonne du fichier "suiviClient" nommée "FSCM" qui apparait toujours vide (dans l'exemple)
  2. puis ensuite la 4ème de "prod" nommée "n° Cde" avec la 6ème de "suiviClient" nommée "Observation"

Bonjour andrea73,

Je te remercie d'avoir étudié mon code. Effectivement, j'ai fait des erreurs de frappes. en fait il faut lire:

Sub suivclient_date()

Dim nbli

nbli = Cells(1, 1).CurrentRegion.Rows.Count

For i = 4 To nbli

If Cells(i, 19) <> "" Then

Workbooks.Open Filename:=Cells(i, 1)

nblis = Cells(1, 1).CurrentRegion.Rows.Count

For k = 4 To nblis

If ThisWorkbook.Sheets("A éditer").Cells(i, 3) = _

ActiveSheet.Cells(k, 2) And ThisWorkbook.Sheets("A éditer").Cells(i, 4) = _

ActiveSheet.Cells(k, 3) Then

ActiveSheet.Cells(k, 18).Value = ThisWorkbook.Sheets("A éditer").Cells(i, 19)

End If

Next

'ActiveWorkbook.Close

ThisWorkbook.Save

'Next

End If

Next

End Sub

Mais ça ne marche pas quand même.

Je re télécharge les fichiers

Bonne journée,

Enidan033

5suiviclient.xlsx (14.64 Ko)
5prod.xlsm (21.54 Ko)

Bonjour,

Version commentée....

Sub suivclient_date()
    '1) On déclare toutes ses variables, et on les type autant que possible... Pourquoi ?
    'Parce qu'une variable typée est d'accès plus rapide qu'une variable de type Variant
    'On ne lésine pas sur les variables nécessaires pour faciliter l'écriture et qui de plus
    'permettront une exécution plus rapide
    Dim nbli%, nblis%, i%, k%, ssd%, cde$, fsc$, ded, suivi As Worksheet
    '2) On désactive la mise à jour de l'affichage quand on sait qu'il va être modifié durant l'exécution
    Application.ScreenUpdating = False
    '3) La mise sous instruction With... End With accélère aussi l'exécution
    'et on qualifie toutes ses expressions ! (pas de Range ou Cells non référés explicitement
    'à une feuille (et classeur si plusieurs)... ça aussi, c'est plus rapide !
    With ThisWorkbook.Worksheets(1)
        '4) Plus sûr que l'utilisation de CurrentRegion (voir 4bis)
        nbli = .Cells(.Rows.Count, 1).End(xlUp).Row
        For i = 4 To nbli
            '5) On ne va pas ouvrir le même classeur à chaque tour de boucle !
            'Prenant en compte le fait qu'il puisse y avoir plusieurs classeurs, on a défini une variable
            'pour récupérer le chemin et le nom : on teste si la valeur de la variable est conforme
            'à la mention en colonne A (si c'est le cas on conserve le classeur déjà ouvert, sinon
            'on le ferme (si ouvert, car au début pas de classeur), on actualise la variable, on ouvre
            'le nouveau classeur,on affecte la feuille à une variable et on mémorise l'extension des données).
            'Ce qu'on ne fait que si le classeur doit changer et non à chaque tour de boucle !
            If fsc <> .Cells(i, 1) Then
                If fsc <> "" Then Workbooks(fsc).Close True
                fsc = .Cells(i, 1)
                Set suivi = Workbooks.Open(fsc).Worksheets(1)
                '4bis) Il est sage de s'interroger sur le résultat des commandes qu'on utilise et tester
                'préalablement au besoin : CurrentRegion présuppose de ne pas l'appliquer à une cellule
                'entourée de cellules vides, qui ne renverra qu'elle-même...
                nblis = suivi.Cells(Rows.Count, 1).End(xlUp).Row
            End If
            If .Cells(i, 19) <> "" Then
                '6) Si la condition est réunie pour envoyer la date de suivi, on prélève celle-ci dans une variable
                '[NB-type Variant, car si on a une fausse date on déclencherait une erreur, on la prélève sous
                'forme d'entier Long (propr. Value2) qui évite tout risque, bien qu'ici il ne devrait pas y en avoir]
                'On prélève également les numéros de ssdossier et de commande dans des variables, cela
                'simplifie l'écriture, et c'est plus rapide
                ded = .Cells(i, 19).Value2: ssd = .Cells(i, 3): cde = .Cells(i, 4)
                For k = 4 To nblis
                    '7) Illustration... : ...et on sort de la boucle une fois trouvé, inutile de la poursuivre...
                    If suivi.Cells(k, 2) = ssd And suivi.Cells(k, 3) = cde Then
                        suivi.Cells(k, 18) = ded: Exit For
                    End If
                Next k
            End If
        Next i
    End With
    Workbooks(fsc).Close True
    ThisWorkbook.Save
End Sub

Cordialement.

NB- La prochaine fois, mets ton code sous balises Code dans le post.

Et si tu indentais ton code celui-ci serait plus lisible et sujet à moins d'erreurs...

21enidan033-prod.xlsm (25.38 Ko)

Bonjour MFerrand,

Merci pour ton code et tes remarques.

Tout fonctionne parfaitement.

Bonne journée,

Enidan033

Bonjour,

Le code marche parfaitement, mais après coup, je me suis rendu compte qu'il valait mieux rajouter une feuille et y insérer les liens qui vont ouvrir les fichiers clients.

J'ai essayé de modifier le code, mais sans succès, car pas assez expérimentée.

Merci d'avance de votre aide précieuse

Cordialement,

Enidan033

9prod.xlsm (28.77 Ko)
5suiviclient.xlsx (14.69 Ko)

Si rien n'indique comment trouver le chemin et le nom du fichier... on tire au sort ?

Tout mes excuses pour ne pas avoir été assez clair.

Le chemin et le nom du fichier se trouvent dans la feuille "Fichiers" du fichier "prod.xlsm"

Bo après midi,

Enidan033

J'ai bien compris, mais rien ne lie un client de la feuille A éditer à un chemin et nom de fichier de la feuille Fichiers !

Par conséquent, en balayant les clients, aucun critère ne permet de lier chacun à un fichier...

J'ai crée un lien complet dans la feuille "Fichiers".

Dits moi si c'est OK pour toi.

Pas la peine de remettre le même classeur ! Relis ce que j'ai écrit : RIEN ne relie les données des deux feuilles !

J'ai réussi à rentrer quelques dates, mais ça me laisse des cellules vides.

6prod.xlsm (32.23 Ko)
6suiviclient.xlsx (16.19 Ko)

Dans le fichier suiviClient.xls, les dates n'ont pas toute été enregistrée.

Je ne vois pas ce que viennent faire les dates dans la discussion ! Il est question de relier un client à un nom de fichier.

Tant que ce point n'est pas établi, il est inutile de poursuivre.

Je ne comprends pas où il faut mettre ce lien. Je débute en VBA.

Mais enfin ! Qui te parle de mettre un lien !

Simple question de bon sens : à partir du client, de la ligne client qu'on parcourt, tu dois identifier le fichier client !

Comment tu fais à l'identifier à partir de cette ligne client !

Rechercher des sujets similaires à "reecuperation informations fichier"