Problème VBA Excel

Résolu
Bonjour,
dans le cadre de mon travail de diplome je dois effectuer un programme sur VBA Excel. Mais là je bloque... je dois créer une boucle qui me permette de répéter une action sur tous les clients et je ne sais absolument pas comment m'y prendre, donc si quelqu'un aurait une suggestion (ou pour plus de précisions) je l'en remercie d'avance.
Configuration: Windows XP
Internet Explorer 7.0

9 réponses

  1. Contributeur
    bonjour

    je dois créer une boucle qui me permette de répéter une action sur tous les clients

    For i = to nombre_clients
    ....ton traitement qui avec i identifie le client
    next i
    1. merci pour ta réponse, mais comment je fais pour identifier les clients? (je débute en VBA)
      pour l'instant je fais un test avec un échantillon de 99 clients (cellules A2:A9 de feuil3) et le code se trouve sur la Feuil2.
      si le fichier pourrait t'aider, je peux le metter sur ci-joint.fr
      merci encore
      1. Contributeur
        bonjour

        si le fichier pourrait t'aider, je peux le metter sur ci-joint.fr

        Là ce serait beaucoup mieux car ce n'est pas facile de deviner comment tu as structuré ton classeur.

        Merci de ne pas oublier de mettre l'adresse du lien pour le retrouver.

        @+
        1. voilà le lien: http://www.cijoint.fr/cij67916736429132.xls

          merci beaucoup
          1. Contributeur
            bonjour

            Avec le fichier c'est plus facile de comprendre le problème, même si la solution n'est pas évidente.
            Pour que les clients soient traités par ta macro il faut changer de cette façon :
            Set maf = Sheets("feuil2")
            Set maf2 = Sheets("feuil3")
               For client = 2 To maf2.range("a65536").end(xlup).row
                maf.Range("A18:F419").ClearContents
                montant = maf2.Range("e" &  client)
            

            "maf2.range("a65536").end(xlup).row" détermine la dernière ligne de données.
            Il faut aussi changer tous les autres range'".2") par Range("." & client)

            Ainsi chaque fois que la boucle se déroule tu changes de client et tu prends en compte ses données propres.

            Par contre, comme tu peux le voir, sur la feuil2 tu écrases les résultats du précédent puisqu'ils ne sont pas dynamiques.

            Donc soit il faut déplacer la zone d'écriture en même temps que la zone de lecture et si tu décales les colonnes,tu ne peux traiter que 256 / 6 clients,
            soit il faut traiter à l'unité chaque client en le choisissant dans une liste générée à partir des données.

            Selon l'utilisation du classeur qui est désirée il faut faire le choix.

            Donc c'est à toi de voir comment continuer la mise en place.
            1. bonjour,

              merci beaucoup pour la boucle ça marche parfaitement.

              Par contre, comme tu peux le voir, sur la feuil2 tu écrases les résultats du précédent puisqu'ils ne sont pas dynamiques.

              ça c'est un problème (pas au niveau de l'échéancier mais au niveau des montants des cellules C11 à C16) car il fautdrait que cela additionne les paiements des clients... est-ce que tu penses que c'est possible à faire? (sachant qu'ici je n'ai qu'un échantillon, que la base réelle comprend plus de 200'000 clients)

              encore merci pour ton aide
              1. Contributeur
                bonjour

                au niveau des montants des cellules C11 à C16) car il fautdrait que cela additionne les paiements des clients... est-ce que tu penses que c'est possible à faire?

                Pour cela, c'est assez simple :

                1 avant la boucle tu définis une zone pour le montant à cumuler et tu effaces les calculs, par exemple :
                Dim ech As Double
                    maf.Range("c11:c16").ClearContents
                

                2 dans ta boucle index tu enlèves les mises à jour cellules, tu calcules ton montant à cumuler et tu l'additionnes dans la bonne échéance :
                    For index = 1 To differ + dur
                        jour = DateSerial(Year(dep), Month(dep) + index, Day(dep))
                        If Weekday(jour, 2) = 6 Then jour = jour - 1
                        If Weekday(jour, 2) = 7 Then jour = jour + 1
                        If index <= differ Then
                            ech = (montant * tau / 1200) + (montant * fdg / (dur + differ))
                        Else
                            ech = rbt + (montant * fdg / (dur + differ))
                        End If
                        Select Case jour
                            Case Date To Date + 30
                                Range("C11").Value = Range("C11").Value + ech
                            Case Date + 30 To Date + 90
                                Range("C12").Value = Range("C12").Value + ech
                            Case Date + 90 To Date + 180
                                Range("C13").Value = Range("C13").Value + ech
                            Case Date + 180 To Date + 360
                                Range("C14").Value = Range("C14").Value + ech
                            Case Date + 360 To Date + 720
                                Range("C15").Value = Range("C15").Value + ech
                            Case Date + 720 To Date + 1080
                                Range("C16").Value = Range("C16").Value + ech
                            Case Else
                        End Select
                    Next index
                

                L'utilisation du "case" facilite la compréhension du code il me semble.
                Je n'ai pas vérifié les calculs qui étaient faits, je les prend identiques.

                3 tu supprimes les formules sommeprod qui deviennent inutiles.

                la base réelle comprend plus de 200'000 clients
                Le nombre de lignes est limité à 65536 jusqu'à excel 2007 qui esit passé au double mais c'est toujours trop peu me semble-t-il ?

                Bon test et @+
                1. Ca marche nickel sur l'échantillon.

                  Le nombre de lignes est limité à 65536 jusqu'à excel 2007 qui esit passé au double mais c'est toujours trop peu me semble-t-il ?

                  C'est vrai que ça reste un problème, mais ça je verrais comment mon prof veux que je le fasse (peut-être passer pas Access, ce qui serait terrible, car je m'y connais encore moins qu'en Excel ou faire sur plusieurs feuilles et simplement répéter le code sur chacune d'elle, on verra).

                  Mais quoiqu'il en soit je te remercie beaucoup pour ton aide, @ +

                  le code en entier si ça peut éventuellement intéresser quelqu'un:

                  Private Sub CommandButton1_Click()
                  
                  Dim client
                  Const fdg As Double = 0.1
                  Dim montant As Double
                  Dim tau As Double
                  Dim tau2 As Double
                  Dim dur As Integer
                  Dim dep As Date
                  Dim differ As Single
                  Dim maf As Worksheet
                  Dim index As Long
                  Dim rbt As Currency
                  Dim jour As Date
                  Dim ech As Double
                      
                  Set maf = Sheets("feuil2")
                  Set maf2 = Sheets("feuil3")
                  
                      maf.Range("c11:c16").ClearContents
                  
                  
                  For client = 2 To maf2.Range("a65536").End(xlUp).Row
                  
                      maf.Range("A18:F419").ClearContents
                      montant = maf2.Range("e" & client)
                      tau = maf2.Range("f" & client) * 12 * 100
                      tau2 = maf2.Range("f" & client)
                      dur = maf2.Range("i" & client)
                      differ = maf2.Range("k" & client)
                      rbt = (montant * (-tau2) * (1 + tau2) ^ dur) / (1 - (1 + tau2) ^ dur)
                      dep = maf2.Range("d" & client)
                         
                      For index = 1 To differ + dur
                      maf.Range("a" & index + 17) = index
                      jour = DateSerial(Year(dep), Month(dep) + index, Day(dep))
                      If Weekday(jour, 2) = 6 Then jour = jour - 1
                      If Weekday(jour, 2) = 7 Then jour = jour + 1
                  
                      maf.Range("b" & index + 17) = Format(jour, "dddd")
                      maf.Range("c" & index + 17) = jour
                          If index <= differ Then
                          maf.Range("d" & index + 17) = montant * tau / 1200
                          maf.Range("e" & index + 17) = montant * fdg / (dur + differ)
                          maf.Range("f" & index + 17) = (montant * tau / 1200) + (montant * fdg / (dur + differ))
                          Else
                          maf.Range("d" & index + 17) = rbt
                          maf.Range("e" & index + 17) = montant * fdg / (dur + differ)
                          maf.Range("f" & index + 17) = rbt + (montant * fdg / (dur + differ))
                          End If
                      Next index
                      
                      For index = 1 To differ + dur
                          jour = DateSerial(Year(dep), Month(dep) + index, Day(dep))
                          If Weekday(jour, 2) = 6 Then jour = jour - 1
                          If Weekday(jour, 2) = 7 Then jour = jour + 1
                          If index <= differ Then
                              ech = (montant * tau / 1200) + (montant * fdg / (dur + differ))
                          Else
                              ech = rbt + (montant * fdg / (dur + differ))
                          End If
                          Select Case jour
                              Case Date To Date + 30
                                  Range("C11").Value = Range("C11").Value + ech
                              Case Date + 30 To Date + 90
                                  Range("C12").Value = Range("C12").Value + ech
                              Case Date + 90 To Date + 180
                                  Range("C13").Value = Range("C13").Value + ech
                              Case Date + 180 To Date + 360
                                  Range("C14").Value = Range("C14").Value + ech
                              Case Date + 360 To Date + 720
                                  Range("C15").Value = Range("C15").Value + ech
                              Case Date + 720 To Date + 1080
                                  Range("C16").Value = Range("C16").Value + ech
                              Case Else
                          End Select
                      Next index
                  
                  Next client
                  
                  End Sub
                  1. tu peut aussi le faire sur 2 fichiers.....

                    Perso je suis limite par le nombre de colonnes (256), mais g trouve une parade.

                    j'introduis une variable trouve et je la change de valeur si je trouve ds lq premiere page. Sinon la recherche continue....