Excel : Macro Incrementer une valeur.

Résolu/Fermé
BB - 23 juin 2008 à 10:43
 OB-63 - 9 nov. 2023 à 22:57
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!
A voir également:

7 réponses

Ivan-hoe Messages postés 433 Date d'inscription dimanche 17 février 2008 Statut Membre Dernière intervention 17 octobre 2008 309
23 juin 2008 à 11:07
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
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
c'est Bon!! j'ai trouvé (désolé :D)
c'est nickel Merci beaucoup!

Bonne journée!!!
0

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
Ivan-hoe Messages postés 433 Date d'inscription dimanche 17 février 2008 Statut Membre Dernière intervention 17 octobre 2008 309
23 juin 2008 à 11:30
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
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
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
Ivan-hoe Messages postés 433 Date d'inscription dimanche 17 février 2008 Statut Membre Dernière intervention 17 octobre 2008 309
23 juin 2008 à 12:00
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
merci beaucoup :)
une solution pour le message #6 ? (sinon c'est pas grave c'est deja super)

Bonne journée!
0
je voulais dire pour le message #7 (décidément je suis pas très réveillé :D)
0
Ivan-hoe Messages postés 433 Date d'inscription dimanche 17 février 2008 Statut Membre Dernière intervention 17 octobre 2008 309
23 juin 2008 à 14:12
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Ivan-hoe Messages postés 433 Date d'inscription dimanche 17 février 2008 Statut Membre Dernière intervention 17 octobre 2008 309
23 juin 2008 à 14:35
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
Merci beaucoup c'est vraiment super! j'aurais pas cru trouver si bonne aide !!

Encore merci!
0
tien j'ai un "bug" maintenant des que je modifie le texte d'une cellule autre, la cellule s'efface des la validation.. ?
0
Ivan-hoe Messages postés 433 Date d'inscription dimanche 17 février 2008 Statut Membre Dernière intervention 17 octobre 2008 309
23 juin 2008 à 16:07
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
johnbarley Messages postés 1 Date d'inscription jeudi 24 mars 2016 Statut Membre Dernière intervention 24 mars 2016
24 mars 2016 à 16:56
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