IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

macro VBA pour imposer signe "-" sur une cellule


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 2
    Points : 1
    Points
    1
    Par défaut macro VBA pour imposer signe "-" sur une cellule
    Bonjour,

    J'essaie de créer une macro me permettant de faciliter ma gestion de compte.
    Dans la colonne "C" j'indique le type d'opération : virement, retrait, paiement CB, virement, etc ...
    Dans la colonne "D" je saisis mes débits et crédits, qui sont donc différenciés par le signe "-".
    Le problème est que j'oublie parfois le signe négatif devant les débits, donc je voudrais automatiser cela.

    Ce que je cherche à faire, c'est que dès que la valeur dans une cellule de la colonne "D" est saisie, effectuer un controle de
    la valeur de la cellule juste à gauche (colonne "C"), et suivant cette valeur ("retrait CB" par exemple) alors passer la valeur saisie en négatif, ou laisser en positif.
    Ce controle serait à effectuer dès que je quitte la cellule de la colonne "D".

    J'ai commencé à regarder quelques pistes, mais je n'avance pas trop, alors une peu d'aide serait bienvenu.

    merci.

  2. #2
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Bonsoir,
    à mettre dans l'évènement Change de ta feuille (module de la feuille)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 4 Then
        If Target.Count = 1 Then
            On Error Resume Next
            Application.EnableEvents = False
            If Target.Offset(0, -1) = "retrait CB" Then
                If Target.Value > 0 Then Target.Value = -1 * Target.Value
            Else
                If Target.Value < 0 Then Target.Value = -1 * Target.Value
            End If
            Application.EnableEvents = True
        End If
    End If
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    592
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 592
    Points : 730
    Points
    730
    Par défaut
    C'est très bien, mais il faudra compléter l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Target.Offset(0, -1) = "retrait CB" Then
    en y inscrivant tous les types de retrait.

    De plus il faut aussi éviter les fautes d'orthographe dans la colonne C, une liste déroulante dans la cellule est à prévoir.

    A+
    PPz
    La qualité et la précision de la réponse sont proportionnelles à celles de la question.

  4. #4
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 699
    Points
    6 699
    Par défaut
    Bonjour,

    La bonne approche serait à la base d'avoir une colonne Débits et une colonne Crédits différentes

    Du coup tu ne mets jamais de signe mais des valeurs absolues et c'est la nature de la colonne qui fait que le nombre sera positif ou non..

    cordialement,

    Didier
    Didier Gonard

    Dernier tutoriel :
    Le VBA qu'est ce que c'est ?
    Tutoriels : Voir la liste de mes tutoriels Excel & VBA et mon site pro sur ma Page DVP
    Cours et tutoriels pour apprendre Excel
    N'oubliez pas de mettre : ..quand c'est le cas !

  5. #5
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Une autre variante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim sg As Integer, P As Integer, Q As Integer
    If Target.Column = 4 Then
        If Target.Count = 1 Then
            P = InStr("paiement CB_retrait_ZZZ", Target.Offset(0, -1)) > 0 And Target.Value > 0
            Q = InStr("Virement_XXX_YYY", Target.Offset(0, -1)) > 0 And Target.Value < 0
            sg = 2 * (P + Q) + 1
            On Error Resume Next
            Application.EnableEvents = False
            If sg <> 1 Then Target.Value = sg * Target.Value
            Application.EnableEvents = True
        End If
    End If
    End Sub
    on met dans le Instr de P, tous les mots (pour lesquels la valeur devrait être négative) séparés par un caractère spécial.
    on met dans le Instr de Q, tous les mots (pour lesquels la valeur devrait être positive) séparés par un caractère spécial
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    merci à tous pour vos réponses, cela m'a permis de mettre en place ce que je voulais.
    J'ai juste complété, sur le même principe, pour faire en sorte que si le type d'opération est modifié dans la colonne "C", cela soit pris en compte dans la colonne "D". A priori ça marche, mais si vous pouvez me confirmer que rien ne cloche ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim sg As Integer, P As Integer, Q As Integer
    If Target.Column = 4 Then
        If Target.Count = 1 Then
            P = InStr("retrait CB_Chèque", Target.Offset(0, -1)) > 0 And Target.Value > 0
            Q = InStr("Virement", Target.Offset(0, -1)) > 0 And Target.Value < 0
            sg = 2 * (P + Q) + 1
            On Error Resume Next
            Application.EnableEvents = False
            If sg <> 1 Then Target.Value = sg * Target.Value
            Application.EnableEvents = True
        End If
    End If
     
    If Target.Column = 3 Then
        If Target.Count = 1 Then
            P = InStr("retrait CB_Chèque", Target.Value) > 0 And Target.Value > 0
            Q = InStr("Virement", Target.Value) > 0 And Target.Value > 0
            sg = 2 * (P + Q) + 1
            On Error Resume Next
            Application.EnableEvents = False
            If sg <> 1 Then Target.Offset(0, 1) = sg * Target.Offset(0, 1)
            Application.EnableEvents = True
        End I
    End If
    End Sub
    Encore merci

  7. #7
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Plutôt comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim sg As Integer, P As Integer, Q As Integer
    On Error GoTo Fin
    Application.EnableEvents = False
    If Target.Count = 1 Then
        If Target.Column = 4 Then
            P = InStr("retrait CB_Chèque", Target.Offset(0, -1)) > 0 And Target.Value > 0
            Q = InStr("Virement", Target.Offset(0, -1)) > 0 And Target.Value < 0
            sg = 2 * (P + Q) + 1
            If sg <> 1 Then Target.Value = sg * Target.Value
        ElseIf Target.Column = 3 Then
            P = InStr("retrait CB_Chèque", Target.Value) > 0 And Target.Offset(0, 1).Value > 0
            Q = InStr("Virement", Target.Value) > 0 And Target.Offset(0, 1).Value < 0
            sg = 2 * (P + Q) + 1
            If sg <> 1 Then Target.Offset(0, 1) = sg * Target.Offset(0, 1)
        End If
    End If
    Fin:
    Application.EnableEvents = True
    End Sub
    Ou bien dune façon concise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim sg As Integer, P As Integer, Q As Integer, t As Integer
     
    On Error GoTo Fin
    Application.EnableEvents = False
    If Target.Count = 1 Then
        t = 4 - Target.Column
        If t * (1 - t) = 0 Then
            P = InStr("retrait CB_Chèque", Target.Offset(0, t - 1)) > 0 And Target.Offset(0, t).Value > 0
            Q = InStr("Virement", Target.Offset(0, t - 1)) > 0 And Target.Offset(0, t).Value < 0
            sg = 2 * (P + Q) + 1
            If sg <> 1 Then Target.Offset(0, t).Value = sg * Target.Offset(0, t).Value
        End If
    End If
    Fin:
    Application.EnableEvents = True
    End Sub
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

Discussions similaires

  1. Réponses: 0
    Dernier message: 28/10/2014, 15h13
  2. [XL-2007] Macro VBA pour imprimer plusieurs onglets sur une feuille recto verso
    Par oekoniko dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 25/03/2014, 15h24
  3. [XL-2010] Macro VBA pour supprimer des caractère situés après une valeur
    Par Guillaume_PMO dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 17/03/2011, 17h06
  4. Réponses: 1
    Dernier message: 03/01/2010, 12h49
  5. Réponses: 1
    Dernier message: 31/12/2009, 11h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo