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 :

Modification de la valeur d'une cellule modifiable [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 231
    Par défaut Modification de la valeur d'une cellule modifiable
    Bonjour à tous,

    Je suis débutant en VBA, je m'y suis mis il y a un mois lors de la création d'un tableau de calcul pour mon entreprise.
    Jusque la j'ai réussi à faire ce que je voulais, entre autre grâce aux nombreuses ressources que j'ai pu trouver sur votre forum. (Affichage de certaines lignes en fonction d'une valeur, modification du format de cellules en fonction d'une autre, etc...)

    Aujourd'hui je sèche, voici mon problème :

    La cellule C80 contient une valeur en tonne que j'indique manuellement. (3.0 T par exemple)
    La cellule C79 contient une liste de choix. (Oui ou non)

    J'aimerais que si C79 indique "oui", alors la valeur de C80 soit multipliée par 0.9, ou si C79 indique "non", alors la valeur de C80 reste normale. (3.0 T)

    Voici ce que j'ai fais pour le moment.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim VAL3
    VAL3 = Sheets("Analyse technique").Range("C79").Value
     
    If VAL3 = "Oui" Then
    Range("C80").Value = Range("C80").Value * 0.9
     
    ElseIf VAL3 = "Non" Then
    Range("C80").Value = Range("C80").Value
    End If
    Cela ne fonctionne pas car la multiplication tourne en boucle et ne s'arrête pas, ce qui fini par indiquer un message d'erreur. Je n'ai pas trouvé d'informations concernant le format des multiplications en VBA, j'ai donc fait comme pour excel. (Ce qui n'est pas forcement une bonne idée ^^)

    Merci d'avance de votre aide, n'hésitez pas à me demander plus de détails si je n'ai pas été suffisamment clair.

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Cela ne fonctionne pas car la multiplication tourne en boucle et ne s'arrête pas, ce qui fini par indiquer un message d'erreur. Je n'ai pas trouvé d'informations concernant le format des multiplications en VBA, j'ai donc fait comme pour excel. (Ce qui n'est pas forcement une bonne idée ^^)
    Il doit sûrement manquer un bout de code parce-que je ne vois pas comment celui-ci pourrait tourner en boucle.
    La multiplication se fait effectivement comme dans Excel cependant tu dis
    La cellule C80 contient une valeur en tonne que j'indique manuellement. (3.0 T par exemple)
    Si tu écris le T, ce n'est plus une valeur numérique mais alphanumérique. C'est alors plutôt un message d'erreur d'incompatibilité de Type que tu reçois.
    Si tu souhaites voir 3.0 T alors que tu tapes 3 il faut utiliser le format personnalisé. Ainsi la valeur est bien numérique et l'utilisateur visualise la valeur avec plus de confort.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Invité
    Invité(e)
    Par défaut Modification de la valeur d'une cellule modifiable
    Bonjour,
    Malheureusement pour toi ta macro est d’une efficacité redoutable.
    Si a=1=> a=a* 0.9=0.9 => 0.81 => 0.729 => 0.6561
    En revanche a=1 b= a* 0.9=0.9 donnera toujours le même résultat.
    Maintenant tu n’as pas besoin dans ton exemple d’un ElseIf si c’est pas oui c’est forcément non
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If VAL3 = "Oui" Then
    Else
    End if
    De plus toujours dans ton exemple a=a n’est pas utile puisque a ne change pas donc un if et end if pas de else.
    Donc en conclusion, tu as besoin de deux cellules une pour la valeur initiale et l’autre pour la valeur calculées.
    En conséquence tu n'as besoin que d'une simple formule :
    Code Formule : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(B1="oui";A1*0,9;A1)
    Cordialement.

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 231
    Par défaut
    Merci pour vos réponses !

    Citation Envoyé par Philippe Tulliez Voir le message
    Si tu écris le T, ce n'est plus une valeur numérique mais alphanumérique.
    Oui en effet, je n'ai pas précisé que l'unité était gérée par excel via les formats personnalisés. J'entre uniquement un chiffre dans cette cellule. (3 en l’occurrence)

    Citation Envoyé par rdurupt
    Si a=1=> a=a* 0.9=0.9 => 0.81 => 0.729 => 0.6561
    C'est exactement ce qui se passe malheureusement.

    Citation Envoyé par rdurupt
    En conséquence tu n'as besoin que d'une simple formule :
    Je comprends bien mais justement, si je passe par VBA c'est parce que je souhaite pouvoir laisser cette cellule "modifiable".
    J'ai bien l'impression que ce que je demande est impossible étant donné que la cellule de base de mon script agi sur cette même cellule... (d'ou la boucle)

    Il n'y a pas un moyen pour que la multiplication ne fasse qu'une fois ?

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Il n'y a pas un moyen pour que la multiplication ne fasse qu'une fois ?
    A moins de placer un flag dans une autre cellule, je ne vois pas comment on pourrait le réaliser. Ce flag pourrait-être de remettre un Non.
    Je pense que tu devrais mieux expliquer la problématique parce-que à la première lecture j'étais plutôt de l'avis de Robert de faire cela avec une simple formule Excel.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  6. #6
    Membre Expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Par défaut
    Bonjour,

    Ce qui est dommage, c'est que tu ne précises pas ce qui provoque le lancement de la procédure.
    S'il s'agit de l'évènement Change de ta feuille, tu peux utiliser la propriété EnableEvents pour éviter de tourner en boucle.

    Cordialement.

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 231
    Par défaut
    Pour faire plus simple, je voudrais écrire cette formule...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(C79="oui";C80*0,9;C80)
    ... dans la cellule C80.

    Impossible sur excel mais est-ce possible en VBA ?

    Voici pour gFZT82 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub Worksheet_Calculate()
    Dim VAL3
    VAL3 = Sheets("Analyse technique").Range("C79").Value
     
    If VAL3 = "Oui" Then
    Range("C80").Value = Range("C80").Value * 0.9
     
    ElseIf VAL3 = "Non" Then
    Range("C80").Value = Range("C80").Value
    End If
     
    End Sub
    Citation Envoyé par gFZT82
    S'il s'agit de l'évènement Change de ta feuille, tu peux utiliser la propriété EnableEvents pour éviter de tourner en boucle.
    Je ne connais pas cette propriété, aurais-tu un exemple ?

    Merci encore de votre aide.

  8. #8
    Invité
    Invité(e)
    Par défaut J'ai bien l'impression que ce que je demande est impossible
    Si tu as la possibilité de retrouver la valeur initial par calcule, colle le résultat dans une cellule non visible par l’utilisateur et applique la formule que je t’es donné.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    ActiveSheet.Cells(Target.Row, 255) = ValeurInitiale
    End Sub
    Dernière modification par Invité ; 21/02/2013 à 14h49.

  9. #9
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 231
    Par défaut
    Grâce à toi gFZT82 ça fonctionne presque !

    J'ai creusé un peu la propriété EnableEvents dont tu parlais et voici ce que ça donne :

    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)
     
    Dim VAL3
    VAL3 = Sheets("Analyse technique").Range("C79").Value
     
    If VAL3 = "Oui" Then
    Application.EnableEvents = False
    Range("C80") = Range("C80").Value * 0.9
    Application.EnableEvents = True
    End If
     
    End Sub
    Ça fonctionne presque, sauf qu'à chaque fois que je change une valeur sur la page, le script se relance et ma valeur est à nouveau multipliée.

  10. #10
    Invité
    Invité(e)
    Par défaut Si tu as la possibilité de retrouver la valeur initial par calcule, colle le résultat dans une cellule non vis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    ActiveSheet.Cells(Target.Row, 255) = ValeurInitiale
    Cells(Target.Row, 2).FormulaR1C1 = "=IF(RC[-1]=""oui"",RC[253]*0.9,RC[-2])"
     
    End Sub

  11. #11
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 231
    Par défaut
    Désolé rdurupt, mais j'ai beau retourner ta proposition dans tous les sens, je ne la comprends pas...

  12. #12
    Invité
    Invité(e)
    Par défaut Grâce à toi gFZT82 ça fonctionne presque !
    Je transforme la cellule en string
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    If VAL3 = "Oui" And TypeName(Range("C80").Value) <> "String" Then
        Range("C80") = "'" & Range("C80").Value * 0.9
        Range("C80").HorizontalAlignment = xlRight
    elseif   VAL3 = "non" then
         Range("C80")=val( Range("C80"))
    End If
    Dernière modification par Invité ; 21/02/2013 à 15h25.

  13. #13
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 231
    Par défaut
    Merci beaucoup rdurupt, ta solution fonctionne !

    Je me suis juste permis de retirer la ligne concernant l'alignement du texte, car le mien est centré dans la cellule.

    J'ai aussi remarqué que le format personnalisé que j'avais attribué à la cellule C80 est annulé lorsque C79 est sur "oui".
    De la même manière, excel indique une erreur sur la cellule C80, j'ai l'impression qu'il ne sait pas de quelle manière interpréter le contenu de la cellule.

    Juste pour que je comprenne bien ton script, peux tu me dire à quoi sert la fonction String et comment elle fonctionne ?

    Encore merci !

  14. #14
    Invité
    Invité(e)
    Par défaut peux tu me dire à quoi sert la fonction String et comment elle fonctionne ?
    String est un type de variable :
    Dim toto as string

    Dans cette formule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("C80") = "'" & Range("C80").Value * 0.9
    Je concatène une chaine de texte avec le résultat du calcul, ce qui transforme le contenu de la cellule en string (Texte).
    Note que les ' ne sont pas visible s’ils sont en premier caractère.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If VAL3 = "Oui" And TypeName(Range("C80").Value) <> "String" Then
    Dans le test je vérifie comme toi si tonne est à oui mais en plus si le type de valeur contenu dans la cellule est un string (texte).

  15. #15
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Le format personnalisé dépend du type de valeur (Numérique ou alpha numérique) contenue dans une cellule.
    A lire Création, enregistrement et fusion de formats personnalisés
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  16. #16
    Membre Expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Par défaut
    Re,

    Désolé pour le retard !
    Pour utiliser l'évènement Change, il te faut définir quel est l'élément initiateur.
    Dans l'exemple ci-dessous, on détecte une modification de la cellule C79 et c'est cette modification qui enclenche la procédure.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub Worksheet_Change(ByVal Target As Range)
        'S'il n'y a qu'une seule cellule modifiée et si cette cellule est C79
        If Target.Count = 1 And Target.Address = "$C$79" Then
            'On désactive l'évènement
            Application.EnableEvents = False
            'Si la valeur de C79 est "OUI", alors C80 = C80 * 0.9
            If UCase(Range("C79").Value) = "OUI" Then Target.Offset(1, 0).Value = Target.Offset(1, 0).Value * 0.9
            'On active l'évènement
            Application.EnableEvents = True
        End If
    End Sub
    Cordialement

  17. #17
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 231
    Par défaut
    Alors la, c'est le top !
    Ta solution fonctionne parfaitement, et maintient même mon format personnalisé !

    C'est super, merci beaucoup gFZT82 ainsi qu'à tous les autres pour vos explications que je n'ai pas finis d'éplucher !

    Je mets le sujet en résolu, bonne fin de journée à tous et à bientôt !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Modification de la valeur d'une cellule d'un datagrid
    Par devvanjier dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 11/03/2014, 11h55
  2. Modifier le Caption d'un Label avec la valeur d'une cellule
    Par kitcarflo dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 30/04/2008, 11h42
  3. Acquisition de valeur d'une cellule modifie
    Par X-plode dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 03/07/2007, 14h39
  4. [VBA_Excel] Modifier un chemin en fonction de la valeur d'une cellule
    Par jefe.k dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 23/02/2007, 15h28
  5. modification de la valeur d'une cellule
    Par magictom42 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 17/10/2006, 17h22

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