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,

596test.xlsm (231.56 Ko)

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 Sub

MAIS, 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 X

A+

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

426test-2.xlsm (235.04 Ko)

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
Next

Damien

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.

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 Then

Le 1 en début de parenthèse indique à quel caractère on commence (ici le premier)

Cordialement

Rechercher des sujets similaires à "macro boucle somme criteres"