Somme avec condition

Résolu/Fermé
NLAH Messages postés 125 Date d'inscription lundi 9 septembre 2013 Statut Membre Dernière intervention 13 juin 2017 - 5 avril 2017 à 18:04
NLAH Messages postés 125 Date d'inscription lundi 9 septembre 2013 Statut Membre Dernière intervention 13 juin 2017 - 8 avril 2017 à 12:20
Bonjour,

je voulais chercher une valeur dans la colonne A puis des que je trouve cette valeur je souhaiterai récupérer le numero de la ligne associée pour effectuer une somme par la suite. voila un exemple qui explique ce que je veux exactement:

ColonneA: ColonneB:


A 5
A 5
B 2
B 2
B 2

si l'utilisateur saisi dans lle combobox la valeur A:

je voudrais afficher dans un textbox: la somme : 5+ 5=10
et s'il choisit B la somme est: 2+2+2=8

j'ai commencé par ce code mais j'arrive pas à atteindre mon objectifs, merci pour votre aide:


https://www.cjoint.com/c/GDfqd5IfxqU


3 réponses

ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
5 avril 2017 à 20:50
Bonsoir NLHA, bonsoir le forum,

Supprime tous les codes de ton UserForm1 (y'en a même un ancien mien ! Mort de rire) et remplace par celui-ci :

Private O As Worksheet 'déclare la variable O (Onglet)
Private TV As Variant 'déclare la varaible TV (Tableau des Valeurs)

Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim I As Integer 'déclare la variable I (Incrément)

Set O = Worksheets("Feuil2") 'définit l'onglet O
TV = O.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
    D(TV(I, 1)) = "" 'alimente le dictionnaire D avec les données en colonne 1
Next I 'prochaine ligne de la boucle
Me.ComboBox1.List = D.keys 'alimente la ComboBox1 avec la listes des éléments du dictionnaire D sans doublon
End Sub

Private Sub ComboBox1_Change() 'au changement dans la ComboBox1
Dim I As Integer 'déclare la variable I (Incrément)

Me.TextBox1.Value = "" 'vide la TextBox1
For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
    'si la donnée ligne I en colonne 1 de TV est égale à la valeur de la ComboBox1, définit la variable T
    'somme d'elle-même avec la donnée ligne I colonne 2 de TV, convertie en entier
    If TV(I, 1) = Me.ComboBox1.Value Then T = T + CInt(TV(I, 2))
Next I 'prochaine ligne de la boucle
Me.TextBox1.Value = T 'renvoie la variable T (la somme) dans la TextBox1
End Sub

0
NLAH Messages postés 125 Date d'inscription lundi 9 septembre 2013 Statut Membre Dernière intervention 13 juin 2017 2
5 avril 2017 à 22:57
ça marche pour ce cas, mais en réalité j'ai:

5 colonnes de types différents:

et je voudrais sommer la colonne E mais lorsque j'effectue quelques sur votre code, il se bloque problème d'incompatibilie de type

https://www.cjoint.com/c/GDfu4BSwbaL

Merci.
0
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160 > NLAH Messages postés 125 Date d'inscription lundi 9 septembre 2013 Statut Membre Dernière intervention 13 juin 2017
6 avril 2017 à 00:43
Re,

C'est couillon de ne pas donner le bon exemple ! Mais là il est trop tard et je vais me coucher. Je verrai ça demain (si je suis bien luné)...
0
NLAH Messages postés 125 Date d'inscription lundi 9 septembre 2013 Statut Membre Dernière intervention 13 juin 2017 2
6 avril 2017 à 16:04
j'attend votre réponse ;) merci
0
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160 > NLAH Messages postés 125 Date d'inscription lundi 9 septembre 2013 Statut Membre Dernière intervention 13 juin 2017
6 avril 2017 à 20:34
Re,

J'attends un fichier que je puise ouvrir...
0
NLAH Messages postés 125 Date d'inscription lundi 9 septembre 2013 Statut Membre Dernière intervention 13 juin 2017 2
6 avril 2017 à 20:50
bon re,
voila le lien de fichier, merci d'avoir m'aider:

https://www.cjoint.com/c/GDgsXjPiwPY
0
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
7 avril 2017 à 12:11
Re,

Normalement oui ça fonctionne. Au pire si ça plante essaie avec :
Set O = Worksheets(CByte(ComboBox1.Value)) 

Car l'index est un entier et pas du texte...

Mais je ne comprends pas pourquoi tu ne testes pas avant de poser la question ?!...
0
NLAH Messages postés 125 Date d'inscription lundi 9 septembre 2013 Statut Membre Dernière intervention 13 juin 2017 2
7 avril 2017 à 12:50
j'ai essayé ce que tu m'as dit mais ça marche pas ni avec Cbyte ni sans cbyte

j'ai testé avant de poser la question ;)

voila le lien:
https://www.cjoint.com/c/GDhkVID0OLm
merci
0
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
7 avril 2017 à 17:46
Re,

En fait ça ne marche pas à l'initialisation de L'UserForm mais il fallait le placer dans la procédure Change de la ComboBox2. Même combat, supprime et remplace tout :

Private O As Worksheet 'déclare la variable O (Onglet)
Private TV As Variant 'déclare la varaible TV (Tableau des Valeurs)

Private Sub UserForm_Initialize() 'à l'initialisation de l'UserForm
Dim k As Integer
For k = 1 To Sheets.Count
    ComboBox2.AddItem (k)
Next k
End Sub

Private Sub ComboBox2_Change()
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim I As Integer 'déclare la variable I (Incrément)

Me.ComboBox1.Clear 'vide la ComboBox1
Me.TextBox1.Value = "" 'efface la TextBox1
Set O = Worksheets(CByte(ComboBox2.Value)) 'définit l'onglet O
TV = O.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
    D(TV(I, 1)) = "" 'alimente le dictionnaire D avec les données en colonne 1
Next I 'prochaine ligne de la boucle
Me.ComboBox1.List = D.keys 'alimente la ComboBox1 avec la listes des éléments du dictionnaire D sans doublon
End Sub


Private Sub ComboBox1_Change() 'au changement dans la ComboBox1
Dim I As Integer 'déclare la variable I (Incrément)

Me.TextBox1.Value = "" 'vide la TextBox1
For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
    'si la donnée ligne I en colonne 1 de TV est égale à la valeur de la ComboBox1, définit la variable T
    'somme d'elle-même avec la donnée ligne I colonne 2 de TV, convertie en entier
    If TV(I, 1) = Me.ComboBox1.Value Then T = T + CInt(TV(I, 6))
Next I 'prochaine ligne de la boucle
Me.TextBox1.Value = T 'renvoie la variable T (la somme) dans la TextBox1
End Sub

0
NLAH Messages postés 125 Date d'inscription lundi 9 septembre 2013 Statut Membre Dernière intervention 13 juin 2017 2
8 avril 2017 à 12:20
MERCI ça marche tres bien
0