Mise à jour de stocks

Leghe59 Messages postés 36 Date d'inscription   Statut Membre Dernière intervention   -  
yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Soit le classeur suivant :
ISBN PRIX FOURNISSEUR
3281553413593 10,95 FOURNISSEUR XXX
3282118102310 5,7 STOCK
3282118102310 7,50 FOURNISSEUR XXX
3760039940049 9,99 STOCK
3760039940049 12,95 FOURNISSEUR XXX
3760039940193 14,99 STOCK
3760039940193 16,90 FOURNISSEUR XXX
3760039940346 19,99 STOCK
3760039940346 19,99 FOURNISSEUR XXX

Objectif : en cas de doublon ISBN, colorer en rouge la cellule PRIX si le FOURNISSEUR XXX a augmenté ses prix par rapport au STOCK et conserver les 2 lignes, sinon supprimer la ligne FOURNISSEUR XXX

Mon début de macro qui ne fonctionne pas (ne colore pas les bonnes cases) :
Sub nouveautes()
Dim ISBN As Range
Dim dl As Long
Dim x As Long
Set ISBN = Range("A2:A" & Range("A2").End(xlDown).Row)
ISBN.CurrentRegion.Sort Key1:=ISBN, Order1:=xlAscending, Header:=xlYes
dl = Cells(Application.Rows.Count, 1).End(xlUp).Row
For x = dl To 2 Step -1
If Application.WorksheetFunction.CountIf(ISBN, Cells(x, 1)) > 1 Then
If Cells(x, 2).Value > Cells(x - 1, 2).Value Then
Cells(x, 2).Interior.ColorIndex = 3
End If
End If
Next x
End Sub


Il y a là une logique que je n'assimile pas, les (x - 1) doivent interférer quelque part...
Il doit y avoir plus simple...
Merci à tou(te)s pour votre aide !

2 réponses

  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    bonjour, je pense que la logique de base de ton code est erronée:
    - pour chaque ligne, tu te poses la question "le code ISBN est-il présent plusieurs fois dans le fichier?"
    - j'ai l'impression que tu supposes que, quand un code ISBN est présent plusieurs fois, la ligne au dessus a le même code ISBN que la ligne courante 

    oublie un moment l'informatique, et imagine que tu dois expliquer en détail à quelqu’un comment faire cela à la main. que doit-il faire, ligne par ligne?
    quand ce sera clair et correct, tu pourras passer à la programmation.
    0
    1. Leghe59 Messages postés 36 Date d'inscription   Statut Membre Dernière intervention  
       
      Je me pose la question car ISBN est la clé. S'il n'est pas en double, il n'y a rien à faire.
      Et oui, je suppose que quand un code ISBN est présent plusieurs fois, la ligne au dessus a le même code ISBN que la ligne courante (d'où le tri).
      Si il est en double, c'est que j'ai 2 "fournisseurs", parfois au même prix, parfois non.
      Donc si l'ISBN est présent 2 fois, et que le prix est identique, je souhaite supprimer la ligne FOURNISSEUR XXX.
      Par contre si FOURNISSEUR XXX est moins cher, je souhaite simplement colorer sa ligne de prix.
      Je devrais comparer sur 2 cellules pour être précis :
      SI ISBN en double
      SI PRIX.FOURNISSEUR_XXX < PRIX.STOCK Then
      Colorie Prix.FOURNISSEUR_XXX en rouge

      Mais je bloque sur la syntaxe, malgré mes recherches...
      0
      1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Leghe59 Messages postés 36 Date d'inscription   Statut Membre Dernière intervention  
         
        il n'est pas correct de supposer que, quand un code ISBN est présent plusieurs fois, la ligne au dessus a le même code ISBN que la ligne courante. n'oublie pas que tu fais la vérification sur chaque ligne: que va-t'il donc se passer quand tu seras remonté d'une ligne?
        redéfini ta logique, décris-là, et puis, ensuite, pense à la syntaxe.
        0
    2. Leghe59 Messages postés 36 Date d'inscription   Statut Membre Dernière intervention  
       
      Ca plantera...
      Bon, tant pis. Merci quand même !
      0
  2. Leghe59 Messages postés 36 Date d'inscription   Statut Membre Dernière intervention  
     
    Ne fonctionne pas bien non plus...
    Me colore des cases ou prix STOCK = ou <

    Sub nouveautes()
    Dim ISBN As Range
    Dim dl As Long
    Dim x As Long
    Set ISBN = Range("A2:A" & Range("A2").End(xlDown).Row)
    ISBN.CurrentRegion.Sort Key1:=ISBN, Order1:=xlAscending, Header:=xlYes
    dl = Cells(Application.Rows.Count, 1).End(xlUp).Row
    For x = dl To 2 Step -1
    If Application.WorksheetFunction.CountIf(ISBN, Cells(x, 1)) > 1 Then
    If Cells(x, 1).Value = Cells(x - 1, 1) Then
    If Cells(x, 3) = "STOCK" And Cells(x - 1, 3) = "FOURNISSEURXXX" And Cells(x, 2).Value < Cells(x - 1, 2).Value Then
    Cells(x, 2).Interior.ColorIndex = 3
    End If
    End If
    If Cells(x, 1).Value = Cells(x + 1, 1) Then
    If Cells(x, 3) = "STOCK" And Cells(x + 1, 3) = "FOURNISSEURXXX" And Cells(x, 2).Value < Cells(x + 1, 2).Value Then
    Cells(x, 2).Interior.ColorIndex = 3
    End If
    End If
    End If
    Next x
    End Sub
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      je pense que ton code fait ceci:

      SI PRIX.STOCK < PRIX.FOURNISSEUR_XXX Then
      Colorie PRIX.STOCK en rouge

      Tu préféreras peut-être intervertir "STOCK" & "FOURNISSEURXXX".
      0
    2. Leghe59 Messages postés 36 Date d'inscription   Statut Membre Dernière intervention  
       
      non non, c'est bien ce que je veux faire.
      Mais il me colore AUSSI des cellules si PRIX.STOCK > PRIX.FOURNISSEUR_XXX ou si PRIX.STOCK = PRIX.FOURNISSEUR_XXX...

      ???
      0
    3. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Leghe59 Messages postés 36 Date d'inscription   Statut Membre Dernière intervention  
       
      peux-tu partager ton fichier?
      0
    4. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > Leghe59 Messages postés 36 Date d'inscription   Statut Membre Dernière intervention  
       
      c'est ce que je craignais: tes prix (ta colonne F) ne sont pas des valeurs numériques: Excel les traite comme du texte, donc les comparaisons foirent.
      peux-tu corriger cela globalement, d'où viennent ces valeurs?
      pas de panique, il y a probablement plusieurs méthodes pour corriger ou contourner cela. j'essaie de comprendre ton contexte pour faire au mieux.
      0