|
|
|
|
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
Voilà le lien: http://www.cijoint.fr/cij67916736429132.xls
|
Bonjour
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. toujours zen |
Bonjour,
|
Bonjour
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 @+ toujours zen |
Ca marche nickel sur l'échantillon.
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 |