Partage

Macro excel

Somme des différentes valeurs prises par une cellule

14 mars 2018 à 0:26:08

Bonjour à tous,

Après plusieurs années de recherche, je n'est pas trouvé de réponse à mon problème. (je ne dit pas que mes recherches sont infaillible :D)

Je vous explique :

J'aimerai créer un compteur sur excel, c'est à dire : 

J'ai en entrée une cellule (par exemple la cellule A1) et je lui met une valeur.

J'ai en sorti une cellule (par exemple la cellule B1) qui va accumuler les valeurs qu'a pris la cellule d'entrer (A1):

J'aimerai qu'à chaque fois que je modifie A1, B1 ce modifie, ex :

J'ai entré la valeur 5 dans A1, B1 passe de 0 à 5, je modifie A1 par 8 et a ce moment la, B1 affichera 13.

J'ai donc cherché à créer une fonction mais en vain... Je ne vois pas ce que je pourrais créer comme macro ni comment l'affecter à la case B1. Je n'ai pas réussi a créer de fonction du type B1=B1+A1...

Merci à vous! ;)

Vous êtes demandeur·se d'emploi ?
Sans diplôme post-bac ?

Devenez Développeur·se web junior

Je postule
Formation
courte
Financée
à 100%
14 mars 2018 à 9:36:50

Salut,

Si tu as vraiment cherché pendant plusieurs années, tu dois sérieusement revoir ta manière de faire :).

Une solution simple : tu utilises l'événement Worksheet.Change qui est appelé lorsque la valeur d'une cellule est modifiée, ensuite si la cellule modifiée est A1 alors tu modifies la valeur de B1.

A lire : https://msdn.microsoft.com/fr-fr/vba/excel-vba/articles/worksheet-change-event-excel

Quelle expérience as-tu en VBA ?

-
Edité par Stormweaker 14 mars 2018 à 9:37:05

14 mars 2018 à 9:53:35

J'ai avancer un peu je crois mais je ne vois pas comment je peut modifié la valeur de B1 lorsque A1 est modifié. J'ai fait ça :

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Dim KeyCells As Range

    ' La variable KeyCells contient les cellules qui déclencheront
    ' une alerte si elles sont modifiées.
    Set KeyCells = Range("A1")
    
    If Not Application.Intersect(KeyCells, Range(Target.Address)) _
    Is Nothing Then
    'Modifier B1 lorsque A1 est modifié



    End If
End Sub

Merci de votre aide

-
Edité par lionbuffle 14 mars 2018 à 14:33:19

14 mars 2018 à 17:42:46

T'as fait le plus dur, le code qui sera présent dans le If sera exécuté si la cellule modifiée est A1 (EDIT : en fait si la plage modifiée contient A1, donc si tu modifies en même temps A1 et B1 (par exemeple avec un copier-coller) la valeur de B1 prendra celle du copier coller puis la macro sera appelée, je ne sais pas si ça te génera, mais c'est à noter).

Pour accéder à la valeur d'une cellule il faut utiliser la propriété Value, par exemple Range("A1").Value te donne la valeur de la cellule A1, tu peux aussi l'utiliser pour modifier la valeur d'une cellule.

-
Edité par Stormweaker 14 mars 2018 à 17:47:54

15 mars 2018 à 23:10:05

Alors j'ai fait ce que vous m'avez conseillé seulement la valeurs n'est pas modifié. Me suis-je trompé dans le programme?

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Dim KeyCells As Range
 
    ' La variable KeyCells contient les cellules qui déclencheront
    ' une alerte si elles sont modifiées.
    Set KeyCells = Range("B17")
     
    If Not Application.Intersect(KeyCells, Range(Target.Address)) _
    Is Nothing Then
    'Modifier B1 lorsque A1 est modifié
    Range("D26") = Range("B18") - Range("D26")
 
    End If
End Sub

Merci d'avance

16 mars 2018 à 11:08:05

Est-ce que tu as bien placé ce code dans la feuille "thisWorkbook" quand tu es dans l'éditeur ?

Est-ce que tu es certain des cellules que tu veux utiliser ? Tu vérifies si la cellule B17 est modifiée pour ensuite modifier la valeur de D26 par rapport à B18.

Pour modifier la valeur il vaut mieux utiliser Range("D26").Value, ta ligne devient donc Range("D26").Value = Range("B18").Value - Range("D26").Value

16 mars 2018 à 15:42:47

Cela marche je ne l'avais pas bien placé effectivement. Mais du coup il prend la valeur de B18 juste avant qu'elle soit changer (Car elle est changé par la valeur de B17 rentré à la main) du coup ça ne retire l'ancienne valeur et non la nouvelle.

J'ai trouvé cette solution ou du coup je rentre dans la case la valeur qu'on veut retirer. Cela n'est pas automatique mais fonctionne.

Option Explicit
Dim un%, deux%, trois%
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  un = Range("D26")
  deux = Range("L26")
  trois = Range("T26")
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
  Application.EnableEvents = False
    If Target.Address = "$D$26" Then Range("D26") = un - Range("D26")
    If Target.Address = "$L$26" Then Range("L26") = deux - Range("L26")
    If Target.Address = "$T$26" Then Range("T26") = trois - Range("T26")
  Application.EnableEvents = True
End Sub

Je me demande si du coup il ne serai pas possible avec cet algorithme de faire ce que je cherche?

16 mars 2018 à 16:59:30

Qu'est-ce que tu veux faire exactement ?

Le code que tu as donné retranche la valeur que tu rentres dans une cellule à celle qui était présente.

Ce que tu as demandé dans ton premier post c'est d'ajouter la valeur d'une cellule que tu modifies à la valeur d'une autre cellule.

16 mars 2018 à 19:56:31

Salut !

lionbuffle, bien sûr que tu peux utiliser l'exemple que tu donnes !

Personnellement, je le placerai plus facilement dans la feuille concernée plutôt que dans "thisworkbook"

voici un exemple de ce que tu pourrais faire :

Option Explicit

Dim un%

 
Private Sub Worksheet_Change(ByVal Target As Range)

un = Range("B18")
  
  Application.EnableEvents = False
    If Target.Address = "$B$17" Then Range("B18") = un + Range("B17")
    ' après, tu ajoutes toutes les instructions que tu veux, comme dans l'exemple que t'as donné
  Application.EnableEvents = True
End Sub



Macro excel

× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
  • Editeur
  • Markdown