Problème VBA Excel
Résolu/Fermé
Landoltp
Messages postés
68
Date d'inscription
mercredi 1 août 2007
Statut
Membre
Dernière intervention
14 mars 2008
-
16 oct. 2007 à 14:25
S_D Messages postés 22 Date d'inscription mardi 30 juin 2009 Statut Membre Dernière intervention 25 août 2009 - 8 juil. 2009 à 22:09
S_D Messages postés 22 Date d'inscription mardi 30 juin 2009 Statut Membre Dernière intervention 25 août 2009 - 8 juil. 2009 à 22:09
A voir également:
- Problème VBA Excel
- Liste déroulante excel - Guide
- Formule excel - Guide
- Si et excel - Guide
- Aller à la ligne excel - Guide
- Mise en forme conditionnelle excel - Guide
9 réponses
gbinforme
Messages postés
14946
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 688
18 oct. 2007 à 23:21
18 oct. 2007 à 23:21
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
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
Landoltp
Messages postés
68
Date d'inscription
mercredi 1 août 2007
Statut
Membre
Dernière intervention
14 mars 2008
1
19 oct. 2007 à 10:57
19 oct. 2007 à 10:57
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
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
gbinforme
Messages postés
14946
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 688
19 oct. 2007 à 12:04
19 oct. 2007 à 12:04
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.
@+
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.
@+
Landoltp
Messages postés
68
Date d'inscription
mercredi 1 août 2007
Statut
Membre
Dernière intervention
14 mars 2008
1
19 oct. 2007 à 12:53
19 oct. 2007 à 12:53
voilà le lien: http://www.cijoint.fr/cij67916736429132.xls
merci beaucoup
merci beaucoup
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
gbinforme
Messages postés
14946
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 688
20 oct. 2007 à 09:32
20 oct. 2007 à 09:32
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 :
"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.
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.
Landoltp
Messages postés
68
Date d'inscription
mercredi 1 août 2007
Statut
Membre
Dernière intervention
14 mars 2008
1
20 oct. 2007 à 10:47
20 oct. 2007 à 10:47
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
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
gbinforme
Messages postés
14946
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 688
20 oct. 2007 à 18:22
20 oct. 2007 à 18:22
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 :
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 :
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 @+
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 @+
Landoltp
Messages postés
68
Date d'inscription
mercredi 1 août 2007
Statut
Membre
Dernière intervention
14 mars 2008
1
20 oct. 2007 à 18:38
20 oct. 2007 à 18:38
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:
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
S_D
Messages postés
22
Date d'inscription
mardi 30 juin 2009
Statut
Membre
Dernière intervention
25 août 2009
8 juil. 2009 à 22:09
8 juil. 2009 à 22:09
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....
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....