Faire une somme d'une plage selon une condition

Signaler
Messages postés
61
Date d'inscription
jeudi 19 mai 2005
Statut
Membre
Dernière intervention
1 juin 2014
-
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
-
Bonsoir à tous,
J'ai 2 feuilles dont l'une s'intitule "Balance" et retrace des n° de comptes en 1er colonne, en 2ième colonne des intitulés et en 3ième et 4 ième colonne des montants.
Je voudrais que ma macro recherche dans la 1ère colonne s'il figure des comptes 707. Si vrai, je voudrais faire le total de ces 707 et copier ce total dans la feuille 2 en cellule C8.
J'ai fait ce code qui ne fait rien :

Sub TransfertCalculMarge()
   Worksheets("B100").Activate
    Dim x As Integer ' declaration de variables
    Dim y As Integer ' ligne dans feuille 1
    Dim y2 As Integer ' Ligne dans feuille 2
        
    Dim total_annee_1 As Long
    Dim total_annee_2 As Long


    total_annee_1 = 0 ' Initialisation des variables
    total_annee_2 = 0
       
    y2 = 8
    y = 11
  
    ' Boucle et condition afin de parcourir la colonne 1 de la balance et
    ' rechercher les n° cptes commencant par 707


    Do While Sheets("Balance").Cells(y, 1).Value <> "" ' la boucle s'arrete quand la cellule
                                                       ' est vide
   
       If Left(Sheets("Balance").Cells(y, 1).Value, 3) = "707" Then         ' test cherchant les cptes 707
           Sheets("b100").Cells(y2, 4).Value = Sheets("balance").Sum(Range(y, 4))
            y2 = y2 + 1
        End If  ' Fin de test
       


    y = y + 1 ' Compteur de la boucle, on incremente de 1
   
    Loop ' fin de la boucle
    
End Sub


Quelqu'un peut il venir à mon aide

8 réponses

Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
10
et pourquoi passer par une macro ? est-ce bien raisonnable... as-tu regardé du côté de SOMME.SI ?

Amicalement,
Us.
Messages postés
61
Date d'inscription
jeudi 19 mai 2005
Statut
Membre
Dernière intervention
1 juin 2014

Désolé mais je prefèrerai faire celà avec une macro.

J'ai tenté celà mais ça ne marche pas (quand je dis çà ne marche pas , c'est que rien ne se produit). Voici le fautif :

Sub TransfertCalculMarge()
   Worksheets("B100").Activate
    Dim x As Integer ' declaration de variables
    Dim y As Integer ' ligne dans feuille "Balance
    Dim y2 As Integer ' Ligne dans feuille "My B400"
   
    Dim Date_exercice1 As Date
    Dim Date_exercice2 As Date
    Dim Variat As String
    Dim En_pourcentage As String
   
   
    Dim total_annee_1 As Long
    Dim total_annee_2 As Long


    total_annee_1 = 0 ' Initialisation des variables
    total_annee_2 = 0
   
    Date_exercice1 = Sheets("Accueil").Cells(32, 5).Value
    Date_exercice2 = Sheets("Accueil").Cells(36, 5).Value
   
    Variat = ""
    En_pourcentage = ""
   
    y2 = 8
    y = 11
  
   
   
    ' Boucle et condition afin de parcourir la colonne 1 de la balance et
    ' rechercher les n° cptes commencant par 707


    Do While Sheets("Balance").Cells(y, 1).Value <> "" ' la boucle s'arrete quand la cellule
                                                       ' est vide
   
       If Left(Sheets("Balance").Cells(y, 1).Value, 3) = "707" Then         ' test cherchant les comptes 707
          total_annee_1 = total_annee_1 + Sheets("balance").Cells(y, 4).Value
            y2 = y2 + 1
        End If  ' Fin de test
       
    y = y + 1 ' Compteur de la boucle, on incremente de 1
   
    Loop ' fin de la boucle
    Sheets("b100").Cells(y2, 3).Value = total_annee_1
   
    '-----------------------------------------
    'On fait de même pour les 706
   
    y2 = y2 + 1
   
    Do While Sheets("Balance").Cells(y, 1).Value <> "" ' la boucle s'arrete quand la cellule est vide
                                                          
       If Left(Sheets("Balance").Cells(y, 1).Value, 3) = "706" Then         '
          total_annee_1 = total_annee_1 + Sheets("balance").Cells(y, 4).Valu
            y2 = y2 + 1
        End If  ' Fin de test
       
    y = y + 1 ' Compteur de la boucle, on incremente de 1
   
    Loop ' fin de la boucle
   
    Sheets("b100").Cells(y2, 3).Value = total_annee_1
End Sub


 
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
10
" je prefèrerai faire celà avec une macro. "




ben, SOMME.SI avec une macro :

Sub Macro1()
MsgBox WorksheetFunction.SumIf(Range("A1:A3"), "<>3", Range("B1:B3"))
End Sub

Regarde déjà comment le faire avec SOMME.SI, puis adaptes le code ci-dessus... enfin, moi... ce que j'en pense des codes très long...

Que cela n'empêche personne te t'aider...

Amicalement,
Us.
Messages postés
584
Date d'inscription
jeudi 28 décembre 2006
Statut
Membre
Dernière intervention
29 avril 2010
1
SUMIF deverait faire l'affaire... pas de macro rien de compliquer une simple commande...

<hr size="2" width="100%" /> 
  zen69 aka Ortho Le Profett
 
Messages postés
1835
Date d'inscription
vendredi 13 mai 2005
Statut
Membre
Dernière intervention
20 novembre 2013
10
salut,

utilise des messsage box pour voir ce qui ce passe :

    Do While Sheets("Balance").Cells(y, 1).Value <> "" ' la boucle s'arrete quand la cellule
                                                       ' est vide
    MsgBox "Sheets("Balance").Cells(y, 1).Value="& Sheets("Balance").Cells(y, 1).Value& vbCrLf  & "Left(Sheets("Balance").Cells(y, 1).Value, 3)=" & Left(Sheets("Balance").Cells(y, 1).Value, 3)
       If Left(Sheets("Balance").Cells(y, 1).Value, 3) = "707" Then         ' test cherchant les comptes 707
          total_annee_1 = total_annee_1 + Sheets("balance").Cells(y, 4).Value
          MsgBox "total_annee_1 =" & total_annee_1 & vbCrLf  & "Sheets("balance").Cells(y, 4).Value=" & Sheets("balance").Cells(y, 4).Value
            y2 = y2 + 1
        End If  ' Fin de test
       
    y = y + 1 ' Compteur de la boucle, on incremente de 1
   
    Loop ' fin de la boucle
    Sheets("b100").Cells(y2, 3).Value = total_annee_1

cela te permetra aussi de savoir si tu es entré dans la boucle while et si la condition if est vrai de temps en temps
mais n'oublie pas de limiter la quantité de donnée sur la colonne 1 car sinon tu vas avoir a cliquer ok sur un grand nombre de message box

A+
Messages postés
61
Date d'inscription
jeudi 19 mai 2005
Statut
Membre
Dernière intervention
1 juin 2014

Re Bonsoir,

En ce qui concerne le somme.si celui ne fonctionne pas dans la mesure où je ne souhaite prendre que les 3 premiers chiffres du nombre.
Ex :
J'ai un compte 707100, 707200, 707300 etc... et je veux faire la somme des 707. Donc en l'état la fonction somme.si ne fonctionne pas.

J'ai essayé de mettre les Msgbox, mais il y une erreur de syntaxe dans le code que m'a transmis Bigfish.

Je ne comprends pas pourquoi mon code ne fonctionne pas !!
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
10
Bonjour,

A oui mais... Ce n'est pas ce que tu disais dans ton 1er Post... enfin, on ne pouvait le deviner.

=

Néanmoins, il reste encore la solution, sans VBA...
Mais pour cela il faut dans une colonne libre (événtuellement la masquer), extraire les 3 premiers caractères des n° de compte, grâce à :
= GAUCHE ( A1 ; 3 )
qui renvoi donc 707, puis de nouveau dans la feuille 2, mettre SOMME.SI ( plage ; "=707" ; plage )

=

Sinon, pour une macro, je vais te faire une petite proposition personnelle... car franchement tel que tu programme, je trouve ça bien trop lourd pour si peu...

Amicalement,
Us.
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
10
Re,

Voici une proposition spécifique à ton pb... bien sur les références sont à adapter...

=

Sub MacroPourForumVBF()

' Récupération du dernier enregistrement de la colonne A (contenant les 707)
    Dim Dernier AsLong
    Dernier = Range("A65536").End(xlUp).Row

' Plage
    Dim A As Range
    Set A = Range("A1:A" & Dernier)

' Plage à cumuler
    Dim B As Range
    Set B = Range("B1:B" & Dernier)

' Boucle de recherche et de cumul
    Dim V As Range
    Dim S AsDouble
    ForEach V In A        If Left(V, 3) "707" Then S S + Val(Replace(B.Cells(V.Row, 1), ",", "."))
    Next

' Renvoi
    MsgBox S

EndSub

=
 
Le Replace (bidule) n'est pas là pour faire beau, mais pour éviter la gestion d'erreur en cas de données non numérique.

Amicalement,
Us.