Copie conditionnelle / somme conditionnelle (vba)

Raf_la_menaf' Messages postés 12 Statut Membre -  
Raf_la_menaf' Messages postés 12 Statut Membre -
Bonjour le forum,

Je dispose, en feuille1, d'un tableau qui recense la location d'appareil ; par exemple :

Nom_client / N°série_appareil / Date_de_retour / Tarif

Dupont......./........K0001........../.....20-fev.-14..../..150,00€
Durand......./........K0002........../.....25-fev.-14..../..200,00€
Martin........./........K0003........../.....27-fev.-14..../..150,00€
Cartier......../........K0001........../....04-mars-14.../..250,00€
Untel........../........K0002........../.....15-mars-14.../..150,00€
Machin......../........K0001........../....06-avr.-14...../..100,00€
etc.
etc.
etc.

Particularité : un appareil (N° série) peut être loué plusieurs fois et le tarif n'est pas lié à l'appareil.

Je dispose, en feuille2, d'un autre tableau qui recense l'utilisation de chacun de mes appareils ; chaque ligne correspond donc à un numéro de série. Je souhaite obtenir, pour chaque appareil, la date du dernier retour (pour savoir s'il est libre) ainsi que le total du chiffre générer (par appareil). Si je garde l'exemple ci-dessus :

N°série_appareil / Dernière_date_retour / Libre_? / CA_€
K0001................./...........06-avr.-14........./...Non..../ 500,00€
K0002................./..........15-mars-14......../...Non..../ 350,00€
K0003................./...........27-fev.-14........./...Oui..../ 150,00€
etc.
etc. (J'ai 50 appareils de recensés)

Pour cela, j'ai fait une macro Worksheet_activate() pour qu'a l'ouverture de ma feuille2, le tableau se mette à jour.

Mon problème c'est que je n'arrive pas à générer les cellules "Dernière_date_retour" et "CA_€".

Tout ce que j'ai tenté (condition if, boucle for, boucle for each...) me donne uniquement une réponse pour la dernière ligne de feuille1 où apparaît le n° de série...

Je m'adresse donc à vous pour me trouver une solution =)

Merci d'avance,

Raf.

2 réponses

  1. Raf_la_menaf' Messages postés 12 Statut Membre
     
    Je précise que j'ai recherché un petit peu sur différents forum mais je n'ai pas trouvé de réponse.

    Si toutefois un tel topic existe, merci de me le signaler.

    A +
    0
  2. Polux31 Messages postés 7219 Statut Membre 1 204
     
    Bonjour,

    Pas sûr qu'Excel soit ce qu'il faut pour faire ça.

    Si on admet qu'une seule référence est louée par jour, sur 50 semaines, ça va faire 250 lignes, pour faire le total généré par article uniquement, ça fait quelques 12500 tests !!!
    0
    1. Raf_la_menaf' Messages postés 12 Statut Membre
       
      Polux,

      Oui je comprends bien...

      Dans mon cas, un appareil est loué au minimum pour un mois, il ne peut donc être loué au maximum que 12 fois par an.

      C'est possible du coup avec excel ? :-p
      0
    2. Raf_la_menaf' Messages postés 12 Statut Membre
       
      Pour info, voila le bout de code que j'avais tapé (pour Dernière_date_retour) :

      Sub Derniere_date()

      For i = 2 To 51
      For k = 2 To 1000
      If Worksheets("feuille1").Cells(k, 2).Value = Worksheets("feuille2").Cells(i, 1).Value Then
      Dim today As Date
      today = Date
      If Application.WorksheetFunction.Max(Worksheets("feuille1").Cells(k, 3).Value) >= today Then
      Worksheets("feuille2").Cells(i, 2).Value = Application.WorksheetFunction.Max(Worksheets("Fiche de suivi Client").Cells(k, 3).Value)
      Else
      Worksheets("feuille2").Cells(i, 2).Value = ""
      End If
      End If
      Next
      Next

      End Sub


      Mais ça me donne uniquement la date de la dernière ligne où a été trouvé le numéro de série
      0
    3. Raf_la_menaf' Messages postés 12 Statut Membre
       
      Après, a priori, le tableau de la feuille1 s'incrémente au fur et à mesure de l'année donc la dernière ligne où a été trouvé le numéro de série doit correspondre à la dernière date ; s'il existe une formule plus simple je prends mais sinon la mienne me convient (c'était juste pour pour que ça fasse plus propre).


      Le plus embêtant c'est pour la somme du CA, car si ça me donne uniquement le tarif de la dernière ligne où a été trouvé le numéro de série je n'ai pas la somme que je recherche...

      Pour info, la bout de code était :

      Sub CA()

      For i = 2 To 51
      For k = 2 To 1000
      If Worksheets("feuille1").Cells(k, 2).Value = Worksheets("feuille2").Cells(i, 1).Value Then
      Worksheets("feuille2").Cells(i, 4).Value = Application.WorksheetFunction.Sum(Worksheets("Fiche de suivi Client").Cells(k, 4).Value)
      End If
      Next
      Next

      End Sub
      0
    4. Polux31 Messages postés 7219 Statut Membre 1 204
       
      Pour la date de retour effectivement, si c'est par ordre chrono, tu auras toujours la dernière date. Pas la peine de faire une usine à gaz pour ça.

      Au lieu de parcourir 1000 lignes alors qu'il ne peut en avoir que 250, c'est pas top.

      Tu peux déclarer une variable derLig et t'en servir comme limite pour le For Next

      Dim Derlig As Long
      
      Derlig = Worksheets("feuille1").Range("A1").End(xlDown).Row


      Pour le CA:
      Prend une variable pour faire le cumul.

      Dim CA As Double
      
      For i = 2 To 51 
      CA = 0
           For k = 2 To Derlig 
                If Worksheets("feuille1").Cells(k, 2).Value = Worksheets("feuille2").Cells(i, 1).Value Then
                     CA = CA + CDble(Worksheets("feuille1").Cells(k, 2).Value)
                End If
           Worksheets("feuille2").Cells(i, 4).Value = CA
           Next k
      Next i
      0
    5. Raf_la_menaf' Messages postés 12 Statut Membre
       
      Merci Polux =)

      Pour la dernière date c'est magique, ça prend en compte la plus grande date même si ce n'est pas la dernière !



      Par contre quand je compile le cumul j'ai une erreur :

      "Sub ou Function non définie" et ça me surligne le CDble

      J'en est déduit qu'il y avait un "e" en trop, mais quand j'execute la macro il y a une nouvelle erreur :
      "erreur d'execution '13': incompatibilité de type"

      J'ai essayer de remplacer : CA = CA + CDbl(Worksheets("feuille1").Cells(k, 2).Value)

      par

      CA = CA + CDble(Worksheets("feuille1").Cells(k, 4).Value)

      (C'est le CA que je somme, pas le numéro de série, j'ai bon ?)

      Mais du coup, ça me donne encore la dernière ligne et pas le cumul du CA...


      Désolé de t'embêter encore un peu =)

      Merci encore pour le temps que je t'accapare
      0