Lancement automatique d'une macro
gurumiam
Messages postés
16
Date d'inscription
Statut
Membre
Dernière intervention
-
gurumiam Messages postés 16 Date d'inscription Statut Membre Dernière intervention -
gurumiam Messages postés 16 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
J'ai réussi, contre toute attente, à créer les macros que je désirais. Mais je n'arrive pas à les faire exécuter automatiquement...
J'ai une macro en feuille "Results" et plusieurs macros en feuille "Correct Answers", je souhaite qu'elle s'exécutent toutes dès qu'une modification/saisie a été effectuée en feuille "SM_Extract".
J'ai essayé avec Worksheet_Change mais ça ne donne rien (ou des messages d'erreur...)
Merci d'avance de votre aide
J'ai réussi, contre toute attente, à créer les macros que je désirais. Mais je n'arrive pas à les faire exécuter automatiquement...
J'ai une macro en feuille "Results" et plusieurs macros en feuille "Correct Answers", je souhaite qu'elle s'exécutent toutes dès qu'une modification/saisie a été effectuée en feuille "SM_Extract".
J'ai essayé avec Worksheet_Change mais ça ne donne rien (ou des messages d'erreur...)
Merci d'avance de votre aide
A voir également:
- Lancement automatique d'une macro
- Réponse automatique thunderbird - Guide
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Recherche automatique des chaînes ne fonctionne pas - Guide
- Logiciel de sauvegarde automatique gratuit - Guide
- Sommaire automatique word - Guide
12 réponses
Bonjour,
déjà il faut savoir si ta macro fonctionne parfaitement avec un déclenchement exemple par bouton
ensuite si ta macro est sur un module dans Worksheet_Change il faut appeler la macro
Call nom de la macro
des codes spécifiques créé dans un module ne fonctionne pas de la même façon sur une Sheet exemple ActiveCell dans un module peu être Target dans Worksheet
déjà il faut savoir si ta macro fonctionne parfaitement avec un déclenchement exemple par bouton
ensuite si ta macro est sur un module dans Worksheet_Change il faut appeler la macro
Call nom de la macro
des codes spécifiques créé dans un module ne fonctionne pas de la même façon sur une Sheet exemple ActiveCell dans un module peu être Target dans Worksheet
effectivement elle ne marche pas avec un bouton...
pour créer les macros j'ai simplement ouvert Visual Basic et entrer les codes correspondants dans chaque onglet (je ne suis pas sûre que ça réponde à ta question ?)
en voulant vérifier les façons d'activer la macro, je me suis rendu compte qu'il manque un élément... peut-être que tu peux aussi m'aider à la corriger:
je souhaite masquer des lignes en fonction de la valeur d'une cellule d'une autre feuille, ma macro répond à cette demande, mais une fois que des lignes ont été masquées elle ne les ré-affiche pas alors que la cellule de référence est remplie. J'ai pensé ajouter une macro pour faire l'inverse, mais je me demande si je ne peux pas simplement modifier celle-ci:
Sub masquer_ligne_vide()
Dim Cel As Range
Dim C As Byte
For C = 6 To 34
For Each Cel In Range(Cells(C, 6), Cells(C, 34))
If Cel.Value <> "" And Cel.Value <> 0 Then GoTo suite1
Next Cel
Rows(C).Hidden = True
suite1:
Next C
For C = 6 To 34
For Each Cel In Range(Cells(C, 6), Cells(C, 34))
If Cel.Value <> "" And Cel.Value <> 0 Then GoTo suite2
Next Cel
Rows(C).Hidden = True
suite2:
Next C
End Sub
pour créer les macros j'ai simplement ouvert Visual Basic et entrer les codes correspondants dans chaque onglet (je ne suis pas sûre que ça réponde à ta question ?)
en voulant vérifier les façons d'activer la macro, je me suis rendu compte qu'il manque un élément... peut-être que tu peux aussi m'aider à la corriger:
je souhaite masquer des lignes en fonction de la valeur d'une cellule d'une autre feuille, ma macro répond à cette demande, mais une fois que des lignes ont été masquées elle ne les ré-affiche pas alors que la cellule de référence est remplie. J'ai pensé ajouter une macro pour faire l'inverse, mais je me demande si je ne peux pas simplement modifier celle-ci:
Sub masquer_ligne_vide()
Dim Cel As Range
Dim C As Byte
For C = 6 To 34
For Each Cel In Range(Cells(C, 6), Cells(C, 34))
If Cel.Value <> "" And Cel.Value <> 0 Then GoTo suite1
Next Cel
Rows(C).Hidden = True
suite1:
Next C
For C = 6 To 34
For Each Cel In Range(Cells(C, 6), Cells(C, 34))
If Cel.Value <> "" And Cel.Value <> 0 Then GoTo suite2
Next Cel
Rows(C).Hidden = True
suite2:
Next C
End Sub
Re:
quel est la plage de déclenchement de ta macro si la valeur de la cellule change pour limiter la zone de déclenchement
quel est la plage de déclenchement de ta macro si la valeur de la cellule change pour limiter la zone de déclenchement
ah je me mélange, désolée tu auras remarqué que je n'y connais rien en VBA...
cette macro fais référence à la même feuille (plage de déclenchement = C6:C34), car elles se remplissent en fonction du contenu de la feuille à laquelle j'ai fais référence plus tôt...
cette macro fais référence à la même feuille (plage de déclenchement = C6:C34), car elles se remplissent en fonction du contenu de la feuille à laquelle j'ai fais référence plus tôt...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonjour gurumiam,
Salut Mike, ca va ?
pour masquer les lignes vides dans la colonne C
On error resume next évite de planter si il n'y a pas de cellule danx C6;C34
Au passage
2/ Les "goto" de nos Grands pères ne sont utilisés que pour les gestion des erreurs
Salut Mike, ca va ?
pour masquer les lignes vides dans la colonne C
Sub masquer_si_vide()
On Error Resume Next
Range("C6:C34").SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True
End Sub
On error resume next évite de planter si il n'y a pas de cellule danx C6;C34
Au passage
2/ Les "goto" de nos Grands pères ne sont utilisés que pour les gestion des erreurs
Bonjour Michel,
Merci mais il ne se passe rien avec ça... j'ai remplacer l'intégralité de la macro par ta réponse, je n'aurais peut-être pas du ?
ou peut-être que ça vient du fait que mes cellules contiennent des formules ?
Merci mais il ne se passe rien avec ça... j'ai remplacer l'intégralité de la macro par ta réponse, je n'aurais peut-être pas du ?
ou peut-être que ça vient du fait que mes cellules contiennent des formules ?
ça vient du fait que mes cellules contiennent des formules ?
oui,
la valeur "" résultat d'une formule dans une cellule entraine que la cellule n'est pas vide ("rien" ce n'est pas "vide" pour parodier Raymond Devos)
il aurait utile de préciser ou mieux de joindre le fichier
oui,
la valeur "" résultat d'une formule dans une cellule entraine que la cellule n'est pas vide ("rien" ce n'est pas "vide" pour parodier Raymond Devos)
il aurait utile de préciser ou mieux de joindre le fichier
Re,
Bizarre que le code de Michel (salut) ne fonctionne pas
si ton code placé dans un module fonctionne, ajoute ce qui suit
clic droit sur l'onglet de ta feuille concernée/visualiser le code
et ce code
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Me.Range("C6:C34")) Is Nothing Then
Call masquer_ligne_vide
End If
End Sub
Bizarre que le code de Michel (salut) ne fonctionne pas
si ton code placé dans un module fonctionne, ajoute ce qui suit
clic droit sur l'onglet de ta feuille concernée/visualiser le code
et ce code
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Me.Range("C6:C34")) Is Nothing Then
Call masquer_ligne_vide
End If
End Sub
je suis un peu perdue...
cette dernière réponse permet d'automatiser l'exécution de la macro ou bien de la corriger ?
je l'ai ajouté à mon code de base et ça ne change rien... (la macro ne s'exécute pas suite aux modification et les lignes ne se ré-affichent pas non plus)
voici ce que j'ai en ajoutant le dernier code :
Sub masquer_ligne_vide()
Dim Cel As Range
Dim C As Byte
For C = 6 To 34
For Each Cel In Range(Cells(C, 6), Cells(C, 34))
If Cel.Value <> "" And Cel.Value <> 0 Then GoTo suite1
Next Cel
Rows(C).Hidden = True
suite1:
Next C
For C = 6 To 34
For Each Cel In Range(Cells(C, 6), Cells(C, 34))
If Cel.Value <> "" And Cel.Value <> 0 Then GoTo suite2
Next Cel
Rows(C).Hidden = True
suite2:
Next C
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Me.Range("C6:C34")) Is Nothing Then
Call masquer_ligne_vide
End If
End Sub
cette dernière réponse permet d'automatiser l'exécution de la macro ou bien de la corriger ?
je l'ai ajouté à mon code de base et ça ne change rien... (la macro ne s'exécute pas suite aux modification et les lignes ne se ré-affichent pas non plus)
voici ce que j'ai en ajoutant le dernier code :
Sub masquer_ligne_vide()
Dim Cel As Range
Dim C As Byte
For C = 6 To 34
For Each Cel In Range(Cells(C, 6), Cells(C, 34))
If Cel.Value <> "" And Cel.Value <> 0 Then GoTo suite1
Next Cel
Rows(C).Hidden = True
suite1:
Next C
For C = 6 To 34
For Each Cel In Range(Cells(C, 6), Cells(C, 34))
If Cel.Value <> "" And Cel.Value <> 0 Then GoTo suite2
Next Cel
Rows(C).Hidden = True
suite2:
Next C
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Me.Range("C6:C34")) Is Nothing Then
Call masquer_ligne_vide
End If
End Sub
Non, ce bout de code ne doit pas être dans un module mais dans les propriétés de ta feuille
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Me.Range("C6:C34")) Is Nothing Then
Call masquer_ligne_vide
End If
End Sub
supprime le du module et je t'ai écrit
clic droit sur l'onglet de ta feuille concernée/visualiser le code
et colle ce code à ce niveau et pas ailleurs
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Me.Range("C6:C34")) Is Nothing Then
Call masquer_ligne_vide
End If
End Sub
A+
Mike-31
Je suis responsable de ce que je dis, pas de ce que tu comprends...
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Me.Range("C6:C34")) Is Nothing Then
Call masquer_ligne_vide
End If
End Sub
supprime le du module et je t'ai écrit
clic droit sur l'onglet de ta feuille concernée/visualiser le code
et colle ce code à ce niveau et pas ailleurs
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Me.Range("C6:C34")) Is Nothing Then
Call masquer_ligne_vide
End If
End Sub
A+
Mike-31
Je suis responsable de ce que je dis, pas de ce que tu comprends...
je ne comprends pas, c'est bien ce que j'ai fait... quand je clic sur visualiser le code j'arrive directement sur le code (fenetre avec 2 menus déroulants : 1 général/worksheet et 1 déclarations/masquer ligne vide
tu as écris que dans C6:C34 que les valeurs inscrites étaient le résultat d'une formule d'où la valeur "" si la condition n'est pas remplie
DONC c'est la zone où tu effectues une saisie qui va déclencher la procédure pour masquer (et de plus: nouvelle demande : démasquer) les cellules de la colonne C6:C34
C'est ça ou pas ?
Pour en finir enfin, joins ta feuille de classeur en coloriant les différentes saisies possibles
nota:
Les macros événementielles comme worksheet_change ne sont pas compliquées mais demande une certaine habitude du VBA.... Alors, panique pas!
DONC c'est la zone où tu effectues une saisie qui va déclencher la procédure pour masquer (et de plus: nouvelle demande : démasquer) les cellules de la colonne C6:C34
C'est ça ou pas ?
Pour en finir enfin, joins ta feuille de classeur en coloriant les différentes saisies possibles
Mettre le classeur sans données confidentielles en pièce jointe sur
https://mon-partage.fr
Dans lien de téléchargement
faire un clic droit- copier l’adresse du lien et le coller dans votre message en cours sur ccm
nota:
Les macros événementielles comme worksheet_change ne sont pas compliquées mais demande une certaine habitude du VBA.... Alors, panique pas!
Bonjour Michel,
Merci pour ton aide, je sais que je ne demande pas le plus clairement^
Voici le lien de mon fichier sans données : https://mon-partage.fr/f/qXriQQFm/
Et un récap de mes besoins:
Utilisation du fichier : l'utilisateur va copier/coller des données en feuille "SM_Extract" dans la plage A3:DG32, il 1 à 30 lignes de données. Cela va remplir des "formulaires" en feuille "Answers" (le but du fichier est de rendre utilisables les données d'une extraction imbuvable, en faisant apparaître sous forme de "formulaire" les réponses d'un candidat, l'utilisateur peut avoir 1 à 30 candidats)
1/ Feuille "Results" : je souhaite que les lignes (contenant des formules) du tableau (D4 à AQ33) ne s'affichent que lorsqu'elles sont remplies et que cette macro s'exécute dès qu'une modification a été apportée à la feuille "SM_Extract" (dès que l'utilisateur a intégrer les données, mais que s'il décide de faire une nouvelle saisie ou de supprimer des données, mon tableau en feuille "Results" s'ajuste automatiquement). J'ai actuellement donc ajouté ce matin une colonne (B) qui affiche 1 si la ligne est à afficher ou pas et j'ai réussi à faire une macro "masquer_les_lignes" qui affiche ou masque mais qui ne s'exécute pas automatiquement lors des changements en feuille "SM_Extract".
2/ Feuille "Answers": je souhaite masquer les colonnes inutiles. En effet, j'ai 30 "formulaires" pour 30 candidats possibles, je souhaite masquer les "formulaires" qui ne sont pas remplis (si je n'ai que 3 candidats, je voudrais que seuls les 3 "formulaires" remplis soient visibles). J'ai une macro "masquer_formulaire" qui se base sur le contenu d'une cellule du "formulaire" pour le masquer, elle fonctionne très bien, mais avant de la recopier pour chaque "formulaire" je me demande s'il n'y a pas un moyen de lui dire de le faire pour tous, sachant que les "formulaires" démarrent toutes les 11 colonnes. Et bien-sûr il faudrait que ça se fasse automatiquement tout comme le besoin 1/ :)
3/ Excepté la macro que je mentionne en besoin 2/, toutes celles que j'ai actuellement dans mon fichier sont très longues à s'exécuter. Je suppose que c'est parce que je ne sais pas ce que je fais et qu'il y a un moyen moins lourd. Si elles doivent rester si longues, j'aimerai m'assurer que l'utilisateur attende bien la fin de l'exécution avant de s'énerver. J'ai donc tenté de faire un UserForm avec une barre de progression qui s'affiche pendant l'exécution d'une macro "Show_closed_questions" activée par bouton par l'utilisateur (encore autre chose oui... qui masque des ligne en feuille "Answers"), mais je n'arrive pas à intégrer cette barre dans les macros. L'idée c'est que l'utilisateur sache qu'il doit attendre, sachant que je ne suis pas fan du fait qu'il voit les lignes se masquer et s'afficher les unes après les autres en attendant... Le mieux bien-sûr serait d'avoir des macros qui mettent moins de temps à s'exécuter, et si ce n'est pas possible de "cacher" complètement la feuille en précisant qu'il faut attendre pendant l'exécution.
J'ai conscience de l'éloignement par rapport à ma demande initiale, notamment sur la quantité... je pense avoir passé bien 5 jours à essayer de régler ces différents problèmes alors tant qu'à faire je demande tout, qui ne tente rien !
J'espère avoir été précise et claire cette fois-ci,
Un grand merci d'avance pour ce que tu pourras m'apporter :)
Merci pour ton aide, je sais que je ne demande pas le plus clairement^
Voici le lien de mon fichier sans données : https://mon-partage.fr/f/qXriQQFm/
Et un récap de mes besoins:
Utilisation du fichier : l'utilisateur va copier/coller des données en feuille "SM_Extract" dans la plage A3:DG32, il 1 à 30 lignes de données. Cela va remplir des "formulaires" en feuille "Answers" (le but du fichier est de rendre utilisables les données d'une extraction imbuvable, en faisant apparaître sous forme de "formulaire" les réponses d'un candidat, l'utilisateur peut avoir 1 à 30 candidats)
1/ Feuille "Results" : je souhaite que les lignes (contenant des formules) du tableau (D4 à AQ33) ne s'affichent que lorsqu'elles sont remplies et que cette macro s'exécute dès qu'une modification a été apportée à la feuille "SM_Extract" (dès que l'utilisateur a intégrer les données, mais que s'il décide de faire une nouvelle saisie ou de supprimer des données, mon tableau en feuille "Results" s'ajuste automatiquement). J'ai actuellement donc ajouté ce matin une colonne (B) qui affiche 1 si la ligne est à afficher ou pas et j'ai réussi à faire une macro "masquer_les_lignes" qui affiche ou masque mais qui ne s'exécute pas automatiquement lors des changements en feuille "SM_Extract".
2/ Feuille "Answers": je souhaite masquer les colonnes inutiles. En effet, j'ai 30 "formulaires" pour 30 candidats possibles, je souhaite masquer les "formulaires" qui ne sont pas remplis (si je n'ai que 3 candidats, je voudrais que seuls les 3 "formulaires" remplis soient visibles). J'ai une macro "masquer_formulaire" qui se base sur le contenu d'une cellule du "formulaire" pour le masquer, elle fonctionne très bien, mais avant de la recopier pour chaque "formulaire" je me demande s'il n'y a pas un moyen de lui dire de le faire pour tous, sachant que les "formulaires" démarrent toutes les 11 colonnes. Et bien-sûr il faudrait que ça se fasse automatiquement tout comme le besoin 1/ :)
3/ Excepté la macro que je mentionne en besoin 2/, toutes celles que j'ai actuellement dans mon fichier sont très longues à s'exécuter. Je suppose que c'est parce que je ne sais pas ce que je fais et qu'il y a un moyen moins lourd. Si elles doivent rester si longues, j'aimerai m'assurer que l'utilisateur attende bien la fin de l'exécution avant de s'énerver. J'ai donc tenté de faire un UserForm avec une barre de progression qui s'affiche pendant l'exécution d'une macro "Show_closed_questions" activée par bouton par l'utilisateur (encore autre chose oui... qui masque des ligne en feuille "Answers"), mais je n'arrive pas à intégrer cette barre dans les macros. L'idée c'est que l'utilisateur sache qu'il doit attendre, sachant que je ne suis pas fan du fait qu'il voit les lignes se masquer et s'afficher les unes après les autres en attendant... Le mieux bien-sûr serait d'avoir des macros qui mettent moins de temps à s'exécuter, et si ce n'est pas possible de "cacher" complètement la feuille en précisant qu'il faut attendre pendant l'exécution.
J'ai conscience de l'éloignement par rapport à ma demande initiale, notamment sur la quantité... je pense avoir passé bien 5 jours à essayer de régler ces différents problèmes alors tant qu'à faire je demande tout, qui ne tente rien !
J'espère avoir été précise et claire cette fois-ci,
Un grand merci d'avance pour ce que tu pourras m'apporter :)