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

Exact !

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
(la commande se fait dans la colonne G pour le FOURN1 pour BOISSONS par exemple)
  • 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

14maj-pa.rar (240.91 Ko)

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

Rechercher des sujets similaires à "fusionner modifications prix"