cs_Sp00ky
Messages postés112Date d'inscriptionvendredi 21 janvier 2005StatutMembreDernière intervention20 novembre 2006
-
19 août 2005 à 09:18
cs_Sp00ky
Messages postés112Date d'inscriptionvendredi 21 janvier 2005StatutMembreDernière intervention20 novembre 2006
-
19 août 2005 à 10:35
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")
mrdep1978
Messages postés402Date d'inscriptionjeudi 25 novembre 2004StatutMembreDernière intervention 7 juin 20097 19 août 2005 à 09:30
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.
cs_Sp00ky
Messages postés112Date d'inscriptionvendredi 21 janvier 2005StatutMembreDernière intervention20 novembre 20061 19 août 2005 à 09:54
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 ...
cs_Sp00ky
Messages postés112Date d'inscriptionvendredi 21 janvier 2005StatutMembreDernière intervention20 novembre 20061 19 août 2005 à 10:01
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 ...
cs_Sp00ky
Messages postés112Date d'inscriptionvendredi 21 janvier 2005StatutMembreDernière intervention20 novembre 20061 19 août 2005 à 10:20
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.
cs_Sp00ky
Messages postés112Date d'inscriptionvendredi 21 janvier 2005StatutMembreDernière intervention20 novembre 20061 19 août 2005 à 10:35
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