VBA Faire somme dans une procédure évènementielle

  • Initiateur de la discussion Initiateur de la discussion Arpette
  • 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 !

Arpette

XLDnaute Impliqué
Bonsoir à toutes et à tous, je souhaiterais faire une somme évènementielle sur mon fichier joint. A savoir, toutes saisies faites dans les colonnes S1 renvoient le total en Tot S1 et la même chose pour S2. Je l'ai fait en formule, mais ils arrivent à tout casser, et je ne veux pas de protection.
Merci de votre de votre aide.
@+
 

Pièces jointes

Re : VBA Faire somme dans une procédure évènementielle

Bonsoir Arpette, Softmama,

Un nouvel essai donc. Les utilisateurs ne peuvent que changer une valeur du tableau à la fois et n'ont pas accès aux autres cases. En conséquence pour faire des modifications de structure à la feuille il faudra désactiver les macros, ou rajouter temporairement un Exit sub en première instruction pour les deux. Cordialement

KD
 

Pièces jointes

Re : VBA Faire somme dans une procédure évènementielle

Bonsoir KenDev,Softmama,
KenDev ton code marche nickel, mais j'ai un peu de mal à tout comprendre si tu pouvais me mettre quelques commentaires ça serait sympa. J'ai essayé de l'appliquer à mon fichier type mais ça coince.En fait je parts de la ligne 3 colonne C, le total des lignes se fait sur l'avant dernière ligne, jusque là pas de problème, où ça gâte c'est pour les totaux des colonnes que je fais en colonnes M et N avec le principe que tu as mis dans ton code c+e+g... et d+f+h....
Merci de ton aide
@+
PS: j'ai supprimé la deuxieme partie qui empêche de modifier plusieurs cellules car tous les mois je dois tout remettre à 0.
 
Dernière édition:
Re : VBA Faire somme dans une procédure évènementielle

Rebonsoir KenDev, je pense avoir tout compris et je l'ai adapté à mon fichier type, c'est nickel. J'ai commencé à mettre des commentaires, peux-tu me dire si ils sont en adéquation avec le code et au besoin compléter ou corriger ces derniers.
Merci de ton aide
@+
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Rw&, v#, i&, x%
    'Rw dernière ligne vide de la colonne
    Rw = Cells(Rows.Count, 1).End(xlUp).Row
    'Si dernière ligne vide inférieur à ligne 3, on sort de la procédure
    If Rw < 3 Then Exit Sub
    'Si la saisie est en dehors de la dernière ligne vide ou au delà de la colonne 12, on sort de la procédure
        If Target.Row = Rw Or Target.Column > 12 Then Exit Sub
        'Fait la somme des celulles de 3 à la dernière ligne vide -1
        For i = 3 To Rw - 1
            v = v + Cells(i, Target.Column)
        Next i
        'Renvoi le résultat trouvé
        Cells(Rw, Target.Column) = v
    'La variable v est remise à 0
    v = 0
    x = 4 - Target.Column Mod 2
    'Fait la somme en M des colonnes avec sauts de 2 ex: C+E+G+I+K ou D+F...
        For i = x To x + 6 Step 2
            v = v + Cells(Target.Row, i)
        Next i
        Cells(Target.Row, x + 10) = v
    v = 0
        For i = 3 To Rw - 1
            v = v + Cells(i, x + 10)
        Next i
        Cells(Rw, x + 10) = v
End Sub
 
Re : VBA Faire somme dans une procédure évènementielle

Bonsoir,

Effectivement la solution est spécifique (pour ce qui est du nombre et position des colonnes) au cas exemple transmis. Ci joint le code Worksheet_Change commenté avec des indications pour l'adapter aux différents cas possible. Cordialement

KD

VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Rw&, v#, i&, x%
'hauteur du tableau = ligne de la dernière cellule non vide colonne 1
Rw = Cells(Rows.Count, 1).End(xlUp).Row
'si le tableau ne contient que 2 lignes sortir (puisque seulement ligne de titre et ligne total ?)
If Rw < 3 Then Exit Sub
'si ligne de titre changée ou colonne I ou plus ne rien faire (puisque géré par Worksheet_SelectionChange)
If Target.Row = Rw Or Target.Column > 8 Then Exit Sub
'pour chaque ligne du corps du tableau
For i = 2 To Rw - 1
    'somme de la colonne
    v = v + Cells(i, Target.Column)
Next i
'écrire la somme
Cells(Rw, Target.Column) = v
v = 0

'x = première colonne à compter / si x pair = 4 / si x impair = 3
x = 4 - Target.Column Mod 2
'pour adapter à différent cas de type et nombre de colonnes S et une première colonne utile variable :
'soit Typ (exemple S1-S4->Typ=4), NbC (exemple S1-S4 répété 5fois->NbC=5), tt = derniere colonne de 'titre' (exemple ce fichier tt = 2)
'x= ((target.column - tt) mod Typ) + tt

'pour chaque colonne de l'intervalle (1 sur 2)
For i = x To x + 4 Step 2
    'dans le cas général remplacer par
    'for i = x to x + (NbC-1)*Typ Step Typ
    
    v = v + Cells(Target.Row, i)
Next i

Cells(Target.Row, x + 6) = v
'dans le cas général remplacer par
'Cells(Target.Row, x + NbC*Typ) = v

v = 0
For i = 2 To Rw - 1
    v = v + Cells(i, x + 6)
    'dans le cas général remplacer par
    'v = v + Cells(i, x + NbC*Typ)
Next i
Cells(Rw, x + 6) = v
'dans le cas général remplacer par
'Cells(Rw, x + NbC*Typ) = v
End Sub
 
Re : VBA Faire somme dans une procédure évènementielle

Bonsoir et mrci pour toutes ces explications. Comme je le dis dans le post un peu plus haut, j'ai supprimé la partie qui m'empêchait de faire des modifications en masse. Par contre maintenant j'ai un bug non bloquant (il suffit de réinitialiser pour passer), mais bon, pas propre. C'est ici dans mon en-tête de tableau, tous les mois je suis obligé d'apporter des modifications dans la ligne 1 (le mois année et semaine) et le problème est sur cette ligne
Code:
For i = 3 To Rw - 1
            v = v + Cells(i, Target.Column)
        Next i

Code:
MOIS DE FEVRIER 2011      Sem 5      Sem 6     Sem 7     Sem 8   Sem 9         Total	
Nom et Prénom Adresse     S1 S2      S1 S2     S1 S2     S1 S2   S1 S2       TT S1 TTS2
   Arpette      Autun
Merci de ton aide.
@+
 
Dernière édition:
Re : VBA Faire somme dans une procédure évènementielle

Bonsoir,

autre proposition
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Dli As Long, Li As Long, Col As Byte
    Dli = Cells(Rows.Count, 2).End(xlUp).Row
    If Intersect(Target, Range("C2:J" & Dli + 1)) Is Nothing Then Exit Sub
    For Li = 2 To Dli
    Application.EnableEvents = False
    Cells(Li, 9) = "": Cells(Li, 10) = ""
    For Col = 3 To 8
        Cells(Li, 10 - Col Mod 2) = Cells(Li, 10 - Col Mod 2) + Cells(Li, Col)
        Cells(Dli + 1, Col) = WorksheetFunction.Sum(Range(Cells(2, Col), Cells(Dli, Col)))
    Next
    Application.EnableEvents = True
    Next
End Sub
 

Pièces jointes

- 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
18
Affichages
1 K
Réponses
6
Affichages
1 K
Retour