Mise à jour d'un fichier par un autre fichier
Bonjour,
J'aurais besoin de vos services...car je sais écrire mon développement en français, mais suis bien incapable de l'écrire en VBA.
En effet, il faudrait que je puisse mettre à jour un fichier à partir d'un autre.
Voici les informations que je peux vous fournir :
- j'ai un fichier 1, en entrée "Extract Suivi Risques new", qui contient 25 colonnes, et un nombre illimité de lignes (max.200 lignes)
- j'ai un fichier 2, en sortie "Analyse de Risques", qui contient 27 colonnes (la colonne 1 "état", les 25 colonnes du fichier 1, la colonne 27 "commentaires")
La comparaison entre les 2 fichiers se fait sur la donnée du code-lot.
Je pense procéder ainsi :
- une mise à jour initiale : le fichier 1 alimente en totalité le fichier 2, le code "état" est à N (Nouveau).
- pour les mises à jour suivantes :
* si le code-lot du fichier 1 existe déjà dans le fichier 2 :
¤ l'état passe à V (Valide)
¤ les autres données sont mises à jour (soit comparées une à une, soit écrasées en totalité, je pense que c'est le + simple)
¤ la colonne 27 n'est jamais modifiée par la macro
* si le code-lot du fichier 1 n'existe pas dans le fichier 2 : c'est comme la mise à jour initiale : la ligne est ajoutée en totalité, le code état est à N.
* si le code-lot n'existe plus dans le fichier 1 : la ligne reste dans le fichier 2, mais l'état de ce code-lot passe à S (Supprimé)
Je vous joins les 2 fichiers.
L'actualisation n'est pas nécessairement à faire via un bouton, lancer la macro via le bouton "exécuter" suffit.
Merci de votre aide.
Cordialement,
EB.
Bonjour à tous,
Y-aurait-il quelqu'un pour m'aider sur le sujet que j'ai posté ?
Merci,
Bien à vous,
Bonjour,
une proposition
Sub testfus()
Set tws = ThisWorkbook.Sheets("suivi analyse risques")
dlt = tws.Cells(Rows.Count, 2).End(xlUp).Row
With Application.FileDialog(msoFileDialogFilePicker)
.Title = "ouvrir fichier XLS"
.Filters.Clear
.Filters.Add "XL file", "*.xls*"
.AllowMultiSelect = false
If .Show = -1 Then
classeurcible = .SelectedItems(1)
End If
End With
Set wb = Workbooks.Open(classeurcible)
Set sws = wb.Sheets("feuil1")
dl = sws.Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To dl
Set re = Nothing
If dlt > 1 Then Set re = tws.Range(tws.Cells(2, "E"), tws.Cells(dlt, "E")).Find(sws.Cells(i, "D"), lookat:=xlWhole)
If re Is Nothing Then
dlt = dlt + 1
sws.Range(sws.Cells(i, 1), sws.Cells(i, 25)).Copy tws.Cells(dlt, 2)
tws.Cells(dlt, 1) = "N"
Else
sws.Range(sws.Cells(i, 1), sws.Cells(i, 25)).Copy tws.Cells(re.Row, 2)
tws.Cells(re.Row, 1) = "V"
End If
Next i
End SubBonjour,
Merci pour votre proposition,
J'ai cependant une question : j'ai copié la macro dans le fichier "Analyse de risques.xlsm".
Et curieusement, lorsque je l'exécute, une fenêtre s'ouvre, me demandant de sélectionner un fichier excel...
Et lorsque je ferme cette fenêtre, un autre fenêtre s'ouvre, contenant seulement une croix rouge et le chiffre 400...
Est ce normal ?
Peut être que j'ai mal copié votre macro ?... le fait que je sois en Office 2010 peut il changer quelque chose ?
Merci de votre retour.
Emmanuelle.
Bonjour,
la fenêtre qui s'ouvre permet de choisir le fichier à fusionner dans le recap analyse de risques, en l'occurrence pour l'exemple que tu as donné, ce fichier est "extract suivi risque new.xls",
Aaaaah ! bien sûr !
Donc c'est bon elle marche presque dans sa totalité ! Youpi !
Le seul bémol est le suivant : j'ai testé en ajoutant dans le fichier 2 une ligne avec un code lot, code-lot qui n'existe pas dans le fichier 1 et par conséquent cette ligne devrait normalement dans le fichier 2 être topée à S (Supprimé). ce qui n'est pas le cas, elle reste topée à N ou V.
Question bête, mais pratique : peut-on à la fin de la macro prévoir la fermeture du fichier "Extract Suivi Risques New", afin de rester sur le fichier "Analyse de risques" ?
Merci bcp !
Bonjour,
je n'avais apparemment pas lu toutes les demandes.
voici une nouvelle version
Sub testfus()
Set tws = ThisWorkbook.Sheets("suivi analyse risques")
dlt = tws.Cells(Rows.Count, 2).End(xlUp).Row
'on ouvre le fichier risque
With Application.FileDialog(msoFileDialogFilePicker)
.Title = "ouvrir fichier XLS"
.Filters.Clear
.Filters.Add "XL file", "*.xls*"
.AllowMultiSelect = True
If .Show = -1 Then
classeurcible = .SelectedItems(1)
End If
End With
Set wb = Workbooks.Open(classeurcible)
Set sws = wb.Sheets("feuil1")
dl = sws.Cells(Rows.Count, 1).End(xlUp).Row
' pour chaque ligne du fichier risque
For i = 2 To dl
Set re = Nothing
'on cherche si la référence est dans le fichier de synthèse
If dlt > 1 Then Set re = tws.Range(tws.Cells(2, "E"), tws.Cells(dlt, "E")).Find(sws.Cells(i, "D"), lookat:=xlWhole)
If re Is Nothing Then
'si elle n'y est pas on l'ajoute
dlt = dlt + 1
sws.Range(sws.Cells(i, 1), sws.Cells(i, 25)).Copy tws.Cells(dlt, 2)
tws.Cells(dlt, 1) = "N"
Else
' si elle y est on copie les modifs et on change le statut
sws.Range(sws.Cells(i, 1), sws.Cells(i, 25)).Copy tws.Cells(re.Row, 2)
tws.Cells(re.Row, 1) = "V"
End If
Next i
' pour chaque ligne dans le fichier de synthèse
For i = 2 To dlt
'on regarde si elle est présente dans le fichier risque
Set re = sws.Range(sws.Cells(2, "D"), sws.Cells(dl, "D")).Find(tws.Cells(i, "E"), lookat:=xlWhole)
If re Is Nothing Then
'si non on change le statut en S
tws.Cells(i, 1) = "S"
End If
Next i
'on ferme le fichier risque
Application.DisplayAlerts = False
wb.Close
Application.DisplayAlerts = True
End SubMerci bcp pour cette nouvelle macro !
Je viens de tester, tout est ok !
Merci encore pour votre réactivité, et votre patience.