Requête macros

Bonjour,

je vous joins un fichier afin de mieux vous faire comprendre mes besoins,
dans un fichiers je vais avoir entre 20 000 à 30 000 lignes qui seront sur une feuille, ou il y a une colonne département et d'autre colonnes, il faudrait que la requête soit la suivante à chaque fois que l'on trouve un nouveau département il faut ouvrir une feuille avec le nom du département et copier la ligne entière, évidemment si le département existe déjà, il faut copier la nouvelle ligne de " global" à la suite des autres sur les autres sur la feuille du même nom
Cordialement merci

http://www.cjoint.com/confirm.php?cjoint=EEvugtzJNrF

23 réponses

Résumé de la discussion

La discussion porte sur une macro Excel qui, à partir d'un fichier de 20 000 à 30 000 lignes avec une colonne département, crée une feuille par département et y copie chaque ligne. Si le département existe déjà, la macro doit ajouter la nouvelle ligne à la suite sur la feuille correspondante et conserver l'ordre d'arrivée des lignes. Plusieurs répondants évoquent des solutions via des tests d'existence de feuille, des modifications dans l'ouverture du fichier et l'utilisation de CurrentRegion pour copier le contenu. En dernier lieu, les propositions divergent sur le mécanisme idéal: exécuter la macro à l'ouverture, purger les feuilles ou traiter les mises à jour nocturnes sans perte de données.

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

    Super que ça marche comme tu veux.
    A titre d'info, sur un gros fichier ça donne quoi au niveau du temps ?
    Tu as pris la dernière version du 24 mai 15h14 ?

    Si c'est fini, merci de mettre le sujet à résolu (en haut à droite de ton premier message)

    et 1600 élèves qui ne peuvent pas passer un partiel,
    C'est à Toulouse ça non ?
    En tout cas, vive CELCAT

    Bonne fin de journée
    0
    1. J'ai encore un doute
      Dans la feuille 1, il est censé y avoir un filtre en ligne 1
      Si le fichier de base n'en a pas, ça va planter
      Donc question ? Est ce que la maj de la feuille 1 conserve le filtre ?

      La version suivante part sur une feuille 1 avec ou sans filtre en ligne 1
      (la procédure RAZ chargée de supprimer les éventuelle feuilles département au démarrage supprime aussi le filtre s'il y en a un)
      https://www.cjoint.com/?3Eypxxq3iH9
      0
      1. bonjour,

        j'ai mis du temps à te répondre un grand "couac" à la Fac et 1600 élèves qui ne peuvent pas passer un partiel, bref j'ai essayé hier de mettre en branle tout ce que tu as fait et c'est un petit bijoux, sans failles...donc on change rien et encore merci
        Cordialement
        0
    2. La version commentée
      https://www.cjoint.com/?3ExuCsodlUI
      RQ1. J'ai modifié un bug dans la fonction FeuilleExiste (on n'est jamais tombé dessus)
      RQ2. Comme on supprime les feuilles département, le test avec FeuilleExiste n'a plus d'utilité. Je me suis contenté de l'inhiber.
      Je n'ai pas supprimé le code de la fonction FeuilleExiste, ça peut rendre service.
      RQ3. Dans l'EN, à l'époque, j'ai travaillé à partir du FEM .... en bon vieux basic, puis GEP en Dbase !

      Bonne chance
      0
      1. Je ne sais pas si tu vas me croire, j'ai fait les applications à l'époque pour pouvoir faire les pré-inscriptions sur les minitels, j'ai tout mis en place, le rectorat et l'académie touchaient les dividendes (des P et T) moi nada, j'ai quand même un grade d'ingénieur informaticienne mais en programmation sur "ACCESS".
        De nos jours c'est fini l'E.N. signe des contrats avec des marchands de logiciels et nous perdons tous nos acquis, et personne n'est capable de résoudre les problèmes tel que celui la, et quand tu t'adresse à CELCAT il te bousille des colonnes mais sont bons pour rien d'autre...voila en quelques mots ce que représente le service informatique d'une université d'une des plus grandes ville de France...il est heureux qu'il reste encore des gens comme vous qui dominez l'outil informatique " EXCEL"
        Cordialement
        Bon W.E et merci
        0
        1. J'ai encore comme un léger doute mais bon, si mardi ça coince tu dis

          L'idée serait d'ouvrir le fichier de données (sans macro celui là) via un bouton par exemple, depuis un autre ficher maitre (lui)

          RQ1. Maitre c'est (un peu) exagéré
          RQ2. Au fait, dans ton rectorat, on ne peut pas te fournir la bête qui fait tout ça :-) ?

          Donc on ferme jusqu'à (peut être) mardi

          Cdlmnt
          0
          1. Maitre , car je peux t'appeler maitre, tu as saisi mes mauvaises explications, mais c'est super comme boulot
            Alors la mise à jour du fichier la "Feuille1" c'est une liaison ODBC avec serveur (SQL server 2008
            Sur le poste de travail je garde le fichier que tu viens de me faire , je pends le fichier du serveur il y a un pont entre les deux, ce qui fait que je garde la structure du fichier que tu m' as fait, seul change les données de la feuille .
            Du fait que j'ai mis une ouverture programmée, qui ne touche que les données de la feuille 1, donc en clair, ma "feuille 1" conserve toutes les structures (colonnes et macros que tu viens de faire) seul changement les données a partir de la ligne 2 de la "feuille1"

            je peux te dire " merci l'artiste" un grand merci

            (oui parlons en de l'EN....vivement la retraite....hihihihi)
            0
            1. A chaque ouverture, celui-là supprime toutes les feuilles du classeur sauf Feuil1
              J'ai supprimé la feuille Explications
              https://www.cjoint.com/?3ExsC0SgoFq
              Tu testes : soit
              1. tu ouvres
              2. tu supprimes un departement dans Feuil1
              3. tu enregistres et tu fermes
              4. tu re-ouvres
              Est ce que ça correspond à ce que tu veux

              MAIS, il y en aura encore un
              Ce fichier lorsqu'il est "mis à jour" la nuit par l'académie (vive l'EN en passant)
              Option1. Est ce qu'il est supprimé et recréé, si oui, les macros vont disparaitre, pas terrible
              Option 2. Est ce qu'il est simplement modifié, si oui, l'exécution des macros à l'ouverture (de nuit) vont peut être pose problème. Il y a des solutions
              0
              1. je sais pas, je crois que je m'exprime mal
                le fichier que tu m'envoi il est ok, super, à l'ouverture sans "clic" il met le temps de réaction (0.00632) et j'ai les feuilles de départment avec les lignes;
                Mais mardi quand je serais en réelle, j'aurais une tout autre "Feuille1" car toutes ces lignes vont être rectifié dans la journée et ainsi de suite chaque matin, et il y auras de nouvelles lignes de fausses avec de nouveaux "departments", alors la je pose la question est ce que les feuilles des "départments" existant disparaitrons pour laisser la place aux nouvelles feuilles et aux nouvelles lignes, c'est la mon soucis
                Car non le fichier est ouvert une fois le matin et il n'est pas ré-ouvert jusqu'au lendemain matin.

                Si tu penses que ca marcheras dans le sens ou je te le dis
                il ne faut rien toucher et il me reste à te remercier grandement de tout le temps que je t'ai fais perdre et de tous les soucis que je t'ai donné

                Grand Merci
                0
                1. Je ne comprends pas bien ce que tu as fait
                  1. Qu'est ce que donne celui là à l'ouverture ?
                  https://www.cjoint.com/?3ExrHhPMscL
                  2. Tu ne m'avais pas dit que le fichier pouvait être ré-ouvert dans la journée. Dans ce cas que faut il faire ?
                  0
                  1. il n'y a pas de mais, mais il y a un mais je dois enlever les (parenthèses) et OK pour que ca marche, sinon j'ai un message d'erreur, d'autre part
                    l'application ne se lance pas à l'ouverture; je dois cliquer sur ctrl+k
                    d'autre part si par exemple j'enlève les ligne d' un department' que je sauvegarde, que je ferme et que je relance la feuille du "department" reste crée avec les lignes que j'ai eraser et alors qu'il n'y a plus de ligne, d'où l'intérêt de faire un "rase" à la fermeture du fichier, et de relancer l'application à l'ouverture du fichier et comme je te demandais en automatique si possible

                    euhhhh est ce possible

                    merci
                    0
                    1. Bon

                      On va faire simple
                      https://www.cjoint.com/?3ExrdCikkiQ

                      Ce fichier ne contient que la feuille 1
                      Alt-F11 pour passer dans l'éditeur vba
                      dans le module Workbook,
                      procedure Workbook_Open() il y a un apostrophe devant Call OK
                      tu l'enlèves (l'apostrophe) pour activer la ligne
                      tu enregistre le fichier et tu le ferme
                      tu le rouvre
                      ça devrait fonctionner

                      RQ1. la procédure procedure Workbook_Open() comme son nom l'indique, s'exécute automatiquement à l'ouverture du fichier
                      ....
                      MAIS, car je sens qu'il va y avoir un mais ...
                      0
                      1. regarde mon changement en message 10 dis moi si ca vas
                        .Rows(lideb - 1).AutoFilter Field:=coDpt, Criteria1:=nf
                        .Cells(1, 1).CurrentRegion.Cpy Sheets(nf).Cells(1.1)
                        Next nudpt

                        par contre dans le Workbook j'ai mis cela:dans la feuille général
                        Option Explicit
                        Private Sub Wordbook_Open()Call OK
                        End Sub
                        et ca marche pas
                        erreur de compilation attendu fin d instruction

                        tu ne m'as pas dit si on peut faire la mise a jour sans clic ou sans faire ctrl+k

                        merci
                        0
                        1. je veux bien voir un code commenté

                          merci à toi

                          bon week end et merci pour tout
                          0
                          1. Ouf, j'ai eu peur ;-)
                            Si tu veux un code commenté pour voir comment ça marche tu dis

                            Bon week end
                            0
                            1. 1.1 OUI ca veux dire qu'un module toutes les nuits prends les saisies et les vérifies et crée une nouvelle feuille qui n'a rien à voir avec celle de la veille
                              1.2 et oui en effet il n'y a qu'une feuille "Feuille 1" en effet mis à jour n'est pas le bon terme, il faut dire qu'il y a une création d'un état des erreurs constaté par le module d'où le fait de créer à l'ouverture un nouveau fichier avec les feuilles "departments"
                              Pour le reste ok je vais bosser pour essayer de faire ce que tu me dis
                              et je te tiens compte de ce que je peux faire...merci à toi cela me permet de comprendre un peu mieux .
                              @ bientôt de te lire
                              0
                              1. Ah, tu ne m'avais pas tout dit !

                                1. ce fichier fluctue, c'est un fichier qui signales les erreurs de saisie des opératrices, lorsqu'il y en as évidemment, donc il peut faire 20 000 lignes comme il peut faire 0 lignes si les opératrices n'ont pas fais d'erreurs, d'où la nécessité de purger les feuilles "département" lorsqu'elle n'existe plus dans la "feuille 1".
                                Est ce que ça veut dire que
                                1.1. que chaque matin, un nouveau fichier arrive (qui n'a rien à voir avec celui du jour précédent) : c'est à dire qu'il n'est pas censé compléter le fichier précédent
                                1.2. Ce fichier ne contient que la feuille "Feuil1" avec la liste des données et surtout aucune feuille département
                                1.3. A partir de ce fichier tout neuf à une seule feuille, tu veux ventiler les données dans les feuilles département : il n'y aura de créé que les feuilles dont le département figure dans la colonne département de la Feuil1 : donc pas besoin de purger les feuilles département non concernées ce jour là puisqu'elles ne seront pas dans ce fichier
                                2. Pour résumer il faut savoir que ce fichier est donc mis à jour par un serveur qui tourne la nuit
                                "mis à jour" n'est alors, au sens du 1.1, pas le bon terme, ce ficher est recréé chaque nuit
                                3. l'idéal comme je te disais c'est que la macro se lance à l'ouverture du fichier pour mise à jour à l'ouverture sans clic
                                Tu vas bosser un peu
                                Dans l'éditeur vba (Alt-F11) puis dans la fenêtre de gauche (liste des modules)
                                3.1. tu clic-clic sur le module ThisWorkbook
                                3.1. dans la fenêtre horizontale du milieu (en haut), il y a marqué Général. Tu déroules et sélectionnes Workbook
                                Si tu ne vois pas Workbook, pas de panique tu recommences depuis 3.1.
                                L'éditeur te propose alors d'écrire la procédure Workbook_Open
                                tu la complètes par un appel à la procédure OK, comme ça
                                Private Sub Workbook_Open()
                                Call OK
                                End Sub
                                3.4. Lorsque tu ouvres un fichier contenant des macros, par défaut, Excel te met en niveau de sécurité Moyen, ce qui fait apparaitre une fenêtre te demandant l'autorisation d'exécuter les macros. Si tu veux la court-circuiter. Outils/Macros/Securité et tu choisis l'option Faible
                                4. Hier en prenant 12000 lignes (environ) nous avons mis un peu moins de 10 secondes, c'est très bien
                                As tu bien fait les modifications du message 10 ?
                                RQ. Remplacer la ligne
                                '.Cells.Copy Sheets(nf).Cells(1, 1)
                                par celle ci
                                .Cells(1, 1).CurrentRegion.Copy Sheets(nf).Cells(1, 1)

                                Comme tu vois j'ai un (au moins) doute, si je suis à côté de la plaque (points 1 et 2), tu dis et re-expliques

                                Cdlmnt
                                0
                                1. OK, je vais te faire bosser un peu

                                  tu ajoutes les lignes soulignées
                                  1. ici au début du code
                                  Const lideb = 2
                                  Const coSem = 5

                                  2. et ici vers la fin de la procedure
                                  .Rows(lideb - 1).AutoFilter Field:=coDpt, Criteria1:=nf
                                  .Cells(1, 1).CurrentRegion.Copy Sheets(nf).Cells(1, 1)
                                  Sheets(nf).Columns(coSem).Delete

                                  Tu n'as pas répondu à cette question
                                  Question. Les données de la feuille Feuil1 vont elles toujours en augmentant, c'est ce que j'ai supposé, sinon il faut prévoir le nettoyage des feuilles de département

                                  Bonne fin de journée
                                  0
                                  1. Quelques précisions
                                    1. Testes bien la macro avant de l'appliquer au vrai fichier
                                    2. Dans le vrai fichier : Alt-F11 pour accéder à l'éditeur vba, puis Insertion/Module et tu copies tout le code. Tu modifies éventuellement la valeur de la constante FS avec le nom de la feuille où s'empilent les données

                                    Option Explicit

                                    Const FS = "Feuil1"
                                    Const coDpt = 9

                                    3. Il faudra me dire comment tu comptes lancer la macro (raccourci clavier comme j'ai fait, un bouton, un clic-clic dans une cellule, ...)
                                    4. Si tout va bien, peux tu m'indiquer le temps mis par la macro pour s'exécuter dans le vrai fichier (donnes moi aussi son nombre de lignes)

                                    Cdlmnt
                                    0
                                  2. @ccm81bonjour,

                                    vais te répondre :
                                    ce fichier fluctue, c'est un fichier qui signales les erreurs de saisie des opératrices, lorsqu'il y en as évidemment, donc il peut faire 20 000 lignes comme il peut faire 0 lignes si les opératrices n'ont pas fais d'erreurs, d'où la nécessité de purger les feuilles "départment" lorsqu'elle n'existe plus dans la "feuille 1".
                                    Tu comprendras qu'une feuille peut disparaître un jour et revenir le lendemain si l'opératrice à fait des erreurs de saisie, mais disons que nous naviguons toujours avec environ 5000 lignes, nous avons eu des pointes plus hautes, mais rarement en dessous de 1000.
                                    Pour résumer il faut savoir que ce fichier est donc mis à jour par un serveur qui tourne la nuit, et que l'idéal serait: comme je vais le mettre dans les taches planifiés pour ouverture vers 6 heures du matin, donc l'idéal comme je te disais c'est que la macro se lance à l'ouverture du fichier pour mise à jour à l'ouverture sans clic et donc qu'il balaie toute la "feuille 1 de la 1ère à la dernière ligne en se recréant à chaque ouverture (peut-être une utopie ce que je te dis ?)
                                    Hier en prenant 12000 lignes (environ) nous avons mis un peu moins de 10 secondes, c'est très bien
                                    Voila je ne sais comment te dire merci .
                                    PS j'ai fais les changements en suivant tes directives et j'y suis arrivée.
                                    mille merci
                                    0
                                2. encore merci pour ta réponse rapide, tu tires plus vite que ton ombre
                                  Bravo et merci mille fois
                                  Bien compris pour le primo, vais le faire de suite .
                                  pour la colonne, elle est renseigné à l'origine, mais comme c'est l'inspection académique, je suis obligé de la recevoir mais je n'en ai pas besoin sur les feuilles donc il faut la supprimé lors des copies sur les feuilles
                                  Mille merci à toi
                                  0
                                  1. 1. primo je ne sais pas changer les lignes
                                    Alt-F11, tu vas dans le Module 1
                                    tu met un apostrophe ' devant la ligne à supprimer
                                    tu insères une ligne après elle
                                    tu colles la ligne remplaçante
                                    2. deuxio est ce qu'il y a une possibilités que la colonne semaine de la feuille 1 ne soit pas recopié
                                    cette colonne semaine tu veux la conserver vide ou bien carrément la supprimer
                                    0
                                    1. BONSOIR

                                      merci pour tout ce que tu fais pour moi, il y a un petit problème, primo je ne sais pas changer les lignes, deuxio est ce qu'il y a une possibilités que la colonne semaine de la feuille 1 ne soit pas recopié
                                      par avance merci
                                      0
                                      • 1
                                      • 2