[HELP.ME] Exécuter une macro via une formule, si on modifie certaines cellules [Résolu]

Signaler
Messages postés
112
Date d'inscription
vendredi 21 janvier 2005
Statut
Membre
Dernière intervention
20 novembre 2006
-
cs_Sp00ky
Messages postés
112
Date d'inscription
vendredi 21 janvier 2005
Statut
Membre
Dernière intervention
20 novembre 2006
-
Bonjour,

Je voudrais savoir s'il est possible (et si oui comment) de lancer une macro via une fonction dans une cellule (sous Excel 2003)

Cette macro serait appellée automatiquement lorsqu'on modifie des cellules en particulier, sur la ligne ou se trouve la formule

Aussi autre question : est-il possible, sans passer par une macro, de changer les polices et le fond d'une cellule en fonction du résultat.
Par ex. : =SI(condition, en gras et fond rouge : "ok", en gras et fond noir : "pas bon")

Merci d'avance !



<HR>

$p00ky
______________________________________________
.:: KoC-FR ::. Alliance Francophone Kings of Chaos
Venez jouer au meilleur MMORPG gratuit et facile !</FON< body>

7 réponses

Messages postés
402
Date d'inscription
jeudi 25 novembre 2004
Statut
Membre
Dernière intervention
7 juin 2009
3
Salut,

Pour ta 1e question, tu peux utiliser l'événement Change de l'objet Worksheet (si tu veux gérer ta fonction dans une seule feuille) ou l'événement SheetChange de l'objet Workbook (si tu veux qu'il se déclenche pour plusieurs feuilles du fichier Excel.

Pour répondre à ta 2e question, il faut que tu ailles voir dans le menu "Format", "Mise en forme automatique" : Pour une cellule (ou une plage de cellules), tu peux donner jusqu'à 3 conditions et formats différents.
3
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 199 internautes nous ont dit merci ce mois-ci

Messages postés
154
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
5 septembre 2008

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address = "$A$1" Then
call TaMacro
End If
End Sub
Couscous
3
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 199 internautes nous ont dit merci ce mois-ci

Messages postés
154
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
5 septembre 2008

If Cells(1, 1).Value = "ok" Then
Range("A1").Select
Selection.Font.ColorIndex = 3
Selection.Font.Bold = True
ElseIf Cells(1, 2).Value = "pas bon" Then
Range("B1").Select
Selection.Font.Bold = True
Selection.Font.ColorIndex = 0
End If

Couscous
Messages postés
112
Date d'inscription
vendredi 21 janvier 2005
Statut
Membre
Dernière intervention
20 novembre 2006

Merci pour la seconde question c'est exactement ce que je cherchais ;)

Pour la première question par contre, en fait je ne voudrais pas tout à fait ca ...

Je voudrais appeller la macro par une fonction dans une cellule :
Par ex. =MACRO
Ou Macro est une de mes macros enregistrées dans les Modules

Cependant, cette fonction (qui donc n'execute que la macro), ne devrait s'executer que s'il y'a une modification d'une des cellules de la ligne ou se trouve la cellule de la fonction.

Comme si c'était une fonction genre =SI(cellules_modifiées; execute_macro; sinon rien)

Et la macro repererait la ligne de la cellule qui l'appelle pour effectuer les opérations dans celle ci.

Je ne sais pas si c'est possible ....

En fait, c'est juste car je n'arrive pas à faire ce que je veux juste avec les formules (sans macro VBA) : compter le nombre de cellules avec du texte sur la ligne ou est la fonction, sachant que certaines cellules peuvent etre fusionnées, et donc il compte le texte uniquement dans la premiere du groupe de cellule, et detecte les autres lignes comme étant vides ...
En VBA, je peux lui dire : si la cellule est fusionnée, tu regardes si la premiere de la fusion contient du texte ....
Mais pas une formule j'y arrive pas ... d'ou l'interet de passer par la macro...

Cependant une macro qui tourne tout le temps sur chaque ligne, c'est impossible niveau mémoire. Donc je voudrais faire appeller cette macro que s'il y'a des modifications sur la ligne, à la maniere d'une fonction ...

Merci d'avance !



<HR>

$p00ky
______________________________________________
.:: KoC-FR ::. Alliance Francophone Kings of Chaos
Venez jouer au meilleur MMORPG gratuit et facile !</FON< body>
Messages postés
112
Date d'inscription
vendredi 21 janvier 2005
Statut
Membre
Dernière intervention
20 novembre 2006

Ooops je n'avais pas vu les réponses de Paladin2107 ...

Pour ce sub :

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address = "$A$1" Then
call TaMacro
End If
End Sub

If Target.Adress = "$A$1" est en fait la plage que je veux tester ?

Je voudrais juste que dès qu'il y'a un changement dans une cellule, connaitre la ligne ou a eu lieu le changement (ou les lignes ou ont eu lieu les changements) et executer la macro sur ces lignes ...



<HR>

$p00ky
______________________________________________
.:: KoC-FR ::. Alliance Francophone Kings of Chaos
Venez jouer au meilleur MMORPG gratuit et facile !</FON< body>
Messages postés
112
Date d'inscription
vendredi 21 janvier 2005
Statut
Membre
Dernière intervention
20 novembre 2006

Je viens de comprendre et faire marcher cette fonction :

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
For Each Cellule In Selection
call Macro(Selection.Row) ' ou j'ai une public fonction nommée Macro
Next
End Sub

Je récupere bien les lignes sur lesquelles ont eu lieu les changements ...

C'est exactement le meme principe que je veux, sauf que là ca s'execute a chaque changement de cellule, je voudrais que ca ne s'execute qu'a chaque modification du contenu d'une cellule.

Ceci existe t-il ?



<HR>

$p00ky
______________________________________________
.:: KoC-FR ::. Alliance Francophone Kings of Chaos
Venez jouer au meilleur MMORPG gratuit et facile !</FON< body>
Messages postés
112
Date d'inscription
vendredi 21 janvier 2005
Statut
Membre
Dernière intervention
20 novembre 2006

Yes, j'ai réussi !!

Merci à vous deux, voilà ce que je cherchais exactement pour ma premiere fonction:


Private Sub Worksheet_Change(ByVal Target As Range)
For Each Cellule In Target
nouvelle = Cellule.Row
If nouvelle <> old Then
Call Ma_Fonction(Cellule.Row) ' J'appelle ma fonction publique
End If
old = Cellule.Row
Next
End Sub

MERCI !!



<HR>

$p00ky
______________________________________________
.:: KoC-FR ::. Alliance Francophone Kings of Chaos
Venez jouer au meilleur MMORPG gratuit et facile !</FON< body>