Excel : Macro Incrementer une valeur.

Résolu
BB -  
 OB-63 -
Bonjour,

Je souhaite réaliser une macro simple mais je n'y arrive pas. quelqu'un peut il m'aider ?

je voudrais saisir une case (exemple A1) puis en appuyant sur un bouton, la valeur de A1 s'additionne à la valeur d'une autre case (B1 par exemple) puis A1 s'efface. et autant de fois que je saisie A1 et valide, B1 est incrémenter.

(c'est pour faire une gestion de "stock" très simplifié, avec d'un coté ce qui rentre (A1) d'un autre coté ce qu'il reste au stock (B1) et une troisième case (C1) qui contiendra ce que je consomme.)

Merci d'avance pour votre aide!
Configuration: Windows XP
Firefox 3.0

7 réponses

Résumé de la discussion

La solution proposée repose sur une macro Excel utilisant l’événement Worksheet_Change pour traiter l’entrée saisie en A1 et l’ajouter à B1, tout en vidant A1 ensuite. Le script additionne la valeur de A1 à B1, affiche éventuellement une confirmation et désactive temporairement les événements pour éviter une boucle de rétroaction. Des ajustements permettent de vérifier que l’entrée est numérique et de restreindre le déclenchement aux seules modifications de A1 (avec possibilité d’inclure C1). Pour l’installation, il faut coller le code dans le module de la feuille et activer les macros, puis adapter les références de cellules selon le besoin.

Généré automatiquement par IA
sur la base des meilleures réponses
  1. Ivan-hoe Messages postés 433 Date d'inscription   Statut Membre Dernière intervention   310
     
    Salut BB,
    voici quelquechose de très simple. A copier dans le code de la feuille concernée.
    Ca réagit au changement de valeur dans A1, pas besoin de créer un bouton "Valider".
    J'ai ajouté un message de confirmation.
    Si nécessaire, on peut ajouter une vérification que la valeur saisie est bien un nombre (ça bugge quand on saisit une lettre, par exemple).
    A toi de modifier les cellules concernées (ici, saisie en A1 et addition en B1)
    A suivre...
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Message As String, Valeur As Long
    
    With Target
        If Not .Address(False, False) = "A1" Then Exit Sub
        
        Valeur = .Value
        Message = "Valider la saisie de " & Valeur & " en " & .Address(False, False)
        If MsgBox(Message, vbYesNo) = vbNo Then Exit Sub
        Range("B1").Value = Range("B1").Value + Valeur
        
        Application.EnableEvents = False
        .Value = Empty
        Application.EnableEvents = True
    
    End With
    End Sub
    3
    1. BB
       
      Merci pour le code, mais je n'arrive pas a comprendre ou je dois l'insérer.. je suis vraiment pas très doué avec excel :D.
      Tu peux m'expliquer ou je dois l'insérer ?

      Merci beaucoup!!
      0
    2. BB
       
      c'est Bon!! j'ai trouvé (désolé :D)
      c'est nickel Merci beaucoup!

      Bonne journée!!!
      0
    3. OB-63
       

      Bonjour,

      Merci à vous de m'avoir évité de passer des heures à créer une macro pour incrémenter des valeurs dans mon fichier de suivi de stocks.

      Toutefois, je n'ai malheureusement pas la possibilité d'incrémenter les valeurs à virgule avec ce code.

      Avez-vous un autre plus spécifique à mon besoin ?

      Merci.

      0
  2. Ivan-hoe Messages postés 433 Date d'inscription   Statut Membre Dernière intervention   310
     
    Tu cliques droit sur l'onglet de la feuille concernée, tu choisis Visualiser le code, et c'est là que tu colles.
    Evidemment, ton classeur contiendra donc dorénavant une macro ; à l'ouverture, pour qu'elle puisse être exécutée, il faudra préciser "Activer les macros".
    A suivre...
    0
    1. BB
       
      c'est vraiment super !!

      encore une dernier question (:D)
      est il possible que lors de l'appuie sur le bouton NON de la pop-up, la case de saisie (A1) se vide du contenue saisie précédemment ? je pense quil faut rajouter quelque chose au niveau du
      If MsgBox(Message, vbYesNo) = vbNo Then Exit Sub
      mais quoi ?

      Merci d'avance!!!
      0
    2. BB
       
      mince encore un autre point..

      je voulais copier une deuxième fois la macro pour cette fois décrémenter la valeur B1 avec la saisie d'une autre case (C1) (sortie de stock)

      mais lorsque je copie deux fois la macro cela ne fonctionne pas, le message "nom ambigu détecté worksheet_Change" apparait, comment je peux faire ?
      0
  3. Ivan-hoe Messages postés 433 Date d'inscription   Statut Membre Dernière intervention   310
     
    Effectivement, c'est ce morceau-là qu'il faut modifier.
    On va remplacer le Exit Sub par GoTo FIN et rajouter l'étiquette FIN comme-ci-dessous.
    Autre petit détail (facultatif) :
    si tu veux que le bouton "Non" soit sélectionné par défaut (pour éviter une mauvaise validation d'un utilisateur pressé), tu peux rajouter + vbDefaultButton2 dans les paramètres de la boîte message.

    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Message As String, Valeur As Long
    
    With Target
        If Not .Address(False, False) = "A1" Then Exit Sub
        
        Valeur = .Value
        Message = "Valider la saisie de " & Valeur & " en " & .Address(False, False)
        If MsgBox(Message, vbYesNo + vbDefaultButton2) = vbNo Then GoTo FIN
        Range("B1").Value = Range("B1").Value + Valeur
        
    FIN:
        Application.EnableEvents = False
        .Value = Empty
        Application.EnableEvents = True
    
    End With
    End Sub
    0
    1. BB
       
      merci beaucoup :)
      une solution pour le message #6 ? (sinon c'est pas grave c'est deja super)

      Bonne journée!
      0
      1. BB > BB
         
        je voulais dire pour le message #7 (décidément je suis pas très réveillé :D)
        0
  4. Ivan-hoe Messages postés 433 Date d'inscription   Statut Membre Dernière intervention   310
     
    Désolé pour le délai, mais pause déjeuner !!
    pour la réponse au message 6 (effacer le contenu de A1 en cas d'annulation), voir le message à 12:00:28, qui n'est pas numéroté (?!). Du coup, est-ce qu'il t'apparaît bien ? sinon, je te le renvoie.
    I.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Ivan-hoe Messages postés 433 Date d'inscription   Statut Membre Dernière intervention   310
     
    On se croise !
    Pour le message 7 :
    ta macro est spéciale, c'est une macro évènementielle, c'est-à-dire qui se déclenche suite à un évènement, en l'occurence quand ta feuille (Worksheet) subit une modification (Change). D'où son nom Private Sub Worksheet_Change
    Il ne peut pas y en avoir deux ; mais on peut la modifier en ajoutant une condition pour avoir différentes réponses au même évènement.
    Pour les sorties de stock en C1, même principe que pour l'entrée en A1, sauf qu'on soustrait ;
    Je me suis permis de rajouter une alerte en cas de stock négatif ;
    La macro devenant un peu plus complexe, j'ai un peu modifié l'ordre des instructions ; j'ai aussi rajouté une gestion des erreurs (on Error GoTo...)
    Ce sont des fioritures qui ne sont pas indispensables, mais qui fiabilisent ta procédure. Je ne veux pas non plus t'assommer de détails, c'est toi qui vois ce que tu veux garder.
    A suivre...

    Private Sub Worksheet_Change(ByVal Target As Range)
    On Error GoTo ERROR
    Dim Message As String, Valeur As Long
    Application.EnableEvents = False
    
    With Target
        If .Address(False, False) = "A1" Then
            Valeur = .Value
            Message = "Valider la saisie de " & Valeur & " en " & .Address(False, False)
            If MsgBox(Message, vbYesNo + vbDefaultButton2) = vbNo Then GoTo FIN
            Range("B1").Value = Range("B1").Value + Valeur
            
        ElseIf .Address(False, False) = "C1" Then
            Valeur = .Value
            Message = "Valider la saisie de " & Valeur & " en " & .Address(False, False)
            If MsgBox(Message, vbYesNo + vbDefaultButton2) = vbNo Then GoTo FIN
            With Range("B1")
                If .Value < Valeur Then
                    Message = "Attention : stock négatif"
                    If MsgBox(Message, vbYesNo + vbDefaultButton2) = vbNo Then GoTo FIN
                End If
                .Value = .Value - Valeur
            End With
        End If
        
    FIN: .Value = Empty
    End With
    
    Application.EnableEvents = True
    
    Exit Sub
    ERROR:  MsgBox Err.Description: Resume FIN
    End Sub
    0
    1. BB
       
      Merci beaucoup c'est vraiment super! j'aurais pas cru trouver si bonne aide !!

      Encore merci!
      0
    2. BB
       
      tien j'ai un "bug" maintenant des que je modifie le texte d'une cellule autre, la cellule s'efface des la validation.. ?
      0
  7. Ivan-hoe Messages postés 433 Date d'inscription   Statut Membre Dernière intervention   310
     
    Oups !
    Le programme était mal construit, et quelle qu'était la cellule modifiée, il passait par Target.Value = Empty, ce qui revient à effacer la cellule modifiée.
    J'ai rajouter un Select Case ... End Select pour vraiment restreindre le déclenchement de la procédure aux modifications de A1 et C1. Si nécessaire, tu pourrais compléter cette liste à l'avenir. Dans les autres cas (Case Else), on sort immédiatement de la procédure (Exit Sub).

    Je n'ai copié ici que le début de la procédure, après ça ne change pas.
    A suivre...
    Private Sub Worksheet_Change(ByVal Target As Range)
    On Error GoTo ERROR
    Dim Message As String, Valeur As Long
    
    With Target
        Select Case .Address(False, False)
            Case Is = "A1", "C1"
                GoTo SUITE
            Case Else
                Exit Sub
        End Select
        
    SUITE:
        Application.EnableEvents = False
    
        If .Address(False, False) = "A1" Then
    'etc
    0
  8. johnbarley Messages postés 1 Date d'inscription   Statut Membre Dernière intervention  
     
    Bonjour,
    Je voudrais incrémenter automatiquement d'1 la valeur d'une cellule à chaque modification de la cellule voisine : c'est pour avoir automatiquement un numéro séquentiel à chaque édition d'un modèle de bon de commande. Vos échanges ci-dessus répondent en partie à la question, il faudrait juste pouvoir remplacer la saisie manuelle par l'ajout automatique d'1. Pouvez-vous m'aider ?
    Mille mercis !!
    0