Macro avec boucle et somme selon critères
Bonjour à tous,
Je débute en VBA et je me suis lancé dans une opération compliquée mais je ne doute pas que vous saurez m'aider.
Dans le fichier Test que j'ai mis en pièce jointe, je souhaiterai affecter une macro à mon bouton "CommandButton1" en bas qui me permette de faire la somme des chiffres de la colonne E ("taille") en fonction des critères de classe de la dernière colonne I et qui me renvoie ces chiffres dans le deuxième tableau.
J'ai commencé à écrire un code que vous trouverez dans le fichier, seulement apparemment çà ne fonctionne pas.
Pourriez vous me donner des pistes ou m'expliquer là où çà bloque.
Je sais que je pourrais écrire directement les formules dans le second tableau, seulement je souhaiterai faire cette opération par macro ( et puis j'apprendrai ainsi comment gérer une boucle sur VBA....)
En vous remerciant par avance de vos participations
Cordialement,
- Messages
- 358
- Excel
- 2003-2007 FR
- Inscrit
- 02/08/2011
- Emploi
- Consultant Test Performance / Audit
Salut
Ton code ressemblerai plutot a ca :
Dim i As Integer
For i = 8 To 51
valeur = Cells(i, 9)
If valeur = "Monétaire" Then
Range("D58").Value = Cells(i, 5) + Range("D58").Value
End If
If valeur = "Taux/Obligataire" Then
Range("D59").Value = Cells(i, 5) + Range("D59").Value
End If
If valeur = "Diversifiés" Then
Range("D60").Value = Cells(i, 5) + Range("D60").Value
End If
If valeur = "Actions" Then
Range("D61").Value = Cells(i, 5) + Range("D61").Value
End If
If valeur = "Multigestion Alternative" Then
Range("D62").Value = Cells(i, 5) + Range("D62").Value
End If
If valeur = "Immobilier" Then
Range("D66").Value = Cells(i, 5) + Range("D66").Value
End If
Next
End SubMAIS, tu ne peux pas faire une addition de deux cellules ne contenant pas que des nombres....
Exemple :
Cellule E38 = 35 ou 130 (2 lots)
damien
Salut Bigdams et le forum
Ta macro avec un léger lifting :
Ton code ressemblerai plutot a ca :
Dim X As Long
For X = 8 To 51
Select Case Cells(i, "I")
Case "Monétaire"
Range("D58") = Cells(X, "E") + Range("D58")
Case "Taux/Obligataire"
Range("D59") = Cells(X, "E") + Range("D59")
Case "Diversifiés"
Range("D60") = Cells(X, "E") + Range("D60")
Case "Actions"
Range("D61") = Cells(X, "E") + Range("D61")
Case "Multigestion Alternative"
Range("D62") = Cells(X, "E") + Range("D62")
Case "Immobilier"
Range("D66") = Cells(X, "E") + Range("D66")
End Select
Next XA+
Merci Bigdams !!
çà fonctionne bien !!
Gorfael ton code fonctionne éalement à merveille : seulement je ne comprends pas exactement ce qe tu as fait ! *
Enfin j'ai une dernière petite question.
Comment je pourrai m'arranger pour que dans la colonne "obtenu" du second tableau ne figure que la somme des appels d'offres ayant été gagné... toujours en appuyant sur le même bouton "CommandButton1"
Je comptais rajouter une fonction si, plutôt dans le code de Gorfael qui a l'avantage de ne pas déjà en comporter.
Du style Si dans la colonne H tu as "gagné" alors applique le code ci-dessus pour remplir la colonne obtenu sinon non oublie.
Sachant qu'il doit de toute façon remplir la colonne repartition par classes d'actifs de toute façon (gagné ou perdu)
C'est ce qui me seblait pas mal, seulement je n'arrete pas de faire buguer le code.
J'espere que vous m'aurez compris (à la relecture çà semble peu clair) et que vous pourrez m'indiquer une solution
merci
- Messages
- 358
- Excel
- 2003-2007 FR
- Inscrit
- 02/08/2011
- Emploi
- Consultant Test Performance / Audit
Salut,
Le code de Gorfael est plus 'propre'.
En effect c'est un code plus lisible.
La fonction VBA select case convient mieux a ce sujet plutot que de faire plein de if.
Après c'est juste de l'écriture.... Pense a celui qui va reprendre ton code....
Voici un code avec select case plus un petit If pour ne faire la somme que si on ne trouve pas le mot perdu dans la colonne H
De plus, au début de la macro fais un erase des sommes precedentes sinon tu vas le ré-additionner
Dim i As Integer
'Efface ancienne valeur (sinon on va additionner les anciennes valeurs en plus
Range("D58", "D63").Clear
For i = 8 To 51
If InStr(1, UCase(Cells(i, "H").Value), UCase("Perdu")) = 0 Then 'Si on ne trouve pas le texte "Perdu" dans la cellule H.. alors on fait la somme
Select Case Cells(i, "I") 'En fonctin du text dans la cellule on fait :
Case "Monétaire" 'Si le contenu = Monétaire alors on fait
Range("D58").Value = Cells(i, 5) + Range("D58").Value
Case "Taux/Obligataire"
Range("D59").Value = Cells(i, 5) + Range("D59").Value
Case "Diversifiés"
Range("D60").Value = Cells(i, 5) + Range("D60").Value
Case "Actions"
Range("D61").Value = Cells(i, 5) + Range("D61").Value
Case "Multigestion Alternative"
Range("D62").Value = Cells(i, 5) + Range("D62").Value
Case "Immobilier"
Range("D63").Value = Cells(i, 5) + Range("D63").Value
End Select
' End If
NextDamien
Merci Bigdams !!
C'est désormais beaucoup plus clair !!
J'ai une dernière petite question...concernant la fonction erase.
C'est pas mal, beaucoup mieux que mon bouton réinitialiser qui obliger à cliquer sur 2 boutons pour faire une seule action.
Seulement, il n'est pas trop fonctionnel car les cellules effacées se mettent autommatiquement au format date (donc les nombres ne peuvent plus y figurer). C'est super pénible, d'autant que j'arrive pas à le changer et que je ne comprends pas pourquoi d'un Range("D58", "D63").Clear il déduit aussi mets moi ces cellules au format date.
J'éspère que tu pourras me renseigner sur cette coquille, car pour l'instant je reste sur mon 2e bouton (pénible mais pas de changement de format)
En tout cas merci.
- Messages
- 358
- Excel
- 2003-2007 FR
- Inscrit
- 02/08/2011
- Emploi
- Consultant Test Performance / Audit
Re,
Bizarre....
Normalement il te le remet en standard....
Rajoute la ligne suivnate dans le code pour forcer le format après le clear..
Range("D58", "D63").Clear
Range("D58", "D63").NumberFormat = "General"Dis moi si c'est mieux
Damien
Non, çà ne marche pas plus !!!
Maintenant, en remplaçant Clear qui supprime tout même le format par ClearContents çà fonctionne.
Donc c'est tip top, merci beaucoup !!!
Ah si en fait un tout dernier petit point.
Pour le If, ce n'est pas plutot possible de dire s'il y a gagnédans la colonne H alors...
Plutôt que s'il n'y a pas perdu, alors ....
De cette manière je pourrais faire plus de distinction dans ma colonne H
Comment je pourrais écrire çà (j'ai essayé mais je suis pas à l'aise avec Instr ( en plus je sais pas ce que fout le 1 en début de parenthèse)
bonjour ,
essaye avec sa :
If InStr(1, UCase(Cells(i, "H").Value), UCase("Gagne")) <> 0 ThenLe 1 en début de parenthèse indique à quel caractère on commence (ici le premier)
Cordialement