[vba excel] executer une macro sur un click

wilmath -  
ori05 Messages postés 57 Statut Membre -
Bonjour,

Super débutante en VB. J'ai développé une macro qui permet de griser les lignes de mon tableau excel si la valeur d'une cellule est égale à "NON".
Mais je suis obligée de lancer manuellement l'éxecution de la macro pour que ça le fasse, alors que je voudrais que la macro se déclenche dès que la cellule reçoit (en création ou en modification) la valeur "NON".
Je ne sais pas comment lier l'éxecution de la macro à un évènement, que ce soit ouverture du fichier ou modif de la cellule ou click...
Merci d'avance pour votre aide.

11 réponses

  1. Utilisateur anonyme
     
    Bonjour,

    En supposant que la colonne A constitue un index dans la feuille

    et que la colonne B contitue la colonne avec la valeur variable à initiliser à "NON" ou a rien !

    Private Sub Worksheet_Change(ByVal Target As Range)
    
        Dim Region As Range, Position As Long
        
        Application.ScreenUpdating = False
        
        Position = Range("A1:A65535").End(xlDown).Row
        Set Region = Application.Intersect(Range("B1:B" & Position), Target)
        
        If Region Is Nothing Then
            'MsgBox "La cible n'est pas dans la plage visé."
        Else
            If (Target.Value = "NON") Then
                Target.EntireRow.Select
                Selection.Interior.ColorIndex = 6
                'MsgBox "La cible est dans la plage visé."
                Target.Offset(1, 0).Select
            End If
        End If
        
        Application.ScreenUpdating = True
        
    End Sub
    '
    


    Il vous faudra adapter !

    Lupin
    3
    1. Ludivine50 Messages postés 118 Statut Membre 7
       
      Bonjour Lupin,

      je m'inspire de ton code pour une de mes applications.
      Mais le problème, c'est que cela fonctionne quand on quitte une cellule de la colonne B, et pas sans partir de la cellule.
      Pour être plus claire, dans mon cas, je voudrais que quand le user écrit quelquechose en colonne B, un userform s'affiche avec une zone de texte. Il complète la zone de texte qui doit agrémenter la colonne C, soit un ActiveCell.Offset(0,1).Select.
      Mais si par exemple il saisie en cellule B2, si en quittant la cellule, il utilise la flèche du haut, il est en B1, le userform s'affiche, il saisie son blabla, ActiveCell.Offset(0,1) --> le texte s'affiche en C1, alors que je le voulais en C2. S'il quitte la cellule B2 en utilisant la flèche du bas, après userform, le texte va arriver en C3...
      Or je ne peux pas dans mon code VB lui dire "va dans C2", car ce code doit fonctionner pour toute la colonne B (et accesoirement pour les colonnes E, H...).
      Alors je me suis dit que j'allais faire une recherche dans la colonne C, et que s'il y avait un nombre dans la colonne B et rien sur la même ligne dans la colonne C, alors c'est ici que le texte doit aller (car je vais interdire une saisie dans B sans blabla dans la colonne C). Ben oui, mais s'il utilise les flèches de gauche ou de droite quand il quitte B2, comment va-t-il deviner dans quelle colonne chercher?
      Bref, y-a-t-il une solution? Ai-je un esprit trop tordu?
      Merci
      0
    2. Utilisateur anonyme > Ludivine50 Messages postés 118 Statut Membre
       
      Bonjour Ludivine,

      Alors voici une solution possible :

      Dans un module standard, il te faut déclarer un variable globale
      à ton projet de cette façon :

      Option Explicit
      
      Public strAdresse As String
      


      voici le code de détection du changement, légèrement modifié :
      Option Explicit
      '
      
      Private Sub Worksheet_Change(ByVal Target As Range)
      
          Dim Region As Range, Position As Long
          
          Application.ScreenUpdating = False
          Application.EnableEvents = False
          
          ' Capture de l'adresse du changement
          strAdresse = Target.Address
          
          Position = Range("A1:A65535").End(xlDown).Row
          Set Region = Application.Intersect(Range("B1:B" & Position), Target)
          
          If Not (Region Is Nothing) Then
              uf_Saisie.Show
          End If
          
          Application.EnableEvents = True
          Application.ScreenUpdating = True
          
      End Sub
      '
      


      et le code qui devra être placé derrière un bouton de validation
      de ton [ UserForm ]

      Private Sub cmd_Xfr_Click()
          With ActiveSheet
              .Range(strAdresse).Offset(0, 1).Value = Me.tbx_Valeur.Text
          End With
      End Sub
      '
      


      Voilà, j'espère avoir bien compris ton dilème !

      Lupin
      0
    3. Ludivine50 Messages postés 118 Statut Membre 7 > Utilisateur anonyme
       
      Merci Lupin, je pense que ça doit répondre à ma problématique, le code est intéressant. Malheureusement, je n'arrive pas à tester car il ne fait rien, rien de rien du tout. Même pas ouvrir mon userform (dont j'ai bien changé le nom).
      0
    4. Utilisateur anonyme > Ludivine50 Messages postés 118 Statut Membre
       
      re:

      Il te faudra faire attention ici, car les évènements sont désactivés par la ligne :

      Application.EnableEvents = False

      Si la routine ne s'exécute pas jusqu'a la fin -> Application.EnableEvents = True
      Il n'y auras plus d'évènement [ Worksheet_Change ]

      Dans un module standard, place cette routine :

      Sub ActiveEvenement()
      Application.EnableEvents = True
      End Sub

      Tu pourras ainsi réactiver les évènements du classeur.

      De plus cette routine s'accroche sur la colonne A pour déterminer
      la plage à surveiller en colonne B, avais-tu compris cette approche ?

      Connais tu les points d'arrêts ?, le mode "pas à pas" ?

      Lupin
      0
    5. Ludivine50 Messages postés 118 Statut Membre 7 > Utilisateur anonyme
       
      Merci Lupin de ta réponse.
      C'était effectivement le fait qu'après un premier plantage, il était resté en
      Application.EnableEvents = False.
      Je voulais justement te demander par la suite que voulait dire cette commande, ben du coup, c'est déjà fait ;-)
      Et à propos, en me renseignant, j'ai découvert que Application.ScreenUpdating = False permet une exécution plus rapide... Dans un fichier j'avais une macro qui durait 20 secondes (pour 100 lignes!), et après ajout de ce code, ben ça dure 0,002 secondes!!!! Lupin, je t'adore!!!!!!!!!

      Concernant la notion d'index, j'ai compris que s'il y a quelquechose dans la colonne A et quelquechose dans la colonne B, alors il doit afficher mon userform, ce qui évite qu'il mouline à chercher dans toute la feuille. Dans mon cas, je n'aurais pas vraiment ce fonctionnement, car le nombre de ligne n'est pas infini. Je lui demanderais probablement d'arrêter le traitement à une ligne précise. Mais j'hésite, pourquoi pas une colonne genre index. Il devra chercher dans la ligne 10, puis 11, puis 13, 14, 16, 19..... Mais bon, est-ce plus long de chercher dans 50 lignes, que dans 20 lignes? Je ne pense pas (surtout depuis que j'ai découvert Application.ScreenUpdating = False).

      Pour les points d'arrêts et le mode pas à pas, je viens de me renseigner sur ces forums (et je suis tombée sur un de tes messages ;-) ). Je ne m'étais jamais renseignée du pourquoi il y a des gros points marrons quand je clique sur la gauche! !-))))) Excellente découverte! Je vais m'en servir!

      Bref, je vais m'endormir moins bête ce soir! (et c'est toujours cela de gagné)
      Bonne soirée SUPERLupin, merci pour tout!
      0
  2. psychoman Messages postés 30 Statut Membre 9
     
    Tu peux aussi y aller avec la fonction de format conditionnel dans l'onglet format de Excel.
    tu met la condition = "<>" et tu choisis une couleur pour cette condition.
    1
  3. ShaBoo Messages postés 406 Statut Membre 50
     
    Salut psycho,

    je suis tjrs sur ton fichier...
    1
    1. psychoman Messages postés 30 Statut Membre 9
       
      GOOD,
      je t'enverrai ce que j'ai fait, ca marche mais je remplis des petites subtilités : si on change le nom du fichier, le path .... pour que ca marche plus tard encore...

      thanks.
      Vince.
      0
      1. ShaBoo Messages postés 406 Statut Membre 50 > psychoman Messages postés 30 Statut Membre
         
        wow ... lol

        je vais etre dépasser par ce que tu veux ;p
        0
      2. ShaBoo Messages postés 406 Statut Membre 50 > psychoman Messages postés 30 Statut Membre
         
        donne moi une adresse mail, pour que je t'envoie ce que je fais
        0
      3. psychoman Messages postés 30 Statut Membre 9 > ShaBoo Messages postés 406 Statut Membre
         
        voila :

        psychoman4us@hotmail.com

        a+
        0
  4. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    bonjour

    Dans Worksheet tu crées :
    Private Sub Worksheet_SelectionChange(ByVal sel As Range)

    End Sub


    et tu intégres ta fonction.

    l'adresse de sel donne le range de la cellule modifiée (sel.address)


    si tu as besoin de compléments complète la question.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. wilmath
     
    Bonjour !

    Merci pour ta réponse.
    Mais j'ai oublié de préciser que la cellule à tester n'est pas fixe : c'est une cellule par ligne dont la valeur conditionne le changement de couleur de cette même ligne.

    Comment, au lieu de faire un test sur l'adresse de la cellule (sel.adress), faire un test sur sa colonne ?

    Merci
    0
  7. wilmath
     
    j'ai trouvé (enfin, on m'a aidé... !)

    Merci pour ton aide

    A+
    Wilmath
    0
  8. biloue
     
    Salut Wilmath
    Pourrais s'il te plait me donner la solution je cherche à faire la même chose.
    Merci d'avance
    Biloue
    0
  9. Menvielle
     
    bonjour,
    ta question correspond exactement à mon problème. J'ai fais la création de la macro.
    mais je n'en sais pas plus .
    je voudrais qu'elle s'éxécute (pour griser et mettre en forme des cellules) suivant l'information contenue dans une colonne, sur une ligne à priori inconnue (elle peut varier)

    merci pour ton aide: je suis coincé par ça.
    0
  10. dardeviIIe
     
    Bonjour, a tous je ne comprend pas pour quoi mon code ci-dessous ne fonctionne pas ou ci que l'envois du mail pas le déclenchement à heure fixe. J'ai tout essayé en ouvrant excel et en le fermer mais c'est mieux ci il est fermé.
    merci pour votre aide....

    Sub SendPlng()
    ' lance la macro SendParMail à 09:00:00 heures
    Application.OnTime TimeValue("15:51:00"), ("SendParMail"), True
    End Sub

    Sub SendParMail()
    'cette macro envois par mail la feuille excel active
    ThisWorkbook.Sheets("Fev").Copy
    ActiveWorkbook.SendMail ("dardeviIIe.msn.com@free.fr")
    ActiveSheet.Copy
    End Sub
    0
  11. oraboss
     
    bonjour,
    puis-je avoir les details de cette fonction pour griser les lignes d'un tableau?
    & merci d'avance
    0
  12. psychoman Messages postés 30 Statut Membre 9
     
    merci
    0