Lancement automatique d'une macro

gurumiam Messages postés 16 Statut Membre -  
gurumiam Messages postés 16 Statut Membre -
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

12 réponses

  1. Mike-31 Messages postés 18405 Date d'inscription   Statut Contributeur Dernière intervention   5 147
     
    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
    0
  2. gurumiam Messages postés 16 Statut Membre
     
    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
    0
  3. Mike-31 Messages postés 18405 Date d'inscription   Statut Contributeur Dernière intervention   5 147
     
    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
    0
  4. gurumiam Messages postés 16 Statut Membre
     
    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...
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour gurumiam,
    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

    0
  7. gurumiam Messages postés 16 Statut Membre
     
    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 ?
    0
  8. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    ç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
    0
  9. Mike-31 Messages postés 18405 Date d'inscription   Statut Contributeur Dernière intervention   5 147
     
    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
    0
  10. gurumiam Messages postés 16 Statut Membre
     
    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
    0
  11. Mike-31 Messages postés 18405 Date d'inscription   Statut Contributeur Dernière intervention   5 147
     
    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...
    0
  12. gurumiam Messages postés 16 Statut Membre
     
    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
    0
  13. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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
    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!

    0
    1. gurumiam Messages postés 16 Statut Membre
       
      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 :)
      0
      1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320 > gurumiam Messages postés 16 Statut Membre
         
        Bonjour,

        merci de m'envoyer ton classeur au format xlsm (xlsb refusé chez moi avec xl2007)

        quelle est ta version Excel ? si 365, problème car cette version est caractérielle
        0
      2. gurumiam Messages postés 16 Statut Membre > michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention  
         
        ah désolée, voici le nouveau lien : https://mon-partage.fr/f/F8VWxfEJ/

        et oui je suis en 365...
        0
      3. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320 > gurumiam Messages postés 16 Statut Membre
         
        Bonjour,

        Désolé, mais je ne connais pas Office 365 :-(
        réponse tardive mais j'ai essayé de contacter des habitués pendant le WE ainsi que sur internet mais il y aurait pas mal de problèmes...
        0
      4. gurumiam Messages postés 16 Statut Membre > michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Je comprends, merci d'avoir essayé ! Je vais ajouter un bouton actualiser pour exécuter les macros (en espérant qu'il fonctionne ^^) et je tâcherai de préciser ma version excel pour les prochains posts ;)
        0