(vba) Declenchement d'une macro dans une fonction conditionnelle

  • Initiateur de la discussion Initiateur de la discussion pjp666
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

pjp666

XLDnaute Nouveau
Bonjour,

Je fais encore appel a plus erudit que moi car mon apprentissage du vba ne se fait pas sans quelques difficultes.
En fait je cherche a monter une fonction conditionnelle qui quand la condition est remplie entraine le declenchement d'une macro.
Je sais qu'une fonction de type SI doit imperativement renvoyer a une valeur et qu'il faut donc utiliser une fonction avec une valeur quelconque qui, elle, entraine le declenchement de la macro. Et c'est la que je bute.
Pour simplifier, prenons une macro quelconque, tres basique:

Sub Macro3()

Range("B4").Select
Selection.Copy
Range("C14").Select
ActiveSheet.Paste


End Sub

et une fonction fMacro3() censee renvoyer a la macro dans la fonction conditionnelle ci dessous:
=SI(A11=2, fMacro3(), FAUX)

Maintenant la question: Que dois je ecrire dans la fonction vba pour que celle ci entraine le declenchement de la macro?
J'ai essaye

Public Function fMacro3()
Macro3
fMacro3 = 0


End Function

Mais cela ne fonctionne pas (la cellule affiche 0, alors que vous voudrez justement que ce 0 soit la valeur qui sert de lien entre fonction et macro). J'ai essaye quantite d'autres disposition mais soit cela ne fonctionne pas soit cela entraine des problemes de compilation,

Quelqu'un aurait il une idee svp?

D'avance merci.

Bien cordialement,
 
Re : (vba) Declenchement d'une macro dans une fonction conditionnelle

Bonsoir,


A mon avis, il te faut regarder du coté des macros évenementielles,
du style :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Range("A11") = 2 Then
tamacro
end if
End Sub
A placer dans le code de la feuille

Ninbihan

Edit: si tu pouvais poster un petit exemple..
 
Dernière édition:
Re : (vba) Declenchement d'une macro dans une fonction conditionnelle

Bonsoir,

Tout d'abord merci d'avoir repondu!

En ce qui concerne la macro evenementielle que tu proposes, cela ne me parait pas convenir dans le sens ou j'aimerai ensuite appliquer cette fonction conditionnelle pour plusieurs cellules.
La j'ai pris un exemple basique car je souhaiterai vraiment savoir comment lie une fonction a une macro afin qu'elle entraine son declenchement! Car il me semble que c'est possible.
Pour l'exemple de quels autres details as tu besoin? J'ai donne la macro "test", la fonction conditionnelle et la tentative de fonction vba "lien". Y a t il quelque chose d'autre qui te permettrait d'y voir plus clair?
Quoiqu'il en soit merci pour ton aide!
 
Re : (vba) Declenchement d'une macro dans une fonction conditionnelle

Re,

Voici un exemple, dés qu'une cellule de la colonne A est égale à 2 la macro test se lance
Cela est ce que tu cherches ?


Ninbihan

Exactement, en passant par la fonction conditionnelle d'excel. En fait ce que j'entend part la c'est que j'aimerai savoir comment declencher une macro directement a partir d'une formule et non d'un bouton ou autre. Je pensais que ma piste d'utiliser une fonction vba pour faire le lien etait la bonne...Qu'en penses tu?
Voila, desole si je te parais un peu confus, j'essaie d'etre le plus precis possible mais c'est loin d'etre evident
Et c'est vraiment sympa de prendre le temps de regarder!
 
Re : (vba) Declenchement d'une macro dans une fonction conditionnelle

Bonsoir Pjp, ninbihan,

Je m'orienterais aussi du côté des macro évènementielles, car je ne vois guère l'intérêt de passer par une fonction (qui est en général prévue pour retourner une valeur) pour déclencher une macro.

Mais si c'est ce que tu veux voici un exemple:

En A1, tu mets VRAI et en B1, tu insère la fonction personnalisée en lui passant A1 comme argument.
Si A1 est VRAI, la macro est appelée et la valeur de B2 modifiée en conséquence.

Code:
Option Explicit

Function callMacroIf(cellule As Range)
Application.Volatile

If cellule = True Then
        Call macroTest
        callMacroIf = "la macro a été appelée"
    Else
        callMacroIf = "la macro a n'a pas été appelée"
    End If

End Function
Code:
Sub macroTest()
    MsgBox " la valeur de la cellule est VRAI"
End Sub
Vois si c'est l'idée et dis nous

Bonne soirée
 
Re : (vba) Declenchement d'une macro dans une fonction conditionnelle

Pour aller plus loin ,la fonction peut déclencher une macro en lui passant des arguments :

Code:
Function callMacroIf(cellule As Range)
Application.Volatile

If cellule = True Then
        Call macroTest(cellule)
        callMacroIf = "la macro a été appelée"
    Else
        callMacroIf = "la macro a n'a pas été appelée"
    End If

End Function

Sub macroTest(LaCellule As Range)
    MsgBox " la valeur de la cellule  " & LaCellule.Address & "  est  " & LaCellule.Value
End Sub
Bonne soirée
 
Re : (vba) Declenchement d'une macro dans une fonction conditionnelle

Luki, Ninbihan,

Tout d'abord un tres grand merci pour votre aide!!!

Je met du temps a repondre car j'ai bien pris le temps de tout tester avant de vous faire part de mes impressions! Au final, c'est vous qui avez raison, bien que ta fonction fonctionne tres bien Luki, il est effectivement preferable d'utiliser les macros evenementielles. Le resultat est tout bonnement excellent! Pardon d'avoir doute de la pertinence de tes propos Ninbihan, je fais amende honorable. Et j'en profite pour poser une derniere petite question:
Comment appliquer cette macro evenementielle non plus sur une cellule mais sur un ensemble de cellule? (par exemple tester sur l'ensemble A1:C20 si une des cellules contient 2, et si oui declencher la macro)

Encore un grand merci, je reviendrai sur ce site ou il y a toujours quelqu'un pour apporter une reponse pertinente! Et peut etre pourrais je un jour moi aussi aider les autres (on peut rever 🙂)
Bonne fin de soiree
 
Re : (vba) Declenchement d'une macro dans une fonction conditionnelle

Pour etre plus precis meme, voila ce que j'aimerai faire:
Si une cellule contient une quelconque valeur, appliquer la macro sur cette cellule en particulier. Dans la macro que j'ai cite comme exemple cela est bien sur inutile mais imaginons une macro qui realise une action specifique ciblee sur une cellule en particulier(par exemple le calcul d'une formule predefinie).
En gros tester sur un ensemble de cellule une condition et declencher la macro sur chacune d'elle qui remplit la condition.
J'espere etre clair, j'essaie de chercher de mon cote et dans certains cas je trouve (sinon je posterai 600 fois par jour), mais je ne suis qu'un jeune novice qui a les idees plus hautes que les connaissances!

Encore merci
 
Re : (vba) Declenchement d'une macro dans une fonction conditionnelle

Re à tous

Pjp666, un exemple de ce que tu demandes:
une macro évènementielle qui travaille sur une plage limitée. Elle appelle 4 macros différentes en fonction de la valeur de la cellule qui change et change sa couleur de remplissage (Je sais les MFC font ça très bien! c'est pour l'exemple! 😀)

Code à coller dans un module de feuille.

Code:
'---------------------------------------------------------------------------------------
' Module    : Feuil1
' Auteur    : Luki sur xld pour pjp666
' Date      : 05/12/2007
' Description : Procédure événementielle pour changer la couleur de remplissage de
' la cellule en fonction de sa valeur.
' L'événement déclencheur est 'Change' dans la feuille
'---------------------------------------------------------------------------------------

Option Explicit
'-------------------------------------------------------
Private Sub Worksheet_Change(ByVal Target As Range) 'target est la cellule qui appelle la macro événementielle

Dim WorkRange As Range

    'Définit la plage sur laquelle travailler
    Set WorkRange = Range("A1:A20")
    
    'Si l'intersection de la cible(target) et de la plage de travail ne renvoie aucune
    'cellule, sortie macro.
    If Intersect(Target, WorkRange) Is Nothing Then Exit Sub
    'Si la cible contient plusieurs cellules, sortie macro pour éviter les bugs
    If Intersect(Target, WorkRange).Cells.Count > 1 Then Exit Sub

'>>> Choix d'une macro à appeler en fonction de la valeur de cellule <<<
 
    'Si target est vide, appelle macro04 et sortie
    If IsEmpty(Target) Then Call macro04(Target): Exit Sub
    
    'Sinon:
    'Appelle une macro en fonction de la valeur en lui passant 'target' comme argument.
    Select Case Target.Value
        Case Is < 10
            Call macro01(Target)
        Case Is = 10
            Call macro02(Target)
        Case Is > 10
            Call macro03(Target)
    End Select
        
End Sub
'-----------------------------------------------------------------
Sub macro01(cible As Range) 'affecte une couleur de remplissage
    cible.Interior.ColorIndex = 5
End Sub

Sub macro02(cible As Range) 'affecte une couleur de remplissage
    cible.Interior.ColorIndex = 10
End Sub

Sub macro03(cible As Range) 'affecte une couleur de remplissage
    cible.Interior.ColorIndex = 15
End Sub

Sub macro04(cible As Range) ' supprime la couleur de remplissage
    cible.Interior.ColorIndex = xlNone
End Sub
Voilà, en espérant t'avoir apporté un peu de lumière dans le monde parfois obscur du vba! 🙂

Bonne journée
 
Re : (vba) Declenchement d'une macro dans une fonction conditionnelle

Luki un grand merci a toi!

Grace aux explications, je comprend parfaitement ta macro, elle fonctionne nickel.
Tres interessant.
Je vais maintenant pouvoir adapter.

Encore merci, et a bientot!
 
Re : (vba) Declenchement d'une macro dans une fonction conditionnelle

Luki,

Finalement j'ai encore deux questions....Premierement comment est il possible de reinitialiser la macro a chaque fois que l'on change la valeur dans la cellule? Car la cela marche au premiere coup mais si je reviens sur la cellule et que je change la valeur, dans l'exemple que tu as pris la couleur de la cellule ne change pas en consequence.
Deuxiemement est il possible par exemple de faire un copier-coller sur l'ensemble des cellules concernees et d'obtenir le declenchement de la macro quand meme? Car la avec la condition
If Intersect(Target, WorkRange).Cells.Count > 1 Then Exit Sub
cela n'est pas possible et quand je la retire, la fonction ne marche plus.
Voila desole de poser autant de questions, ma soif de curiosite ne saurait se tarir.
Merci et bonne journee
 
Re : (vba) Declenchement d'une macro dans une fonction conditionnelle

Re,
Concernant ta première question... pas compris 😕, chez moi ça fonctionne.

Pour la deuxième, un exemple commenté te conviendrait-il?

Le voici, pour remplacer le précédent (les macros tu les as déjà)

Code:
Private Sub Worksheet_Change(ByVal Target As Range) 'target est la cellule qui appelle la macro événementielle

Dim Plage_Cible As Range
Dim Plage_A_Traiter As Range
Dim C As Range

    'Définit la plage qui doit réagir à l'évènement "change"
    Set Plage_Cible = Range("A1:A20")
    
    'Limitation de  la plage à traiter par l'intersection de "target" et de la plage_cible (target pourrait_
    'être plus grand que la plage cible, ou à cheval, dans le cas d'un copier/coller)
    Set Plage_A_Traiter = Intersect(Target, Plage_Cible)
    
    'Si elle ne contient aucune cellule, sortie.
    If Plage_A_Traiter Is Nothing Then Exit Sub
    
'astuce de débuggage : afficher des infos sur la plage à traiter dans la fenêtre_
'exécution( à passer en commentaire quand ça marche)
Debug.Print Plage_A_Traiter.Address & vbLf & Plage_A_Traiter.Cells.Count
    
    
    'boucle sur chaque cellule de la plage à traiter( pasage obligé, le_
    '"selectcase" ne peut travailler que sur une cellule à la fois)
       For Each C In Plage_A_Traiter.Cells
       
            'nettoyage de la couleur de  remplissage avant d'agir
            C.Interior.ColorIndex = xlNone
            
            'Action seulement sur cellule non-vide
            If Not IsEmpty(C) Then
                    'Appelle une macro en fonction de la valeur en lui passant 'C' comme argument.
                     Select Case C.Value
                         Case Is < 10
                             Call macro01(C)
                         Case Is = 10
                             Call macro02(C)
                         Case Is > 10
                             Call macro03(C)
                         Case Else
                             Call macro04(C)
                     End Select
            End If
       Next C
        
End Sub
A+ 🙂
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour