Somme avec condition

Résolu
NLAH Messages postés 135 Statut Membre -  
NLAH Messages postés 135 Statut Membre -
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

  1. ThauTheme Messages postés 1564 Statut Membre 160
     
    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
    1. NLAH Messages postés 135 Statut Membre 2
       
      ç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
    2. ThauTheme Messages postés 1564 Statut Membre 160 > NLAH Messages postés 135 Statut Membre
       
      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
    3. NLAH Messages postés 135 Statut Membre 2
       
      j'attend votre réponse ;) merci
      0
    4. ThauTheme Messages postés 1564 Statut Membre 160 > NLAH Messages postés 135 Statut Membre
       
      Re,

      J'attends un fichier que je puise ouvrir...
      0
  2. ThauTheme Messages postés 1564 Statut Membre 160
     
    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
    1. NLAH Messages postés 135 Statut Membre 2
       
      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
  3. ThauTheme Messages postés 1564 Statut Membre 160
     
    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
    1. NLAH Messages postés 135 Statut Membre 2
       
      MERCI ça marche tres bien
      0