Pb macro excel

Bonjour,

J'ai une macro qui me permet de masquer certaines lignes d'un tableau de la Feuil3 en fonction de la valeur de la cellule D4 de la Feuil1 : Macro1

En utilisant l'enregistreur de macro afin de copier coller le résultat de cette macro (ie les lignes restant affichées) sur une autre feuille donnée, j'obtiens la Macro2

Je voudrai combiner ces deux macros afin de pouvoir coller directement les lignes restant affichées selon le service sur une autre feuille. J'utilise la Macro3

Pourquoi ça ne marche pas ?

Merci d'avance

Elsie

32 réponses

Résumé de la discussion

Masquer des lignes dans Feuil3 selon la valeur de D4 sur Feuil1 et coller ensuite les lignes restantes sur une feuille de destination est le problème à résoudre. La solution proposée lit D4 et K1 sur Feuil1, parcourt Feuil3 et copie les lignes A:D lorsque la valeur de la colonne A correspond à D4, puis les colle à la fin de la feuille dont le nom est renseigné par K1. Cette approche permet un collage direct des résultats sans étape intermédiaire, optimisant l’enchaînement des macros. Des améliorations évoquées concernent la gestion des mises en forme lourdes et les performances, avec des recommandations d’utiliser la mise en forme conditionnelle plutôt que des colorisations via code.

Bobot (l’IA à votre service)
  1. Bonsoir,

    J'ai bien compris que vous étiez bénévole. Je débute en VBA alors oui je demande de l'aide. Je ne suis pas « salariée de ma boîte », je suis stagiaire. C'est gentil de bien vouloir m'aider mais les commentaires à coté, franchement je n'en vois pas l'intérêt.

    Le fichier en question est arrêté, je n'ai peut être pas assez données d'explications mais dans ce cas autant me demander des précisions que de parler de support évolutif... quoi que oui ce fichier sera éventuellement amené à évoluer raison pour laquelle je tiens à comprendre les codes au cas où je devrai par la suite les réarranger.

    OK les codes sont figés ; n'empêche qu'on peut les modifier, non ?

    Private Sub Worksheet_Change
    Dés que tu auras sélectionné KO dans une cellule, il déclenchera l'envoi, faut pas faire d'erreur en cliquant sinon le destinataire ne va rien comprendre


    Oui là j'ai remarqué ce pb ; du coup j'ai restreint la zone d'exécution de la macro à une cellule de la colonne O et j'ai écrit autant de macro que de ligne. Pour ce qui est de la rechercheV, c'était une idée, je ne trouvais pas cela très pratique de devoir écrire des emails à chaque fois, mais bon...

    Elsie
    1. Re,

      Comme je te l'ai déjà dit, un code VBA est figé, si tu dois modifier ton fichier pour mettre les adresses mails en T fait-le de suite cela peut changer la façon d'écrire le code.
      Tu parle également de RECHERCHEV, la aussi il faut savoir qu'avec ce genre de fonction, il n'est pas possible de faire une recherche sur des colonnes négatives par rapport à la colonne de référence.
      Autre chose, si tu mets ce code dans les propriétés de la feuille

      Private Sub Worksheet_Change
      Dés que tu auras sélectionné KO dans une cellule, il déclenchera l'envoi, faut pas faire d'erreur en cliquant sinon le destinataire ne va rien comprendre

      Je te conseille de bien arrêter ton fichier avant de nous lancer sur un support évolutif, le rôle du forum est d'apporter un support technique, pas la réalisation de projet et encore moins de réécrire ou modifier des codes, comme je te l'ai également déjà dit nous sommes bénévoles pas les salarié de ta boite. Si je t'apporte mon concours bien que mes occupations me limitent, c'est que ton projet est pertinent.
      1. Re,

        Que veux tu faire, feuille Service, lorsqu'il y a un KO sur la ligne entre H et M, envoyer un mail via Outlook à l'adresse sur la même ligne colonne E !
        1. oui, un mail reprenant les éléments ko en fait. mais j'arrivais pas à faire la sélection... alors j'ai tout mis.

          pour le moment j'ai mis les emails en E pour tester, quand je les aurais je comptais mettre les mails dans la colonne T et la E contiendrait les noms et avec un RechercheV ça les enverraient un peu comme la feuille 1.

          je précise car je ne sais pas si c'est important pour le code

          laure
      2. Salut,

        Je pensais que tu abandonnais le projet.
        J'ai revu tous le code, à la place de recopier les lignes concernant un service, et les coloriser pour ensuite extraire ces lignes en fonction du tirage aléatoire feuille Test, j'ai directement colorisé les lignes sur la feuille Tous et importé ces lignes sur la feuille Service.
        Ensuite le fichier à expédié est verrouillé, expédié puis les lignes importées sur la feuille Service sont supprimé pour effectuer éventuellement un autre envoi ainsi que les couleurs sont effacées sur la feuille Tous.
        On gagne énormément en rapidité.
        Je jette un oeil sur ta nouvelle question et on en reparle

        https://www.cjoint.com/?fCuY6rpoyV
        1. ok merci.
          je vais regarder ton fichier.

          Laure
        2. c'est plutôt dans la feuille Service que j'ai un code par ligne.
      3. Bonjour,

        Dernière version de mon fichier :
        http://www.cijoint.fr/cjlink.php?file=cj201005/cijccocxxq.xls

        Pour coloriser les saisies OK KO j'ai plutôt utilisé la mise en forme conditionnelle, effectivement c'est mieux. Pour les listes déroulantes, heuu, ils y tiennent, donc je pense que si le doc est un peu lourd ce n'est pas grave.

        Je ne sais pas quels sont les codes que tu as réécris mais j'aimerai que tu m'aides pour 2 choses s'il te plaît.

        - J'aimerai que lorsque l'utilisateur clique sur le bouton « Diffusion » le fichier reste sur la feuille 1 et non que la feuille 3 s'active.

        - Dans la dernière feuille de mon fichier, j'ai mis un code afin de pouvoir envoyer automatiquement un mail quand la colonne O (Demande de correction) est renseignée. Mais je n'ai pas réussi à adapter le code afin qu'il fonctionne pour l'ensemble des cellules ("O2:O21"). Alors j'ai mis autant de code que de lignes pour le moment...

        Merci d'avance

        Laure
        1. Re,

          J'ai étudié ton fichier, il est possible d'écrire le code différemment pour gagner en rapidité.
          Par contre la feuille que tu envois est beaucoup trop lourde à cause des listes de validation qui couvre la totalité des plages H2 à M 65536 et Q2 à Q65536
          le code dans la propriété de la feuille Service pour coloriser les saisies OK et KO n'est pas une bonne idée, c'est un facteur de ralentissement lors de l'envoi et oblige le destinataire d'activer les macro pour qu'il soit opérationnel à condition que le niveau de sécurité soit réglé sur moyen. S'il est réglé sur élevé l'activation des macros ne sera pas proposé et donc le code ignoré.
          Mieux vaut passer avec une mise en forme conditionnelle classique. Il me reste deux trois choses à régler et je t'envoi une proposition
          1. Re,

            Autre chose, après expédition de ta feuille "Service" les cellules H2:M21 restent-elles toujours modifiables
            1. Bonsoir,

              Oui elles restent modifiables, c'est pour cela que je les ai déverrouillés avant de protéger la feuille dans ma macro Deverrouiller_cellule_Proteger_Feuille

              Pour les codes "à revoir" je les ai adaptés dans le dernier fichier que j'ai mis en ligne. Je pense que je n'ai pas fait d'erreurs.

              http://www.cijoint.fr/cjlink.php?file=cj201005/cijNGBgcXb.xls

              Elsie
          2. Re,

            - si c'est sur la feuille Service dois tu apporter des modifications après le transfert, si oui l'envoi doit être différé ou non ! je ne comprends pas de quelles modifications tu parles.-

            Tout simplement après avoir transféré les données via la macro Transfert_feuilles sur la feuille Service si j'ai bien tout compris tu vas apporter des modifications ou des compléments de saisise dans les colonnes E à Q, ensuite tu clic sur un bouton et là tu verrouilles la feuille et l'envoi, dans ce cas deux boutons 1 pour transférer ,coloriser et supprimer les lignes
            deuxième bouton pour verrouiller et expédier la feuille.
            Pour le mot de passe j'en mettrais un tout simple comme "Open" (Majuscule-minuscule) que tu changeras.

            Dans weekend je te regarde tout cela mais tous les codes sont à revoir vu que des pages ont été supprimées, ce n'est pas comme pour les formules qui s'actualisent automatiquement, un code est figé.

            pour la question 8, colonne E il y aura des adresse mail mais existe il des adresse en doublon !
            doit on envoyer à toutes les adresses ou seulement à ceux qui ont KO en H ou M

            A+
            Mike-31

            Une période d'échec est un moment rêvé pour semer les graines du savoir.
            1. Bonsoir,

              Je n'ai pas changé mes données. C'est les mêmes depuis le début.
              Les macros font ce que je voulais. Je ne savais pas que la mise en forme du fichier aller en bousiller certaines. Oui je glane des codes, je préférerais réussir à en faire ou à en adapter toute seule...mais je n'y arrive pas vraiment...

              Comment j'aimerai que mon fichier fonctionne.

              1/ depuis la feuille Test je sélectionne un service (une adresse y correspond automatiquement avec recherchev) et j'actionne le bouton

              2/ la feuille 4 n'est pas protégée à cette étape

              3/ les numéros sélectionnées (ie ceux du service sélectionnés) sont copiés sur la feuille 4 (la seule que j'ai conservé des feuilles 4 à 11 de la 1er version) macro : Transfert_feuilles

              3/ je sélectionne, grâce à la formule de C11 de la feuille Test, aléatoirement certains des numéros copiés sur la feuille 4 ;macro : colorisation

              4/ je supprime les lignes non coloriées (inutiles pour la suite)
              macro : Supprime_ligne_Sans_Couleur

              5/ j'efface la couleur sur ces lignes sélectionnées ;
              macro : Supression_Mise_En_Forme

              6/ je protège la feuille 4 seules les cellules de la plage ("E2:Q21") pourront être modifiées.
              Donc j'ai fait une macro pour déverrouiller les cellules de cette plage et ensuite protéger la feuille; macro : Deverrouiller_cellule_Proteger_Feuille

              7/ j'envois le la feuille 4 et je conserve une copie (si jamais je ne désire plus conserver de copie il me suffira de transformer « Kill chemin & "\" & nom » en commentaire, non ?); macro : Envoi_Feuille
              Mon pb à présent c'est que j'aimerai conserver la variation de couleur de la plage de cellule ("H2:M21") si OK en vert et KO en rouge. La macro le faisait, jusqu'à ce que je mette celle pour la protection de la feuille...et à présent j'ai ceci en jaune : cell.Font.ColorIndex = 50
              Je préférerai ne pas avoir à mettre une mise en forme conditionnelle sur chaque cellule...

              8/( nouvelle demande je l'avoue...) sur la feuille 4 je voudrai savoir s'il serait possible pour chaque ligne d'envoyer automatiquement un mail à une personne dont le nom serait dans la cellule E :
              - si sur une ligne x au moins une des cellules ("Hx:Mx") a pour valeur KO avec dans se mail les informations contenues dans la ligne ("Ax:Ox")
              - avec un autre recherchev à chaque nom correspondrait un mail...à moins qu'il soit possible de créer automatiquement des mails à partir de prénom+nom

              9/ oui je voudrai bien protéger la feuille 1

              - si c'est sur la feuille Service dois tu apporter des modifications après le transfert, si oui l'envoi doit être différé ou non ! je ne comprends pas de quelles modifications tu parles.- nombre de feuilles dans le classeur. Au total on en a 5 sur les feuilles analyse et contrôle il y aura d'autre tableau et des graphiques (je ne pense pas que ça va influer les macros.
              - quelle est la feuille qui servira à l'envoi Service ou contrôle ! J'envois service
              - Pour la colonne H avec OK ou KO pas de problème mais cette feuille est elle à l'origine verrouillée ou doit on la verrouiller pour l'envoi si c'est elle que l'on envoi, il serait judicieux de la verrouiller avec un mot de passe inclus dans le code, parce qu'avec une simple protection Outils/Protection le premier venu peut la ôter.
              si tu souhaites un mot de passe lequel (tu peux me faire parvenir en message privé). Au départ la feuill4 n'est pas verrouillée, dans mon fichier du post précédent c'est une erreur (quand je testais j'ai dû oublier de la déverrouiller ...
              C'est possible de mettre un mot de passe que je changerai par la suite ? si non je te communiquerai celui que j'aimerai par email.


              Encore merci pour le temps que tu accordes à mon problème.

              Elsie
              1. Re,

                si tu changes constamment tes données, il faut revoir tous les codes et cela pour rien alors que c'est le boulot pour lequel tu es payé.
                J'ai l'impression que tu glanes des codes sur les forums et que tu essayes de les adapter ou de te les faires adapter.
                Je te propose de bien réfléchir à ton problème et donner des indications bien arrêtées, nous sommes bénévoles, pas toi

                Comment veux-tu faire fonctionner ton fichier
                1/ depuis la feuille Test tu sélectionnes un service, une adresse mail et tu actionnes le bouton
                2/ les numéros sélectionnées sont copiés sur quelle feuille !
                3/ si c'est sur la feuille Service dois tu apporter des modifications après le transfert, si oui l'envoi doit être différé ou non !
                4/ nombre de feuilles dans le classeur !
                5/ quelle est la feuille qui servira à l'envoi Service ou contrôle !
                6/ Pour la colonne H avec OK ou KO pas de problème mais cette feuille est elle à l'origine verrouillée ou doit on la verrouiller pour l'envoi si c'est elle que l'on envoi, il serait judicieux de la verrouiller avec un mot de passe inclus dans le code, parce qu'avec une simple protection Outils/Protection le premier venu peut la ôter.
                si tu souhaites un mot de passe lequel (tu peux me faire parvenir en message privé).
                1. Bonjour Mike,

                  Merci beaucoup pour ton aide !!

                  Je me suis rendu compte que je n'avais pas besoin d'autant de feuille du coup j'ai modifié le fichier. http://www.cijoint.fr/cjlink.php?file=cj201005/cijdSOUpR9.xls

                  J'ai mis dans les propriétés de la feuille 4 une macro afin que lorsqu'OK est sélectionné il se mette en vert et KO en rouge. Elle fonctionnait jusqu'à ce que j'ajoute une autre macro afin de protéger la feuille avant son envoi. Elle me met cette ligne en jaune :
                  cell.Font.ColorIndex = 50

                  Je ne sais pas quoi modifier dans cette macro :

                  Je sais qu'on peut utiliser la mise en forme conditionnelle, mais dans ce cas qu'écrire afin de mettre en forme directement toute la plage ("H2:M21"). Ou est obligé de le faire cellule par cellule ?

                  Merci d'avance.

                  Elsie
                  1. Salut,

                    Ce matin j'ai trové un peu de temps, regarde le fichier joint.

                    sur la feuille test de L4 à L11 et plus si besoin(faudra revoir le liste de validation) saisir les adresse mail de contact.
                    Cette feuille mériterait d'être verrouillée seul les cellules C2 et C4 accèssibles de même les colonnes H à M masquées.

                    Avant de terminer ce projet, compléter les codes avec un détrompeur d'erreur GOTO

                    https://www.cjoint.com/?funPTvljNl
                    1. Bonjour Mike,

                      Oui pour le vbCrL Pijaku me l'avais proposé hier...j'avais du faire une erreur en utilisant...

                      Voici mon dernier fichier : https://www.cjoint.com/?ftkyrSlmhs

                      J'aimerai masquer les feuilles 4 à 11, mais là les macros ne fonctionnement plus correctement sauf completer_feuilles ?!?

                      Aussi ensuite j'aimerai bloquer certaines cellules, je ne sais pas si cela va bousiller les macros.

                      J'aimerai en fait que lors de l'exécution de la macro Traitement, le fichier reste ouvert sur la feuille 1. L'utilisateur verra le détail du fichier envoyé en cliquant sur un autre bouton qui affichera la feuille x (x variant de 4 à 11).

                      Non l'adresse du destinataire varie en fonction de la feuille, là j'ai 8 emails mais cela pourrait changer. Non je ne souhaite pas nécessairement archiver les derniers envois, vu que je les aurais déjà dans mon mail.

                      Ça serait vraiment très très très gentil de ta part de modifier les macros dans ce sens

                      Elsie
                      1. Mince, les copies des feuilles x (4 à 11) ne conserve pas la mise en forme(validation de donnée) que j'ai crée dans mon fichier.... que faire?
                    2. Salut,

                      la syntaxe de retour paragraphe est vbCrL

                      myItem.Body = "Bonjour" & vbCrLf & vbCrLf & vbCrLf & "Vous trouverez ci-joint le tableau de Contrôle Aléatoire des NBPORT pour votre service." & vbCrLf & "Merci de bien vouloir me faire un retour avec vos corrections." & vbCrLf & "Cordialement," & vbCrLf & vbCrLf & vbCrLf & "Elsie."

                      Dès que j'ai un moment, j'apporte une petite modif au code de notre ami Pijaku et t'envoi un exemple.
                      Si l'adresse mail pour l'envoi de tes mails est unique il est possible de l'intégrer dans le code et la supprimer de la cellule M1 ce qui évitera des lien inutiles.
                      D'autre part le code génére un fichier dans le même répertoire est il nécessaire ou souhaites tu archiver le ou les derniers envoi
                      1. Re Bonjour Mike, Pijaku,

                        Avec votre aide j'en suis là :

                        https://www.cjoint.com/?fspJdiUHq1

                        Le problème c'est ce que la macro "Envoyer_Fichier" ne me permet pas de mettre en forme mon message. Il me l'écrit tout à la suite.

                        J'obtien ceci : Bonjour,Vous trouverez ci-joint le tableau de Contrôle pour votre service.Merci de bien vouloir me faire un retour avec vos corrections.Cordialement, Elsie

                        Au lieu de ceci :

                        Bonjour,

                        Vous trouverez ci-joint le tableau de Contrôle pour votre service.
                        Merci de bien vouloir me faire un retour avec vos corrections.

                        Cordialement,

                        Elsie


                        Le message texte et le fichier sont envoyé via outlook.

                        Function Envoyer_Fichier()
                        Dim y, chemin, nom As String
                        Dim x As Integer
                        Dim ol As Object, myItem As Object
                        chemin = ActiveWorkbook.Path
                        y = Sheets(1).Range("M1").Value
                        x = Sheets(1).Range("K1").Value
                        nom = "Contrôle Aléatoire du Service " & Sheets(x).Name
                        ThisWorkbook.Sheets(x).Copy
                        ActiveWorkbook.SaveAs chemin & "\" & nom
                        Set ol = CreateObject("outlook.application")
                        Set myItem = ol.CreateItem(olMailItem)
                        myItem.To = y
                        myItem.Subject = "Contrôle Aléatoire des NBPORT"
                        myItem.Body = "Bonjour, " & "" & "Vous trouverez ci-joint le tableau de Contrôle Aléatoire des NBPORT pour votre service. " & "" _
                        & "Merci de bien vouloir me faire un retour avec vos corrections. " & "" & "Cordialement, " & "" & "Votre CSO. "
                        myItem.Attachments.Add ActiveWorkbook.FullName
                        myItem.Send
                        Set ol = Nothing
                        ActiveWorkbook.Close
                        End Function
                        1. Modérateur
                          as tu essayé ma dernière solution dans l'autre sujet???
                          @ Mike : je m'en doutais... C'est avec Outlook, il me semble.
                      2. Salut Pijaku,

                        Ce genre de lecture n'est pas ma tasse de thé, c'est pour cela que je pose souvent des questions déjà posé et noyées dans le flot des posts.

                        Sais tu, pour la messagerie, Outlook ou Outlook Express

                        Cordialement
                        1. Re,

                          Avec Function SendMail()
                          que veux tu envoyer le classeur ou simplement la feuille sélectionnée après le filtrage !

                          y = Sheets(1).Range("M1").Value
                          en M1 qu'as tu !

                          x = Sheets(1).Range("K1").Value
                          en K1 tu avais une valeur qui tu permettait d'utiliser la RECHERCHEV

                          sans me donner l'adresse, ou veux tu expédier, à une adresse fixe saisie dans le code ou dans une cellule ou encore à saisir avant l'envoi !

                          que veux tu expédier uniquement la feuille issue de la sélection (Ex. si en D4 tu sélectionnes 10, tu veux envoyer la feuille 1010) ou copier le contenu de cette feuille dans ton mail

                          Avec quelle messagerie veux tu expédier, Outlook, Outlook express, Incredimail, ...

                          A+
                          Mike-31

                          Une période d'échec est un moment rêvé pour semer les graines du savoir.
                          1. Modérateur
                            Salut Mike,
                            Je reviens sur ce sujet.
                            En fait pour le mail, Elsie ne veux envoyer qu'une feuille (celle dont le n° apparait en K1) par Outlook.
                            On a déjà pas mal avancé sur ce sujet mais là je bloque....

                            Remarque : je ne sais pas si tu auras le courage de lire toute notre discussion...
                            Bonne journée à toi en tout cas.
                        2. Bonjour,

                          la macro sendmail afin d'envoyer la feuille choisie est la suivante

                          Function SendMail()
                          Dim y As String
                          Dim x As Integer
                          y = Sheets(1).Range("M1").Value
                          x = Sheets(1).Range("K1").Value
                          ' Copy the sheet(1)
                          ThisWorkbook.Sheets(x).Copy
                          ' Send Email
                          With ActiveWorkbook
                          .SendMail Recipients:=y, Subject:="test" & Format(Date, "dd/mmm/yy")
                          .Close SaveChanges:=False
                          End With
                          End Function

                          j'ai donc ceci sur les propriétés de la feuille 1:

                          Private Sub Worksheet_Change(ByVal Target As Range)
                          Call completer_feuilles
                          Call colorisation
                          Call Supprimer_ligne_inutile
                          Call SendMail
                          End Sub

                          je voudrai que cette macro se déclenche uniquement quand la cellule D4 est modifiée.

                          Merci d'avance.

                          Elsie
                          1. Re,

                            Si tu travailles sur mon fichier, j'ai intégré les codes à la fin de la première macro.

                            dans la propriétés de la feuille Test (SendMail qui est censé faire quoi)

                            Private Sub Worksheet_Change(ByVal Target As Range)
                            Call completer_feuilles
                            Call SendMail
                            End Sub

                            Pour les barres de défilement, il n'est peut être pas nécessaire de conserver la barre progressive et dégressive ainsi que les % de progressions et dégressifs. Suivant le cas il faudra peut être compléter avec une conditionnelle
                            Ces barres ne fonctionnent que si la fonction Application.ScreenUpdating n'est pas utilisée en début et evidemment en fin de procédure
                            1. Re,

                              Super les bandes pour attendre !

                              Encore une chose...

                              La macro de la Feuil1 s'exécute lorsqu'une valeur change sur la feuille « Test », que dois-je modifier pour que ce soit uniquement la modification de la cellule D4 qui exécute la macro.

                              Sur propriété de la feuille 1 j'ai la macro ci-dessous qui regroupe toute les autres :

                              Private Sub Worksheet_Change(ByVal Target As Range)
                              Call completer_feuilles
                              Call colorisation
                              Call Supprimer_ligne_inutile
                              Call SendMail
                              End Sub

                              Merci d'avance

                              Elsie
                              • 1
                              • 2