Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/01/2012, 19h57   #1
apt
Membre du Club
 
Inscription : mai 2002
Messages : 526
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 526
Points : 42
Points : 42
Par défaut Somme à chaque nouvel clique

Bonsoir à tous,

Dans un tableau qui contient les noms en colonne a et les salaires en colonne B, j'aimerais avoir des sommes à chaque clique d'un CommandButton.

Le calcul est arrêté lorsqu'on clique à nouveau sur le bouton.

Mais je ne sais pas intercepter le deuxième clique pour arrêter la boucle et effectuer le traitement voulu.

Code :
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
Option Explicit
Private Sub CommandButton1_Click()
    Dim Ligne As Integer
    Dim LastLg As Integer
    Dim Plg As Range, Cel As Range
    Dim Sm As Integer
 
    CommandButton1.Caption = "Stop"
 
    Ligne = [I1].Value
    LastLg = [B65000].End(xlUp).Row
    Set Plg = Range("B" & Ligne & ":B" & LastLg)
 
    For Each Cel In Plg
        Sm = Cel + Sm
        '-- Si le bouton1 est cliqué une deuxieme fois
        '?????
        '-- On remet le caption à Somme
        'CommandButton1.Caption = "Somme"
        '-- On sauvegarde la dernière ligne atteinte
        '[I1].Value = Cel.Value
        '-- On insere la plage deja parcourue
        '[D2].Value = "(B" & Ligne & ":B" & Cel.Row & ")"
        '-- On affiche la somme calculée
        '[C2].calue = Sm
        '--On sort de la boucle For
        'Exit
    Next Cel
 
End Sub
Merci d'avance.
apt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2012, 21h28   #2
Membre Expert
 
Homme
Inscription : décembre 2011
Messages : 566
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : décembre 2011
Messages : 566
Points : 1 081
Points : 1 081
Bonsoir,

Une piste : une variable externe à la boucle + DoEvents()
Une correction : Long au lieu de Integer (limité à 2^15 ligne au max)

Code :
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
35
36
37
38
39
40
41
42
43
44
45
Option Explicit
Dim CmdRunning As Boolean  'On est dans la boucle 
 
Private Sub CommandButton1_Click()
    Dim Ligne As Long
    Dim LastLg As Long
    Dim Plg As Range, Cel As Range
    Dim Sm As Long
 
    If CmdRunning Then
       CommandButton1.Caption = "Start"
       CmdRunning = False
    Else
       CmdRunning = True
       CommandButton1.Caption = "Stop"
 
       Ligne = [I1].Value
       LastLg = [B65000].End(xlUp).Row
       Set Plg = Range("B" & Ligne & ":B" & LastLg)
 
       For Each Cel In Plg
           DoEvents
           Sm = Cel + Sm
           DoEvents
           '-- Si le bouton1 est cliqué une deuxieme fois
           If Not CmdRunning Then
                MsgBox ("Test arrêté")
                '-- On remet le caption à Somme
                'CommandButton1.Caption = "Somme"
                '-- On sauvegarde la dernière ligne atteinte
                '[I1].Value = Cel.Value
                '-- On insere la plage deja parcourue
                '[D2].Value = "(B" & Ligne & ":B" & Cel.Row & ")"
                '-- On affiche la somme calculée
                '[C2].calue = Sm
                '--On sort de la boucle For
               Exit For
           End If
       Next Cel
    End If
 
    CmdRunning = False
    CommandButton1.Caption = "Start"
 
End Sub
Ce code est pour répondre dans la philosophie du premier message.


Mais sinon, pour faire une somme à chaque clic pourquoi ne pas :
- stocker la position de la somme dans une cellule
- stocker le résultat actuel de la somme dans une autre cellule


Code :
1
2
3
4
5
6
7
8
9
10
11
Private Sub CommandButton1_Click()
    Dim Ligne As Long
    Ligne = [I1].Value
 
    If (Range("B" & (Ligne)).Value <> "") Then
        [C2].Value = [C2].Value + Range("B" & (Ligne)).Value
        [I1].Value = Ligne + 1
    Else
        MsgBox ("Fin de liste")
    End If    
End Sub
Un bouton pour repartir de valeur par défaut
Code :
1
2
3
4
Private Sub CB_Reset_Click()
        [C2].ClearContents
        [I1].Value = 1
End Sub
BlueMonkey est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2012, 22h09   #3
Expert Confirmé
 
Philippe Tulliez
Développeur et formateur VBA, Excel et Word.
Inscription : janvier 2010
Messages : 1 313
Détails du profil
Informations personnelles :
Nom : Philippe Tulliez
Localisation : Belgique

Informations professionnelles :
Activité : Développeur et formateur VBA, Excel et Word.

Informations forums :
Inscription : janvier 2010
Messages : 1 313
Points : 2 679
Points : 2 679
Bonsoir,
J'utiliserais une variable booléenne
Code :
1
2
3
4
5
6
7
8
9
10
11
Option Explicit
Dim flgBtn As Boolean
Private Sub CommandButton1_Click()
  With CommandButton1
  .Caption = IIf(flgBtn, "Somme", "Stop"): flgBtn = Not (flgBtn)
  End With
  If flgBtn Then
    ' Le code
    Exit Sub
  End If
End Sub
Mais le plus simple serait d'utiliser un bouton bascule à la place d'un CommandButton
Code :
1
2
3
4
5
6
7
8
Private Sub ToggleButton1_Click()
 With ToggleButton1
  .Caption = IIf(.Value, "Somme", "Stop")
 End With
 If ToggleButton1.Value Then
  ' Code
 End If
End Sub
__________________
Philippe Tulliez
http://philippe.tulliez.be
Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)

Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
corona est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/01/2012, 23h18   #4
apt
Membre du Club
 
Inscription : mai 2002
Messages : 526
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 526
Points : 42
Points : 42
Bonsoir BlueMonkey,

J'ai essayé de développer ton idée, en faisant activer le calcul de la somme pour ce qui est saisie.

Un dexieme bouton, remettra la cellule "Somme" à zéro.

mais je ne sais pas, pourquoi le calcul ne se fait pas (La cellule "Somme" est toujours vide )

Code :
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
35
36
37
38
Option Explicit
Dim LastLg As Long
Dim CmdRunning As Boolean
Private Sub CommandButton1_Click()
    LastLg = [I2].Value
    CommandButton1.Caption = "Calcul de somme active"
    CmdRunning = True
End Sub
Private Sub CB_Reset_Click()
    [E2].Value = 0 'ClearContents
    CmdRunning = False
    CommandButton1.Caption = "Sommer"
End Sub
 
Private Sub Worksheet_Activate()
    CmdRunning = False
    CommandButton1.Caption = "Sommer"
End Sub
 
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim BSum As Long
 
    Application.ScreenUpdating = False
    Application.EnableEvents = False
 
    BSum = 0
    If Target.Count > 1 Then Exit Sub
    If CmdRunning Then
        If Not Intersect(Target, Range("B2:B65000")) Is Nothing Then
            BSum = BSum + Range("B" & LastLg).Value 'Sommer ce qui est saisie
            LastLg = LastLg + 1 ' On incrémente de 1 la dernière ligne de saisie
            [E2].Value = BSum   ' Cellule "Somme"
            [I2].Value = LastLg ' Sauvegarder la position de saisie
        End If
    End If
    Application.ScreenUpdating = True
    Application.EnableEvents = True
End Sub
EDIT :

Bonsoir corona,

je m'excuse, je n'ai pas vu ton post.

Oui, le ToggleButton est bien fait pour le marche/arrêt.
apt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2012, 23h52   #5
Membre Expert
 
Homme
Inscription : décembre 2011
Messages : 566
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : décembre 2011
Messages : 566
Points : 1 081
Points : 1 081
Re.

En utilisant la bonne idée de Corona, et en éliminant ce qui me paraît superflu.

Code :
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
Option Explicit
 
Private Sub CB_Reset_Click()
    [E2].Value = 0
    ToggleButton1.Value = False
End Sub
 
Private Sub ToggleButton1_Click()
    ToggleButton1.Caption = IIf(ToggleButton1.Value, "Calcul de somme active", "Stop")
End Sub
 
Private Sub Worksheet_Activate()
    ToggleButton1.Value = False
End Sub
 
Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False
 
    If ToggleButton1.Value And (Target.Count = 1) Then
        If Not Intersect(Target, Range("B2:B65000")) Is Nothing Then
            [E2].Value = [E2].Value + Target.Value 'Sommer ce qui est saisie
        End If
    End If
    Application.EnableEvents = True
End Sub
Pour info je pense qu'a la base le problème venait de ça :
Code :
1
2
3
4
5
6
7
8
9
Private Sub Worksheet_Change(ByVal Target As Range)
    '... 
    Application.EnableEvents = False
    '... 
    If Target.Count > 1 Then Exit Sub
    '... 
    Application.EnableEvents = True
    '...
End Sub
BlueMonkey est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 00h25   #6
apt
Membre du Club
 
Inscription : mai 2002
Messages : 526
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 526
Points : 42
Points : 42
Re,

J'ai enlevé ce que tu as indiqué en rouge, mais le Worksheet_Change ne marche pas
Fichiers attachés
Type de fichier : zip SommeSalaire(3).zip (16,7 Ko, 4 affichages)
apt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 00h42   #7
Expert Confirmé
 
Philippe Tulliez
Développeur et formateur VBA, Excel et Word.
Inscription : janvier 2010
Messages : 1 313
Détails du profil
Informations personnelles :
Nom : Philippe Tulliez
Localisation : Belgique

Informations professionnelles :
Activité : Développeur et formateur VBA, Excel et Word.

Informations forums :
Inscription : janvier 2010
Messages : 1 313
Points : 2 679
Points : 2 679
Bonsoir,
Comment veux-tu avoir une somme alors que la variable BSum est à 0.
Pour garder la valeur d'une variable lorsqu'elle est déclarée dans une procédure il faut la déclarée comme Static
Ne pas oublier alors de la remettre à zéro le moment opportun.
__________________
Philippe Tulliez
http://philippe.tulliez.be
Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)

Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
corona est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 30/01/2012, 01h21   #8
Membre Expert
 
Homme
Inscription : décembre 2011
Messages : 566
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : décembre 2011
Messages : 566
Points : 1 081
Points : 1 081
En réfléchissant au besoin, je me dis que de refaire la somme de la première cellule du tableau,
à la cellule qui vient d'être saisie à chaque nouvelle saisie, est probablement plus simple.

Du coup pour faire la somme :
[E2].Value = WorksheetFunction.Sum(Range("B2:B" & Target.Row))
Et pour indiquer la ligne jusqu'où va la somme :
[I2].Value = Target.Row
BlueMonkey est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 01h22   #9
apt
Membre du Club
 
Inscription : mai 2002
Messages : 526
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 526
Points : 42
Points : 42
Bonsoir corona,

Maintenant le problème rencontré est que WorkSheet_Change n'est jamais déclenché

même un petit MsgBox dedans n'est pas affiché.

EDIT :

Salut BlueMonkey,

Le calcul ne commence pas en B2 tout le temps parce que les saisies sont faites selon les noms correspondants en colonne A, tout au long de la colonne B.

Et parfois les saisies sont éparpillés et ne se suivent pas forcément.

L'essentiel quand l’opération "Somme des saisies" est activée tout ce qui est saisie après en colonne B est comptabilisé.

Une fois l'opération arrêter, la cellule "Somme" est remise à zéro.
apt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 01h28   #10
Membre Expert
 
Homme
Inscription : décembre 2011
Messages : 566
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : décembre 2011
Messages : 566
Points : 1 081
Points : 1 081
Citation:
Maintenant le problème rencontré est que WorkSheet_Change n'est jamais déclenché
Comme expliqué précédemment, c'est probablement que Excel est encore en mode Application.EnableEvents = False

Pour que les évènements soit de nouveau activé, il faut exécuter un Application.EnableEvents = True

[Edit] : Conseil, lire post #8

Citation:
Le calcul ne commence pas en B2 tout le temps parce que les saisies sont faites selon les noms correspondants en colonne A, tout au long de la colonne B.
Et parfois les saisies sont éparpillés et ne se suivent pas forcément.
L'essentiel quand l’opération "Somme des saisies" est activée tout ce qui est saisie après en colonne B est comptabilisé.
Une fois l'opération arrêter, la cellule "Somme" est remise à zéro.
Dans ce cas la solution proposé en #5 ferait l'affaire.
(avec une adaptation pour la remise à 0 sur le démarrage de la somme.)

Bonne nuit.
Fichiers attachés
Type de fichier : zip SommeSalaire(5).zip (16,4 Ko, 4 affichages)
BlueMonkey est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 02h16   #11
apt
Membre du Club
 
Inscription : mai 2002
Messages : 526
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 526
Points : 42
Points : 42
Voila le code final,

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Option Explicit
 
Private Sub ToggleButton1_Click()
    ToggleButton1.Caption = IIf(ToggleButton1.Value, "Calcul de somme active, stopper ?", "Sommer")
     If Not ToggleButton1.Value Then [E2].Value = 0
End Sub
 
Private Sub Worksheet_Activate()
    ToggleButton1.Value = False
    ToggleButton1.Caption = "Prêt"
End Sub
 
Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False
 
    If ToggleButton1.Value And (Target.Count = 1) Then
        If Not Intersect(Target, Range("B2:B65000")) Is Nothing Then
            [E2].Value = [E2].Value + Target.Value
        End If
    End If
    Application.EnableEvents = True
End Sub
Merci infinement
apt est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 30/01/2012, 02h24   #12
Membre Expert
 
Homme
Inscription : décembre 2011
Messages : 566
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : décembre 2011
Messages : 566
Points : 1 081
Points : 1 081
Content de voir que le code réponde au besoin. .
Bonne nuit.
BlueMonkey est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 08h16   #13
apt
Membre du Club
 
Inscription : mai 2002
Messages : 526
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 526
Points : 42
Points : 42
Bonjour BlueMonkey,

Merci de ton aide.
apt est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h56.


 
 
 
 
Partenaires

Hébergement Web