vba somme si conditions

  • Initiateur de la discussion Initiateur de la discussion Vilain
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Vilain

XLDnaute Accro
Bonjour à tous,
Je sollicite votre aide une fois de plus pour un problème vba.
J'ai un tableau avec les 12 mois et une colonne de cumul. Je souhaite faire un cumul des lignes ayant un X dans la colonne B à la fin du mois choisi dans une combobox (qui d'ailleurs a un problème dans ma macro puisque dans la liste un champ vide apparaît sans que je ne comprenne pourquoi).
Concretement, je souhaite qu'une fois la macro lancée, je choississe un mois, juin par exemple, et que dans ma colonne BA sois fait la somme de la ligne (si "x" en colonne B) pour les mois de janvier à juin.
Je joins mon fichier.
J'espère avoir été clair, demandez plus de précisions si ce n'est pas le cas.

Merci une fois encore pour votre aide 🙂
 

Pièces jointes

Re : vba somme si conditions

Salut Gillus69 et le forum
Rappel : on est le premier Juillet et sur un forum ! Alors ne t'étonne pas si les réponses n'arrivent pas dans l'heure 😡 !
(qui d'ailleurs a un problème dans ma macro puisque dans la liste un champ vide apparaît sans que je ne comprenne pourquoi)
Voilà ce qui arrive quand on ne comprend pas le code qu'on utilise ! Une valeur nulle est une valeur et si en feuille de calcul tu considères tes cellules fusionnées comme une seule, en VAB, tu lui dis de passer de cellule en cellule, donc, il va passer sur E3, F3, G3, H3, I3, etc...
Code:
Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
Dim Onglet As Worksheet
Dim Cel As Range

Set Onglet = Sheets("budget")
Set MonDico = CreateObject("Scripting.Dictionary")

For Each Cel In Onglet.Range("E3:AV3 ")
    If Cel <> "" Then MonDico.Item(Cel.Value) = Cel.Value
Next Cel

Me.ComboBox1.List = MonDico.items   'alimente la ComboBox1
End Sub
Ton code, pour qu'il fonctionne. Mais il pourrait être moins élaboré en faisant une simple boucle sur ta ligne au pas de trois pour charger ta combo.
J'ai un tableau avec les 12 mois et une colonne de cumul. Je souhaite faire un cumul des lignes ayant un X dans la colonne B à la fin du mois choisi.
Ça je comprends... du moins, si ton X correspond aux "x" de ton fichier!
Concretement, je souhaite qu'une fois la macro lancée, je choississe un mois, juin par exemple, et que dans ma colonne BA sois fait la somme de la ligne (si "x" en colonne B) pour les mois de janvier à juin.
Donc, si je fais ce que tu demandes, je choisis janvier, et à la ligne 7, je dois avoir 4 en BA7 😀.
Ce qui est évident pour un utilisateur habituel d'un fichier ne l'est pas forcément pour un occasionnel ! Faut tout expliquer !
Code:
Private Sub CommandButton1_Click()
'Ddéclaration ===================================
Dim Lig As Long, X As Long, Col As Long
Dim F As Worksheet
'MEI ============================================
Set F = Sheets("budget")
'Validité du traitement =========================
If Me.ComboBox1.ListIndex < 0 Then
    MsgBox "Choisissez un mois !!!", vbExclamation, "Saisie débile"
    Exit Sub
End If
'détermination de la colonne
Col = F.Range("E3:AW3").Find(Me.ComboBox1).Column + 3
'Traitement =====================================
For Lig = 5 To F.Cells(Rows.Count, "B").End(xlUp).Row
    If F.Cells(Lig, "B") = "x" Then
        F.Range(F.Cells(Lig, "BA"), F.Cells(Lig, "BD")).ClearContents
        For X = 5 To Col
            F.Cells(Lig, "BA").Offset(0, (X - 5) Mod 4) = F.Cells(Lig, X) + _
                                 F.Cells(Lig, "BA").Offset(0, (X - 5) Mod 4)
        Next X
    End If
Next Lig
End Sub
La macro remplies les 4 colonnes à partir de BA. Maintenant pour ne remplir que Ba et BB, il suffit de remplacer la boucle X Qui doit être par pas de 4 et de faire deux lignes pour remplir les cellules.
A+
 
Re : vba somme si conditions

Une fois de plus, merci pour ton aide.
Ce n'était pas de l'impatience, mais de l'étonnement (mon fichier n'était même pas consulté !).
Etant encore novice en vba, je ne comprend pas toujours tout les éléments de mon code et les explications ne sont pas toujours évidentes a trouvées.
En tout cas, tu as parfaitement compris ma demande et tes explications sont claires, je vais essayer d'appliquer tout ça à mon fichier.
Connaitrais tu un site avec des tutoriels pour que je cesse de t'envahir de questions ?
J'ai déja acheté plusieurs bouquins, mais c'est pas toujours super pratique.

Encore merci

A plus
 
Re : vba somme si conditions

Salut Gillus69 et le forum
les explications ne sont pas toujours évidentes à trouver
C'est bien vrai ça !
Connaitrais-tu un site avec des tutoriels pour que je cesse de t'envahir de questions ?
J'ai déja acheté plusieurs bouquins, mais c'est pas toujours super pratique.
Le problème avec les tutoriels et encore plus avec les bouquins, c'est que ce n'est pas interactif !
En rechercher une information précise, avec Google tu trouveras des tas de sites. Dire lequel est le mieux... ça dépend de toi, pas du Tuto.
Quant à nous envahir de questions... Si on ne veut pas répondre, on ne répond pas ! C'est ce qu'il y a de bien sur les sites : le langage est "surveillé", et ce qui amènerait une insulte ou une grossièreté dans la vie réelle se traduit par une absence de réponse.
Donc, n'hésite pas à demander des précisions tant que tu as un doute. Le but est que toi tu comprennes ce que tu codes.
Si les gens n'hésitait pas à poser des questions, on aurait peut-être moins d'erreurs à traiter.

Et puis ça nous permet d'étaler le peu de science qu'on connaît 😛.

À mon sens, la seule vraie grossièreté, c'est de demander par MP la réponse d'un problème qui devrait être traité sur le forum.
A+
 
Re : vba somme si conditions

Bonjour à tous !
Cela fonctionne parfaitement, mais j'ai tout de même un petit problème. Je souhaiterai ne remplir que les colonnes BA, BB et BC. Malgré les explications je ne parviens pas à faire les modifications nécessaires.
Quelqu'un pourrait m'indiquer quelle ligne modifier et de quelle manière ?
 
Dernière édition:
Re : vba somme si conditions

Ou même simplement BA et BB comme proposé plus haut :
La macro remplies les 4 colonnes à partir de BA. Maintenant pour ne remplir que Ba et BB, il suffit de remplacer la boucle X Qui doit être par pas de 4 et de faire deux lignes pour remplir les cellules.
Bien que cette phrase soit l'explication, je ne comprends pas et n'arrive pas à l'appliquer... 😡
 
Re : vba somme si conditions

Salut Gillus69 et le forum
Cela fonctionne parfaitement
Quoi ? Où ? quel vélo ? On n'est pas dans ta tête explique comme si on n'était pas des devins !

si c'est mon code, il suffit de remplacer
Code:
        For X = 5 To Col
            F.Cells(Lig, "BA").Offset(0, (X - 5) Mod 4) = F.Cells(Lig, X) + _
                                 F.Cells(Lig, "BA").Offset(0, (X - 5) Mod 4)
        Next X
par
Code:
For X = 5 To Col
    If ((X - 5) Mod 4) <> 3 Then F.Cells(Lig, "BA").Offset(0, (X - 5) Mod 4) = _
                    F.Cells(Lig, X) + F.Cells(Lig, "BA").Offset(0, (X - 5) Mod 4)
Next X
Comme on pointe BA, l'offset décale de Y colonne, avec Y=(x-5) mod 4
Pour E : (5-5) mod 4 => BA décalé de 0 mod 4 colonne = 0 => BA
Pour F : (6-5) mod 4 => BA décalé de 1 mod 4 colonnes = 1 => BB
Pour G : (7-5) mod 4 => BA décalé de 2 mod 4 colonnes = 2 => BC
Pour H : (8-5) mod 4 => BA décalé de 3 mod 4 colonnes = 3 => BD
Pour I : (9-5) mod 4 => BA décalé de 4 mod 4 colonnes = 0 => BA
etc. Il suffit de ne pas inscrire quand on doit décaler de 3 colonnes

Et si ce n'est pas ça, explique !
A+
 
Re : vba somme si conditions

Je vais essayer d'être plus clair.
Je souhaiterai que le cumul soit fait seulement sur BA et BB (et éventuellement BC), mais surtout pas sur BD.
La modification que tu m'as fait faire ne touche pas BD, mais le cumul de BC est faux, alors qu'il était bon jusque la. J'ai essayé différentes choses mais je suis confronté à ce problème aussi.
J'espère avoir été plus clair. 🙂
Encore merci.

ps : autre chose, je ne trouve pas à quoi correspond "mod" et ne trouve pas beaucoup d'explications dessus....
 
Re : vba somme si conditions

Salut Gillus69 et le forum
Ou même simplement BA et BB comme proposé plus haut :
La macro remplies les 4 colonnes à partir de BA. Maintenant pour ne remplir que Ba et BB, il suffit de remplacer la boucle X Qui doit être par pas de 4 et de faire deux lignes pour remplir les cellules.
Bien que cette phrase soit l'explication, je ne comprends pas et n'arrive pas à l'appliquer... 😡
En gros, remplacer la boucle du X, qui parcourt toutes les colonnes à partir de 5 par pas de 1, et comme on a pas besoin de tous les résultats, n'inscrire que ceux qu'on veut. Le code
Code:
For X = 5 To Col
    F.Cells(Lig, "BA").Offset(0, (X - 5) Mod 4) = F.Cells(Lig, X) + _
                         F.Cells(Lig, "BA").Offset(0, (X - 5) Mod 4)
Next X
devient
Code:
For X = 5 To Col Step 4
    F.Cells(Lig, "BA") = F.Cells(Lig, X) + F.Cells(Lig, "BA")
    F.Cells(Lig, "BB") = F.Cells(Lig, X + 1) + F.Cells(Lig, "BB")
Next X
A+
 
Re : vba somme si conditions

Parfait, c'est exactement ce que je cherchais à faire...
Encore 2 questions et je te laisse tranquille (du moins sur ce sujet 😉 ) :
-a quoi correspond ton "step 4" ?
-a quoi correspond "mod" et comment cela fonctionne-t-il ?
 
Re : vba somme si conditions

Salut Gillus69 et le forum
mais le cumul de BC est faux, alors qu'il était bon jusque la
Comme je n'ai fait qu'ôter la valeur 3, sans toucher au calcul de BC...
Dans mon poste suivant je t'explique mon explication 😉
je ne trouve pas à quoi correspond "mod" et ne trouve pas beaucoup d'explications
L'aide d'Excel donne
Mod, opérateur

Permet de diviser deux nombres en ne renvoyant que le reste. Syntaxe
result = number1 Mod number2
La syntaxe de l'opérateur Mod comprend les éléments suivants :
Élément Description

result Toute variable numérique. number1 Toute expression numérique. number2 Toute expression numérique.
Remarques
L'opérateur modulo, ou reste, divise l'argument number1 par l'argument number2 (en arrondissant les nombres à virgules flottantes à des nombres entiers) et ne retourne que le reste dans l'argument result. Par exemple, dans l'expression ci-dessous, A (argument result) est égal à 5.

A = 19 Mod 6.7 (19/7 reste 5)

En général, le type de données de l'argument result est Byte, un variant de type Byte, Integer, un variant de type Integer, Long ou Variant contenant une donnée de type Long, que l'argument result soit ou non un nombre entier. La partie décimale est tronquée. Cependant, si une expression est Null, l'argument result est Null. Toute expression Empty est traitée comme si elle avait la valeur 0.

Eh ouais, microsoft considère que l'aide VBA n'a pas a être mise sur l'ordinateur lors de l'installation par défaut 😡
A+
 
Re : vba somme si conditions

Salut Gillus69 et le forum
Beaucoup de postes pour pas grand choses 😉
-a quoi correspond "mod" et comment cela fonctionne-t-il ?
Code:
For X = 5 To Col Step 4
pour x = 5 jusqu'à Col par pas de 4 : 5, 5+4=9, 9+4=13, 13+4=17, etc
On ajoute le pas à la valeur
for X=10 to 1 step -1 => x va aller de 10 à un en "ajoutant" -1 : 10, 9, 8, ..., 2, 1
A+
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
2
Affichages
112
Réponses
3
Affichages
315
Réponses
5
Affichages
313
  • Question Question
Microsoft 365 Fonction si
Réponses
7
Affichages
223
Réponses
7
Affichages
281
Retour