IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

somme conditionnelle sous Excel


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Femme Profil pro
    Inscrit en
    Mars 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 69
    Par défaut somme conditionnelle sous Excel
    Bonjour à tous le monde

    Voilà j'essaie de faire une somme conditionnelle qui me pose problème
    En fait mon code est le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    dim somme, val, total as variant
     
      For i = 5 To 300
      If Worksheets(CStr(ComboBox2)).Range("F" & i) = Worksheets(CStr(ComboBox2)).Range("F" & i + 1) Then
     
                        somme = somme + Sheet1.Cells(i, 14).Value
       End If
       If Worksheets(CStr(ComboBox1)).Range("F" & i) = Worksheets(CStr(ComboBox1)).Range("F" & i + 1) Then
     
                        val = val + Sheet2.Cells(i, 14).Value
     End If
     If Worksheets(CStr(ComboBox2)).Range("F" & i) = Worksheets(CStr(ComboBox1)).Range("F" & i + 1) Then
     
                        total = somme - val
           End If
     
            If Sheets("total").Range("B4" & i) = Worksheets(CStr(ComboBox2)).Range("F" & i) Then
     
                        For Each cel In Range("B4:B300") 
     
                            cel = total
                        Next cel
    End If
     
                    Next i
     
    End If
    Apparement il compile mais rien ne se passe à l'éxécution

    donc je souhaiterais faire la somme des valeurs en colonne 14 de la feuille1 pour lesquelles les codes en colonne F sont identiques, s'il y seul code on coserve la valeur unique trouvée

    L'opération est répétée sur la deuxième feuille (combobox1.value) et enfin on colue la différence des deux sur la feuille total pour les codes respectifs en colonne A

    Je ne sais pas si j'ai été assez claire
    Merci pour vos réponse!!!!!

  2. #2
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    Bonjour,

    Une première question : les ComboBox sont directement sur la feuille ou sur un userform ?

  3. #3
    Membre confirmé
    Femme Profil pro
    Inscrit en
    Mars 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 69
    Par défaut
    c'est plutôt sur un userForm

  4. #4
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    Alors à vue de nez cela devrait ressembler à quelque chose comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    Sub test()
    Dim somme, val, total
    Dim CB1 As String, CB2 As String
    Dim cel As Range, i As Integer
     
    CB1 = UserForm1.ComboBox1.Value '<-- adapter le nom du UserForm si pas UserForm1
    CB2 = UserForm1.ComboBox2.Value '<-- adapter le nom du UserForm si pas UserForm1
     
    For i = 5 To 300
        If Sheets(CB2).Range("F" & i) = Sheets(CB2).Range("F" & i + 1) Then
            somme = somme + Sheets(1).Cells(i, 14).Value
        End If
        If Sheets(CB1).Range("F" & i) = Sheets(CB1).Range("F" & i + 1) Then
            val = val + Sheets(2).Cells(i, 14).Value
        End If
        If Sheets(CB2).Range("F" & i) = Sheets(CB1).Range("F" & i + 1) Then
            total = somme - val
        End If
        If Sheets("total").Range("B4" & i) = Sheets(CB2).Range("F" & i) Then
            For Each cel In Range("B4:B300") '<-- range de quelle feuille ?
            cel = total
            Next cel
        End If
    Next i
     
    End Sub
    Je ne peux pas le tester sans reconstruire toute ta structure de classeur
    Je pense que tu peux déclarer tes variables "somme", "val" et "total" autrement que Variant, tout dépend de ce que ces variables sont censées contenir, tu peux jeter un oeil sur ce lien http://silkyroad.developpez.com/VBA/LesVariables/

  5. #5
    Membre confirmé
    Femme Profil pro
    Inscrit en
    Mars 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 69
    Par défaut
    For Each cel In Sheets("total").Range("B4:B300") '<-- range de quelle feuille ?

    Je teste pour voir avec çà!!

  6. #6
    Membre confirmé
    Femme Profil pro
    Inscrit en
    Mars 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 69
    Par défaut
    En fait je viens de tester et c'est déjà mieux qu'avant
    Sauf qu'il affiche que des 0 comme resultat

    EN fait pour un peu plus explicite je donne une exemple :

    j'ai 3 feuille jourA, jourB, et total

    Sur la feuille jourA j'ai une colonne F ou j'ai les code de mes clients et une colonne N avec la valeur de leur achats

    et sur la feuille jourB j'ai les memes colonne mais les infos qui peuvent varier

    le but de mon calcul serait de savoir le différentiel des achat de chaque client entre le jour A et le jour B et de reporter ce différentiel dans la feuille total devant chaque code client correspondant

    A noter que la feuille total présente une colonne de code client et une colonne pour les différenciels

    En plus concret on a par exemple :

    feuille (jourA)

    colonneF |colonneN (200,300...)
    1 | 200
    2 | 300
    3 | 50
    4 | 12
    1 | 35
    1 | 43


    feuille (jourB)

    colonneF |colonneN (20, 31 ...)
    1 | 20
    2 | 31
    3 | 78
    3 | 150
    4 | 47
    1 | 2


    après le calcul on devrai avoir

    feuille (total)

    colonneA |colonneB
    1 | 256 => (200+35+43) - (20+2)
    2 | 269 => (300 - 31)
    3 | -178 => 50- (78+150)
    4 | -35 => (12-47)


    alors est-ce le bon algo que j'utilises??
    Merci de vos réponses

    Ninette

  7. #7
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    Question subsidiaire :

    A quoi servent les valeurs des deux CombBox ?

  8. #8
    Membre confirmé
    Femme Profil pro
    Inscrit en
    Mars 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 69
    Par défaut
    en fait c'est dans les combobox que je selectionne jourA et jourB parce que dans mon exemple j'ai que ces deux feuilles mais en fait il yen a plusieurs.

    Donc si je veux comparer jourA et jourB je le selectionne dans ma combobox
    et sinon je peux choisir jourB et jourD et le cacul sera sur le même principe

  9. #9
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    Si moi y en avoir tout bien comprendu, ce qui suit devrait s'y rapprocher
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    Sub retest()
    Dim c As Integer, a As Integer, b As Integer, t As Integer
    Dim SomA As Integer, SomB As Integer
    Dim CB1 As String, CB2 As String
     
    CB1 = UserForm1.ComboBox1.Value
    CB2 = UserForm1.ComboBox2.Value
     
    For c = 1 To 500
        With Sheets(CB1)
            For a = 1 To .Cells(Rows.Count, 6).End(xlUp).Row
                If .Cells(a, 6) = i Then
                SomA = SomA + .Cells(a, 14).Value
                End If
            Next a
        End With
        With Sheets(CB2)
            For b = 1 To .Cells(Rows.Count, 6).End(xlUp).Row
                If .Cells(b, 6) = i Then
                SomB = SomB + .Cells(b, 14).Value
                End If
            Next b
        End With
        With Sheets("total")
            For t = 1 To .Cells(Rows.Count, 1).End(xlUp).Row
                If .Cells(t, 1) = i Then '<-- code dans colonne A à adapter
                Cells(t, 2) = SomA - SomB '<-- total dans colonne B à adapter
                End If
            Next t
        End With
    Next c
    End Sub
    La déclaration des variables a, b, t, SomA et SomB est à adapter selon le type des valeurs à calculer, quelques exemples :
    • Integer = valeur comprise entre -32.768 et 32.767
    • Long = valeur comprise entre -2.147.483.648 et 2.147.483.647
    • Currency = valeur comprise -922.337.203.685.477,5808 à 922.337.203.685.477,5807

  10. #10
    Membre confirmé
    Femme Profil pro
    Inscrit en
    Mars 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 69
    Par défaut
    ya une ligne que je ne comprend pas

    a = 1 To .Cells(Rows.Count, 6).End(xlUp).Row =>pourquoi 6 ?

  11. #11
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    cells(rows.count, 6).end(xlup) = dernière cellule occupée de la colonne F

  12. #12
    Membre confirmé
    Femme Profil pro
    Inscrit en
    Mars 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 69
    Par défaut
    Oui exact, j'ai vu mon erreur

    Mais en fait il ne compile pas

    SomA = SomA + .Cells(a, 14).Value avec cette ligne qui ne lui plait pas

    et apparement i est vide (info du deboggeur)
    çà se complique vraiment!!!!

    En fait il compile mais il ne se passe rien à l'execution!!

    Voici le code tel que je l'ai repris
    j'ai mis des "Long" et c'est tout

    Mais il compile sans soir les valeurs à jours dans total


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    Dim c As Long, a As Long, b As Long, t As Long
    Dim SomA As Long, SomB As Long
    Dim CB1 As String, CB2 As String
     
    CB1 = comparaison.ComboBox1.Value
    CB2 = comparaison.ComboBox2.Value
     
    For c = 1 To 500
        With Sheets(CB1)
            For a = 5 To .Cells(Rows.Count, 6).End(xlUp).Row
                If .Cells(a, 6) = i Then
                SomA = SomA + .Cells(a, 14).Value
                End If
            Next a
        End With
        With Sheets(CB2)
            For b = 5 To .Cells(Rows.Count, 6).End(xlUp).Row
                If .Cells(b, 6) = i Then
                SomB = SomB + .Cells(b, 14).Value
                End If
            Next b
        End With
        With Sheets("total")
            For t = 4 To .Cells(Rows.Count, 1).End(xlUp).Row
                If .Cells(t, 1) = i Then '<-- code dans colonne A à adapter
                Cells(t, 2) = SomA - SomB '<-- total dans colonne B à adapter
                End If
            Next t
        End With
    Next c
    Fring je suis un peu casse pied mais en fait je comprend pas trop
    Le for c= 1 to 500
    à quoi il sert?

  13. #13
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    Citation Envoyé par ninette24 Voir le message
    Fring je suis un peu casse pied mais en fait je comprend pas trop
    Le for c= 1 to 500
    à quoi il sert?
    pas de problème

    si j'ai bien compris ton 1er code, cela correspond à ton i = 1 to 500 qui sont les numéros de code des clients ?

    Colle un fichier exemple stp, sinon on va tourner en rond avant d'arriver à une solution adéquate

  14. #14
    Membre confirmé
    Femme Profil pro
    Inscrit en
    Mars 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 69
    Par défaut
    voila je te met un ficchier test

    En fait tu verras normalement en cliquant sur le bouton Edition
    Tu devrai voir apparaitre la feuille total avec le resultat des calculs
    Fichiers attachés Fichiers attachés

  15. #15
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    ok, j'ai compris d'où venait le problème, je pensais que les codes des clients étaient 1, 2, 3, 4, ..., 500

    Ci-joint ton fichier corrigé.
    Il faudra adapter le code selon tes colonnes dans ton fichier original

    FICHIER TEST2

  16. #16
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    oups sorry, il y a un bug, j'ai oublier de faire un reset des valeurs SomA et SomB entre chaque code clients. remplace le code du fichier joint ci-dessus par celui-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    Private Sub CommandButton1_Click()
    Dim i As Integer, a As Integer, b As Integer
    Dim SomA As Long, SomB As Long
    Dim CB1 As String, CB2 As String, Code As String
     
    CB1 = UserForm1.ComboBox2.Value
    CB2 = UserForm1.ComboBox3.Value
     
    For i = 2 To Sheets("total").Cells(Rows.Count, 1).End(xlUp).Row
    Code = Sheets("total").Cells(i, 1).Value
    SomA = 0
    SomB = 0
        With Sheets(CB1)
            For a = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
                If .Cells(a, 1) = Code Then
                SomA = SomA + .Cells(a, 2).Value
                End If
            Next a
        End With
        With Sheets(CB2)
            For b = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
                If .Cells(b, 1) = Code Then
                SomB = SomB + .Cells(b, 2).Value
                End If
            Next b
        End With
        With Sheets("total")
            .Cells(i, 2) = SomA - SomB
        End With
    Next i
     
    Unload Me
     
    End Sub

  17. #17
    Membre confirmé
    Femme Profil pro
    Inscrit en
    Mars 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 69
    Par défaut
    Merci Fring
    çà a l'air de marcher à peu près
    Mais j'ai un petit problème c'est qu'il m'incrémente les sommes

    genre

    sur la feuille total

    code | Prix

    1 200
    2 somA-somB +200

    .........

    Il incremente au fur et à mesure
    Com puis-je eviter çà?

  18. #18
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    oui je sais...il y a une correction à apporter, regarde 2 messages plus haut

  19. #19
    Membre confirmé
    Femme Profil pro
    Inscrit en
    Mars 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 69
    Par défaut
    Salut Fring merci pour ton aide çà a l'air de marcher
    Il me fait bien la somme conditionnelle des feuilles respectives

    Mais j'ai une autre question......

    Est-ce qu'il fait la somme des valeurs dans les doublons aussi ou pas?

  20. #20
    Membre confirmé
    Femme Profil pro
    Inscrit en
    Mars 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 69
    Par défaut
    merci j'ai trouvé
    çà marche!!

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Impression Conditionnelle sous Excel
    Par Morlok dans le forum Excel
    Réponses: 3
    Dernier message: 28/09/2010, 14h24
  2. somme conditionnelle sous acces
    Par dodie84 dans le forum IHM
    Réponses: 10
    Dernier message: 15/05/2008, 18h18
  3. somme conditionnelle sous acces
    Par dodie84 dans le forum VBA Access
    Réponses: 0
    Dernier message: 07/05/2008, 10h30
  4. somme conditionnelle sous VBA
    Par léclaireur dans le forum Général VBA
    Réponses: 5
    Dernier message: 26/04/2007, 11h32
  5. Mise en forme conditionnelle sous Excel
    Par crosse9 dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 21/09/2006, 01h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo