Fusionner des modifications de prix
Bonjour,
J'ai 1 fichier Excel avec une série d'articles avec références fournisseur. Ces références ont un prix qui varie.
Je reçois donc régulièrement par mon fournisseur un listing reprenant les références des produits et leurs nouveaux prix.
Comment pourrais-je "fusionner" la modification du prix dans mon fichier par rapport au fichier Excel reçu par mon fournisseur en sachant que la structure du fichier ne correspond pas à mon fichier. la seule référence sur laquelle se baser serait la référence fournisseur (code fournisseur du produit ou EAN barre code du produit).
Merci pour votre aide,
Loadlucas
Bonjour,
Montre-nous donc tout ça ! Et on verra ce qu'on peut en faire !
Cordialement.
Bonjour,
Voici les fichiers :
Dans le premier FichierCommandeExemplePA il faudrait modifier la colonne P.ACHAT en fonction de la colonne "Nouvelle proposition de Prix" du fichier FichierFournisseurExemplePA
MERCI POUR VOTRE AIDE
Loadlucas
Re,
Pour le problème d'identification du fichier fournisseur, à défaut d'autre chose, la macro récupèrera le nom en F1 (voir fichier). Le fichier fournisseur doit être ouvert pour lancer la mise à jour.
Sub MajPrix()
Dim d As Object, n%, i%, wbf$
Set d = CreateObject("Scripting.Dictionary")
wbs = ActiveSheet.Range("F1")
With Workbooks(wbs).Worksheets(1)
n = .Cells(.Rows.Count, 1).End(xlUp).Row
For i = 2 To n
d(.Cells(i, 1).Value) = .Cells(i, 7)
Next i
End With
With ThisWorkbook.Worksheets(1)
n = .Cells(.Rows.Count, 1).End(xlUp).Row
Application.ScreenUpdating = False
For i = 3 To n
If d.exists(.Cells(i, 1).Value) Then .Cells(i, 3) = CDbl(d(.Cells(i, 1).Value))
Next i
End With
End Sub
Cordialement.
Re,
Merci Bcp ...
Pour me permettre de comprendre et d'adapter au divers fichiers des divers fournisseurs :
d(.Cells(i, 1).Value) = .Cells(i, 7)
"7" représente la 7 eme colonne du fichier fournisseur
et
If d.exists(.Cells(i, 1).Value) Then .Cells(i, 3) = CDbl(d(.Cells(i, 1).Value))
la valeur 3 représente la colonne 3 de mon fichier commande ?
Encore merci,
Loadlucas
Bonjour,
Merci
avec ces observations, j'ai fais une modif de macro :
si :
Dans le fichier fournisseur le code fournisseur est dans la deuxième colonne en B et le chiffre à utiliser pour mettre à jour le fichier commande est en colonne 8.
Le nom du fichier fournisseur se trouve en AF1
et que :
Dans le fichier commande le code fournisseur est dans la 4ème colonne en D et le chiffre à mettre à jour est dans la colonne 20 en T.
Le tout est dans la feuil2 nommée BOISSONS
J'ai fais ces modifications de code mais ça ne fonctionne pas :
Sub MajPrix()
Dim d As Object, n%, i%, wbf$
Set d = CreateObject("Scripting.Dictionary")
wbs = ActiveSheet.Range("AF1")
With Workbooks(wbs).Worksheets(1)
n = .Cells(.Rows.Count, 1).End(xlUp).Row
For i = 2 To n
d(.Cells(i, 1).Value) = .Cells(i, 8)
Next i
End With
With ThisWorkbook.Worksheets("BOISSONS")
n = .Cells(.Rows.Count, 4).End(xlUp).Row
Application.ScreenUpdating = False
For i = 3 To n
If d.exists(.Cells(i, 1).Value) Then .Cells(i, 20) = CDbl(d(.Cells(i, 4).Value))
Next i
End With
End Sub
A mon avis dans toute cette soupe je devrais ajouter poivre et sel
Encore merci à vous,
Loadlucas
Selon tes indications :
Sub MajPrix()
Dim d As Object, n%, i%, wbf$
Set d = CreateObject("Scripting.Dictionary")
wbs = ActiveSheet.Range("AF1")
With Workbooks(wbs).Worksheets(1)
n = .Cells(.Rows.Count, 2).End(xlUp).Row
For i = 2 To n
d(.Cells(i, 2).Value) = .Cells(i, 8)
Next i
End With
With ThisWorkbook.Worksheets(1)
n = .Cells(.Rows.Count, 4).End(xlUp).Row
Application.ScreenUpdating = False
For i = 3 To n
If d.exists(.Cells(i, 4).Value) Then .Cells(i, 20) = CDbl(d(.Cells(i, 1).Value))
Next i
End With
End Sub
Cordialement.
Bonjour
Merci ça fonctionne avec ceci :
Sub MajPrix()
Dim d As Object, n%, i%, wbf$
Set d = CreateObject("Scripting.Dictionary")
wbs = ActiveSheet.Range("AF1")
With Workbooks(wbs).Worksheets(1)
n = .Cells(.Rows.Count, 2).End(xlUp).Row
For i = 2 To n
d(.Cells(i, 2).Value) = .Cells(i, 8)
Next i
End With
With ThisWorkbook.Worksheets("BOISSONS")
n = .Cells(.Rows.Count, 4).End(xlUp).Row
Application.ScreenUpdating = False
For i = 3 To n
If d.exists(.Cells(i, 4).Value) Then .Cells(i, 20) = CDbl(d(.Cells(i, 4).Value))
Next i
End With
End Sub
Mais petit problème :
Là où il n'y a pas de code fournisseur dans mon fichier commande, la cellule colonne 20 (prix d'achat mis à jour) est mise à zéro
Serait-il possible de laisser le nombre de départ si pas de code fournisseur ?
Merci bcp
Loadlucas
For i = 2 To n
If .Cells(i, 2) <> "" Then d(.Cells(i, 2).Value) = .Cells(i, 8)
Next i
Cela devrait suffire...
Bonjour
Super ça fonctionne très bien !
Un tout grand merci
Y aurait-il la possibilité de modifier la couleur (en orange par exemple) de la cellule dès que le prix d'achat à changé ?
Avec au préalable la remise à défaut des couleurs de toutes les cellules prix pour ne pas garder la couleur orange de modification du prix d'achat de la mise à jour précédente.
Enfin comment pourrais-je lister sur une autre feuille les articles qui ont changé de prix ?
Afin de vérifier le prix de vente qui sera calculé par divers critères des articles ayant changé de prix.
Merci à vous
Loadlucas
Bonjour,
Tu poses un problème différent !
La question était de mettre à jour les prix à réception d'une nouvelle liste de prix du fournisseur.
On effectue donc cette mise à jour : s'il y a un prix pour une référence dans la liste, on le substitue à ton prix antérieur, sans se préoccuper de savoir si le prix a changé où si c'est en fait toujours le même...
Si la question est maintenant de vérifier si le prix a changé, de mettre à jour, de signaler les changements par une couleur et lister les prix modifiés ailleurs, on recommence !
Bonjour,
Ah désolé ...
Je pensais que la macro pouvait évoluer dans ce sens ...
C'est une macro totalement différente alors ?
Ne serait-il pas possible, qu'en début de macro :
Défini que la colonne PA (colonne 21 par exemple) doit être d'une couleur par défaut (fond blanc sans mise en forme ni couleur par exemple).
Pour donner une couleur par défaut à la colonne PA (colonne 21) avant chaque exécution de macro.
Car un PA mis à jour il y a une semaine n'a pas forcément encore changer de PA la semaine d'après.
Insérer dans la macro :
que si la valeur du code fournisseur est reprise dans le fichier "nouveau prix" du fournisseur et qu'il faut :
- Modifier la valeur du PA dans le fichier commande, comme c'est le cas dans la macro ci dessous :
Sub MAJPABOISSONS()
Dim d As Object, n%, i%, wbf$
Set d = CreateObject("Scripting.Dictionary")
' Lecture du fichier notifié (fichier fournisseur) en AG1 dans le fichier commande
wbs = ActiveSheet.Range("AG1")
' Scan du fichier fournisseur :
With Workbooks(wbs).Worksheets(1)
' Fichier fournisseur colonne 1 = code fournisseur
' Changer et mettre le numéro de la colonne correspondant au code fournisseur dans le fichier fournisseur (ici colonne 1)
n = .Cells(.Rows.Count, 1).End(xlUp).Row
For i = 2 To n
' Lien entre la colonne du code fournisseur et la colonne du montant à modifier :
' ici code fournisseur colonne 1 & montant à mettre à jour colonne 7 du fichier fournisseur (à modifier si besoin)
If .Cells(i, 1) <> "" Then d(.Cells(i, 1).Value) = .Cells(i, 7)
' d(.Cells(i, 1).Value) = .Cells(i, 7)
Next i
End With
' FICHIER COMMANDE
' comparatif de la valeur du code fournisseur du fichier fournisseur avec le code fournisseur du fichier commande :
' Code fournisseur en colonne 4 dans le fichier commande >> .Cells(.Rows.Count, 4) <<
' Dans la feuille BOISSONS :
With ThisWorkbook.Worksheets("BOISSONS")
n = .Cells(.Rows.Count, 4).End(xlUp).Row
Application.ScreenUpdating = False
For i = 3 To n
' Condition :
' Si le code de la colonne 4 du fichier commande est identique au nombre dans la variable
' où se trouve le code fournisseur du fichier fournisseur :
' Alors, remplacer dans la colonne 21 du fichier commande dans la feuille BOISSONS
If d.exists(.Cells(i, 4).Value) Then .Cells(i, 21) = CDbl(d(.Cells(i, 4).Value))
Next i
End With
End Sub
- et que, la cellule dont la valeur change ou est identifiée dans le fichier "nouveau prix" du fournisseur change de couleur.
L'idée est de souligner le changement du PA aux différentes personnes qui commandent.
Mais également permettre au responsable de vérifier via un listing seulement le PA des articles qui ont changé de prix pour lui permettre d'ajuster ou pas le PV du produit.
Un grand merci pour votre suivi et patience,
Loadlucas
La méthode de recueil des modifs est la même. C'est ensuite qu'il faut modifier...
Un essai en aveugle (je n'ai rien pour tester) :
Sub MajPrix()
Dim d As Object, k, n%, i%, wbf$, clr&, Tpm()
Set d = CreateObject("Scripting.Dictionary")
wbf = ActiveSheet.Range("AF1")
With Workbooks(wbf).Worksheets(1)
n = .Cells(.Rows.Count, 2).End(xlUp).Row
For i = 2 To n
If .Cells(i, 2) <> "" Then d(.Cells(i, 2).Value) = .Cells(i, 8)
Next i
End With
If d.Count = 0 Then Exit Sub
With ThisWorkbook.Worksheets(1)
n = .Cells(.Rows.Count, 4).End(xlUp).Row
clr = RGB(255, 192, 0)
Application.ScreenUpdating = False
.Range("T3:T" & n).Interior.Color = RGB(191, 191, 191)
For i = 3 To n
k = .Cells(i, 4)
If d.exists(k) Then
If CDbl(d(k)) <> .Cells(i, 20) Then
.Cells(i, 20) = CDbl(d(k))
.Cells(i, 20).Interior.Color = clr
Else
d.Remove k
End If
End If
Next i
End With
If d.Count = 0 Then Exit Sub
ReDim Tpm(d.Count, 1): n = 0
For Each k In d.keys
n = n + 1
Tpm(n, 0) = k: Tpm(n, 1) = CDbl(d(k))
Next k
Tpm(0, 0) = "CODE": Tpm(0, 1) = "Prix modifié"
With Worksheets.Add(after:=Worksheets(1))
.Name = "Modif" & Format(Date, "yyyy-mm-dd")
With .Range("A1:B" & n + 1)
.Value = Tpm
.Columns(1).HorizontalAlignment = xlCenter
.Rows(1).HorizontalAlignment = xlCenter
.Borders.Weight = xlThin
End With
End With
End Sub
Cordialement.
Bonjour,
J'ai testé mais sans résultat positif
Voici le fichier en question version light.
Ainsi que le fichier fournisseur
L'idée serait de :
- modifier les PA reçu par le fournisseur (la macro qui fonctionne pour cela est liée au bouton orange dans la colonne MAGASIN X de chaque onglet)
- Mettre en surbrillance la ligne ou la cellule PA des produits qui ont un PA qui a changer (nettoyer au préalable la couleur de la colonne des PA pour lui donner une couleur par défaut avant MAJ des PA et donc surbrillance si modif PA.
- Afficher dans la feuille CHECK tout les articles dont le PA a changer
- Afficher un listing dans COMFOURN1 de tous les articles commandé pour FOURN1
- Afficher un listing dans COMFOURN2 de tous les articles commandé pour FOURN2
- Afficher un listing dans COMFOURN3 de tous les articles commandé pour FOURN3
Merci à vous
Loadlucas
Bonjour,
J'ai fais quelques modifications dans la macro de la feuille "BOISSONS"
Elle fonctionne
Sub MAJPABOISSONS()
Range("U1").Select
For c = 3 To 500
Range("U" & c).Interior.Color = RGB(191, 191, 191)
Next c
Dim d As Object, k, n%, i%, wbf$, clr&, Tpm()
Set d = CreateObject("Scripting.Dictionary")
wbf = ActiveSheet.Range("AG1")
With Workbooks(wbf).Worksheets(1)
n = .Cells(.Rows.Count, 1).End(xlUp).Row
For i = 2 To n
If .Cells(i, 1) <> "" Then d(.Cells(i, 1).Value) = .Cells(i, 7)
Next i
End With
If d.Count = 0 Then Exit Sub
With ThisWorkbook.Worksheets("BOISSONS")
n = .Cells(.Rows.Count, 4).End(xlUp).Row
clr = RGB(255, 192, 0)
Application.ScreenUpdating = False
.Range("T3:T" & n).Interior.Color = RGB(191, 191, 191)
For i = 3 To n
k = .Cells(i, 4)
If d.exists(k) Then
If CDbl(d(k)) <> .Cells(i, 20) Then
.Cells(i, 21) = CDbl(d(k))
.Cells(i, 21).Interior.Color = clr
Else
d.Remove k
End If
End If
Next i
End With
If d.Count = 0 Then Exit Sub
ReDim Tpm(d.Count, 1): n = 0
For Each k In d.keys
n = n + 1
Tpm(n, 0) = k: Tpm(n, 1) = CDbl(d(k))
Next k
Tpm(0, 0) = "CODE": Tpm(0, 1) = "Prix modifié"
With Worksheets.Add(after:=Worksheets(1))
.Name = "Modif" & Format(Date, "yyyy-mm-dd")
With .Range("A1:B" & n + 1)
.Value = Tpm
.Columns(1).HorizontalAlignment = xlCenter
.Rows(1).HorizontalAlignment = xlCenter
.Borders.Weight = xlThin
End With
End With
End Sub
Mais :
le fichier créer de vérification ("Modif" & Format(Date, "yyyy-mm-dd")) me donne le CODE et le nouveau PA de tous les articles repris dans le fichier fournisseur et pas juste les articles du fichier commande qui ont changer de PA.
Dans ce fichier, il faudrait également que la désignation y figure (CODE FOURN, Désignation, PA MAJ) ou mieux encore, toute la ligne
Merci pour votre aide,
Loadlucas
Bonjour,
Proc. MAJPABOISSONS modifiée... Il s'agissait d'ajuster tes colonnes quelque peu baladeuses !
2 petites modifs par rapport au code précédent :
- "décoloration" cellule par cellule (pour ne pas toucher aux "noires"
- tableau des modifs constitué simultanément aux modifs de prix pour les aligner (n'avoir sur CHECK que les prix modifiés sur la feuille BOISSONS).
Cordialement.
Dans ce fichier, il faudrait également que la désignation y figure
Fin de la macro modifiée our désignation... (C'est la version figurant dans le fichier transmis qui est modifiée ! [non modifiée dans le fichier déjà communiqué...])
For i = 3 To n
k = .Cells(i, 4)
If d.exists(k) Then
If CDbl(d(k)) <> .Cells(i, 21) Then
.Cells(i, 21) = CDbl(d(k))
.Cells(i, 21).Interior.Color = clr
j = j + 1: ReDim Preserve Tpm(2, j)
Tpm(0, j) = k: Tpm(1, j) = .Cells(i, 6): Tpm(2, j) = .Cells(i, 21)
End If
End If
Next i
End With
If j = 0 Then Exit Sub
Tpm(0, 0) = "CODE": Tpm(1, 0) = "Désignation": Tpm(2, 0) = "Prix modifié"
With Worksheets("CHECK")
.UsedRange.Clear
With .Range("A1:C" & j + 1)
.Value = WorksheetFunction.Transpose(Tpm)
.Columns(1).HorizontalAlignment = xlCenter
.Columns(2).AutoFit
.Rows(1).HorizontalAlignment = xlCenter
.Borders.Weight = xlThin
End With
End With
End Sub
Cordialement.
Bonjour,
Merci ça fonctionne !!!
Ne serait-il pas possible de mettre dans la feuille CHECK toutes la ligne de l'article qui à changer de PA ?
Ne serai-il pas possible également d'ajouter à la suite dans CHECK les articles dont les prix ont changé dans les autres onglets , BIERES SPECIALES, FOOD etc. ?
Un tout grand merci à vous ... vraiment !
Loadlucas
Je reprends quelques lignes du code ci-dessus :
j = j + 1: ReDim Preserve Tpm(2, j)
Tpm(0, j) = k: Tpm(1, j) = .Cells(i, 6): Tpm(2, j) = .Cells(i, 21)
On y incrémente un tableau, chaque fois que l'on trouve un prix modifié, tableau à 3 colonnes (0 à 2) et j lignes +1 (qu'il faudra transposer à l'affectation sur un plage (ligne, colonnes)...
On y sert les 3 colonnes avec le code, la désignation, le prix modifié.
Pour ajouter d'autres éléments, tu augmentes le nombre de colonnes et tu les sers... Mais toute la ligne me paraît quelque peu excessif !
Tpm(0, 0) = "CODE": Tpm(1, 0) = "Désignation": Tpm(2, 0) = "Prix modifié"
Ici tu utilises la ligne 0 du tableau pour saisir les en-têtes...
With .Range("A1:C" & j + 1)
.Value = WorksheetFunction.Transpose(Tpm)
Et enfin tu l'affectes en dimensionnant la plage cible à la dimension du tableau. Si tu l'étends en colonnes, tu dimensionnes en conséquence.
Tu peux donc facilement procéder aux adaptations que tu souhaites.
Ne serai-il pas possible également d'ajouter à la suite dans CHECK les articles dont les prix ont changé dans les autres onglets , BIERES SPECIALES, FOOD etc. ?
On n'a travaillé au départ que sur une feuille à mettre à jour...
Si le fichier Fournisseur concerne plusieurs feuilles (à confirmer), il conviendrait après avoir recueilli les informations de mises à jour dans ledit fichier (fait actuellement) et effacé Check (une seule fois avant boucle sur les feuilles) de :
- opérer une boucle sur toutes les feuilles à mettre à jours, pour y répéter la procédure de mise à jour
- ce qui implique que les feuilles aient une structure identique, et qu'on les liste pour pouvoir boucler...
- opérer le recensement des modifs, à la suite, sans effacer à chaque fois...
Cordialement.
Bonjour,
Super ...
Un grand merci pour tes explications ... En effet, je vais ajouter les colonnes supplémentaire avec cette méthode ...
Je créerai des feuilles CHECK pour chaque catégories de produits et ainsi appliquer la macro à chaque feuille pour qu'elle serve la feuille CHECK respective.
Un tout grand merci !
Loadlucas