[vba excel] executer une macro sur un click

Fermé
wilmath - 6 sept. 2006 à 16:29
ori05 Messages postés 56 Date d'inscription lundi 13 juillet 2009 Statut Membre Dernière intervention 7 septembre 2009 - 26 août 2009 à 10:40
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.
A voir également:

11 réponses

Utilisateur anonyme
9 déc. 2006 à 00:33
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
Ludivine50 Messages postés 114 Date d'inscription lundi 9 février 2009 Statut Membre Dernière intervention 1 février 2016 7
4 mars 2009 à 18:35
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
Utilisateur anonyme > Ludivine50 Messages postés 114 Date d'inscription lundi 9 février 2009 Statut Membre Dernière intervention 1 février 2016
5 mars 2009 à 13:57
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
Ludivine50 Messages postés 114 Date d'inscription lundi 9 février 2009 Statut Membre Dernière intervention 1 février 2016 7 > Utilisateur anonyme
5 mars 2009 à 17:58
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
Utilisateur anonyme > Ludivine50 Messages postés 114 Date d'inscription lundi 9 février 2009 Statut Membre Dernière intervention 1 février 2016
5 mars 2009 à 19:02
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
Ludivine50 Messages postés 114 Date d'inscription lundi 9 février 2009 Statut Membre Dernière intervention 1 février 2016 7 > Utilisateur anonyme
5 mars 2009 à 20:11
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
psychoman Messages postés 30 Date d'inscription mercredi 17 octobre 2007 Statut Membre Dernière intervention 14 février 2008 9
25 oct. 2007 à 19:29
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
ShaBoo Messages postés 392 Date d'inscription mercredi 12 septembre 2007 Statut Membre Dernière intervention 5 septembre 2009 50
25 oct. 2007 à 20:46
Salut psycho,

je suis tjrs sur ton fichier...
1
psychoman Messages postés 30 Date d'inscription mercredi 17 octobre 2007 Statut Membre Dernière intervention 14 février 2008 9
25 oct. 2007 à 21:30
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
ShaBoo Messages postés 392 Date d'inscription mercredi 12 septembre 2007 Statut Membre Dernière intervention 5 septembre 2009 50 > psychoman Messages postés 30 Date d'inscription mercredi 17 octobre 2007 Statut Membre Dernière intervention 14 février 2008
25 oct. 2007 à 22:12
wow ... lol

je vais etre dépasser par ce que tu veux ;p
0
ShaBoo Messages postés 392 Date d'inscription mercredi 12 septembre 2007 Statut Membre Dernière intervention 5 septembre 2009 50 > psychoman Messages postés 30 Date d'inscription mercredi 17 octobre 2007 Statut Membre Dernière intervention 14 février 2008
25 oct. 2007 à 22:15
donne moi une adresse mail, pour que je t'envoie ce que je fais
0
psychoman Messages postés 30 Date d'inscription mercredi 17 octobre 2007 Statut Membre Dernière intervention 14 février 2008 9 > ShaBoo Messages postés 392 Date d'inscription mercredi 12 septembre 2007 Statut Membre Dernière intervention 5 septembre 2009
25 oct. 2007 à 23:17
voila :

psychoman4us@hotmail.com

a+
0
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 684
7 sept. 2006 à 08:57
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

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

Posez votre question
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
j'ai trouvé (enfin, on m'a aidé... !)

Merci pour ton aide

A+
Wilmath
0
Salut Wilmath
Pourrais s'il te plait me donner la solution je cherche à faire la même chose.
Merci d'avance
Biloue
0
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
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
bonjour,
puis-je avoir les details de cette fonction pour griser les lignes d'un tableau?
& merci d'avance
0
psychoman Messages postés 30 Date d'inscription mercredi 17 octobre 2007 Statut Membre Dernière intervention 14 février 2008 9
8 janv. 2008 à 17:12
merci
0