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 :

Mon code pêche dans son fonctionnement [XL-2013]


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Décembre 2011
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2011
    Messages : 571
    Points : 93
    Points
    93
    Par défaut Mon code pêche dans son fonctionnement
    Bonjour le forum

    J'ai essayé de rédiger le code ci-dessous (macro événementielle sur une feuille) mais il ne fonctionne pas comme je le souhaite.
    En effet, j'ai des macros qui sont logés dans des modules qui doivent s'exécuter suivant certaines conditions dépendantes des cellules J4 et J5.
    Lorsque je change la valeur de J4, les macros suivantes doivent s'exécuter:
    Macro1
    Copie_Ecart_Mois
    Aussi lorsque que je change la valeur de J5, les macros suivantes doivent s'exécuter:
    Report_Ecart_Hebdo
    Copier_cloture
    Copier_RealNbre
    Copier_RealVolume

    Ce qui n'est pas le cas. Lorsque je change la valeur de J4, toutes les macros s'exécutent. Il en est de même que lorsque je change la valeur de J5.

    Comment faire pour recadrer l'exécution des macros.
    Si je change J5 que les macros qui doivent s'exécuter seulement se lancent et non pas que toutes les macros s'exécutent. Idem pour J5.

    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
    27
    Option Explicit
    Private Sub Worksheet_Change(ByVal Target As Range)
    On Error Resume Next
    If Left(Range("J4"), 1) = "M" Then
    If Target.Address = "$J$4" And Target.Value <> "" Then
    Macro1
    Copie_Ecart_Mois
    'Range("J5").Select
    'End If
    ElseIf Left(Range("J5"), 1) = "S" Then
    If Target.Address = "$J$5" And Target.Value <> "" Then
    If MsgBox("La validation par OUI impactera votre TBC.Voulez-vous continuer?", vbYesNo, "Demande de confirmation") = vbYes Then
    Report_Ecart_Hebdo
    Copier_cloture
    Copier_RealNbre
    Copier_RealVolume
    Sheets("CC1").Select
    Range("c13:o64").Select
    Selection.ClearContents
    Range("J7").Select
    End If
    End If
    End If
    Application.EnableEvents = True
    End If
    Application.ScreenUpdating = False
    End Sub

  2. #2
    Membre émérite
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Points : 2 813
    Points
    2 813
    Par défaut
    Bonjour,
    Quand tu appelles une macro, il faut utiliser Call et pas seulement le nom de la macro :
    Es-tu sûr des positions de tes If et End If? Pourrais-tu indenter ton code pour que ce soit plus facile à lire, stp.
    J'utilise jamais .Address, alors je ne saurais pas trop t'aider la-dessus, mais comme tu ne veux jouer que sur les cellules J4 et J5, tu pourrais faire un grand If sur la colonne J, puis tu fais un If pour la ligne 4 et un if pour la ligne 5:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    If Target.Column = 10 Then
        If Target.Row = 4 Then
             'ce qu'il faut faire pour J4
        Else If Target.Row = 5 Then
            'ce qu'il faut faire pour J5
        End If
    End If
    Enfin un commentaire sur ton code:
    Au lieu d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sheets("CC1").Select
    Range("c13:o64").Select
    Selection.ClearContents
    Enlève les Select qui ne servent à rien et qui entraînent parfois des problèmes difficiles à gérer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("CC1").Range("c13:o64").ClearContents
    Si tu as une erreur dans ton code, évite de mettre On Error Resume Next, car cela t'empêche de voir d'où vient l'erreur. Tu peux éventuellement le mettre à la fin quand tu es 100% sûr de ton code et que tu as traité les erreurs possibles.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    pourquoi se prendre la tête!
    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
    Option ExplicitPrivate
     Sub Worksheet_Change(ByVal Target As Range)
    'On Error Resume Next ça c'est pour le gogo
    If Target.Address = "$J$4" And Left(Target, 1) = "M" Then
        Macro1
        Copie_Ecart_Mois
    End If
     If Target.Address = "$J$5" And Left(Target, 1) = "S" Then
        If MsgBox("La validation par OUI impactera votre TBC.Voulez-vous continuer?", vbYesNo, "Demande de confirmation") = vbYes Then
            Report_Ecart_Hebdo
            Copier_cloture
            Copier_RealNbre
            Copier_RealVolume
            Sheets("CC1").Range("c13:o64").ClearContents
    '        Range("J7").Select
        End If
    End If
    Application.EnableEvents = True
    Application.ScreenUpdating = False
    End Sub

  4. #4
    Membre régulier
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Décembre 2011
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2011
    Messages : 571
    Points : 93
    Points
    93
    Par défaut
    Bonjour à tous

    Merci pour vos solutions.
    riaolle : merci pour vos conseils que j'ai pris en compte.
    Je finis de tout tester et vous reviens.
    dysorthographie : votre code signale une incompatibilité de type et cette partie du code est soulignée en jaune:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Target.Address = "$J$4" And Left(Target, 1) = "M" Then
    J'essaie de voir pourquoi ca bloque à ce niveau mais j'ai pas encore trouvé.
    Merci de me revenir si vous localisez le problème
    Encore merci à tous

  5. #5
    Invité
    Invité(e)
    Par défaut
    Désolé
    If Target.Address = "$J$4" And Left(Target(1,1), 1) = "M" Then

  6. #6
    Membre régulier
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Décembre 2011
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2011
    Messages : 571
    Points : 93
    Points
    93
    Par défaut
    Ca fonctionne bien maintenant.
    Quel était le problème et quelle est la différence entre et range?
    encore merci pour vos interventions que j'ai toujours appréciées.

  7. #7
    Invité
    Invité(e)
    Par défaut
    taget peut designer une cellule "$J$4" ou une plage de cellules cellule "$J$4:$J$10"

  8. #8
    Membre émérite
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Points : 2 813
    Points
    2 813
    Par défaut
    Target et une cellule précise et s'utilise dans les macros évènementielles. C'est la cellule "cible", comme le dit son nom, c'est-à-dire la cellule "victime" de la macro évènementielle. Par exemple, avec Worksheet_Change, Target représente la cellule changée.
    Range est un type d'objet qui représente les cellules. Avec Range("A1"), tu identifies la cellule A1.

  9. #9
    Invité
    Invité(e)
    Par défaut
    pas exactement! taget est un objet range! un range représente invariablement une cellule Range("A1") ou une plage de cellule Range("A1:A10") tu peux également modifier toutes les valeur de la plage!


    Range("A1:A10")="toto" là c'est toute la plage qui est concerné par Worksheet_Change!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for i=1 to taget.count
          debug.print taget(i)
    next
    if taget="toto" then 'ici on considère que target = Range("A1") mais si ça concerne Range("A1:A10") alors ce n'est plus le même type d'objet!
    Dernière modification par AlainTech ; 02/04/2017 à 12h13. Motif: Suppression de la citation inutile

  10. #10
    Membre régulier
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Décembre 2011
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2011
    Messages : 571
    Points : 93
    Points
    93
    Par défaut
    Bonjour à tous

    Merci à dysorthographie et à Riaollo pour vos riches contributions.
    Suis satisfait.

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

Discussions similaires

  1. [TinyMCE] vire mon code php dans ma div
    Par snypi dans le forum Bibliothèques & Frameworks
    Réponses: 3
    Dernier message: 23/01/2013, 11h39
  2. erreur dans mon code ecriture dans un fichier
    Par baderahmed dans le forum ASP.NET
    Réponses: 4
    Dernier message: 11/10/2010, 17h55
  3. [AC-2000] Mon code avec OpenRecordset ne fonctionne pas
    Par nomade333 dans le forum VBA Access
    Réponses: 4
    Dernier message: 06/04/2009, 19h37
  4. Intégrer mon code ssh dans une interface
    Par vvaness30 dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 23/03/2007, 11h44
  5. Probleme dans mon code recherche dans un fichier Xml
    Par dederfred dans le forum Delphi
    Réponses: 11
    Dernier message: 21/10/2006, 16h51

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