Macro compliquée

Résolu
Bonjour,

J'ai un document excel assez compliqué et je bloque sur une macro.

J'ai plusieurs feuilles comportant la même trame mais avec des noms différents et une feuille (que l'on appellera "feuille finale" qui reprend certaines données de toute ces feuille.

Une macro me permet, grâce à une userform, d'insérer des données dans la première ligne vide de la feuille de mon choix.

Je cherche à y associer une macro qui reprenne les valeurs de cette ligne et la colle dans ma "feuille finale".
Jusque là pas de souci.
Sauf que ma feuille finale comprend une ligne "titre" pour chaque feuille de mon classeur.
Comment faire en sorte que les données enregistrées s'incrémentent dans la ligne en dessous de la ligne "titre" correspondant à la feuille remplie?

Exemple

"Feuille 1 ligne 1"
Lieu1 Situation1 Risque1

"Feuille 2 ligne 1"
Lieu2 Situation2 Risque2

"Feuille Finale"
Feuille1
Lieu1 Risque1

Feuille 2
Lieu2 Risque2

Quand jenregistre de nouvelles données sur la feuille1 grâce à ma userform je veux arriver à

"Feuille Finale"

"Feuille Finale"
Feuille1
Lieu1 Risque1
Lieu3 Risque3

Feuille 2
Lieu2 Risque2

Comment faire en sorte que mes données se mettent avant le titre "Feuille2" ?

--
Après Open Office essayez Opin Offece :P
Configuration: ...

21 réponses

Résumé de la discussion

Plusieurs feuilles suivent une trame commune et une feuille finale regroupe les données; une macro remplit la première ligne vide via une userform et transfère les données. Plusieurs répondants préconisent d’utiliser Find pour repérer le titre dans la feuille finale, puis d’insérer une ligne et copier-coller toute la ligne enregistrée dans cette position. Des échanges expliquent comment calculer la ligne cible trouvée par Find, insérer une nouvelle ligne et coller les valeurs de la ligne source, malgré les soucis de fusion. En l’état, les propositions varient et des échanges demandent du code, sans consensus clair, notamment lorsque titres et cellules fusionnées compliquent l’alignement des données, ce qui ralentit la progression.

Bobot (l’IA à votre service)
  1. Bonjour,
    Une petite question : comment sont ajoutées tes données sur Feuille 1 ? (macro, manuellement, )

    Pour comment faire, je pense que tu recherches la dernière ligne inscrite sous Feuille 1 dans Feuille finale, tu insères une ligne et tu copies tes données.
    0
    1. Elles y sont insérées par macro.
      exemple:
      Range("a65536").End(xlUp).Offset(1, 0) = textbox1.value

      Quelle est la macro permettant de rechercher la ligne en dessous de ma ligne "Feuille 1" et d'y insérer une nouvelle ligne? Sachant que ma ligne "feuille 1" est composée de plusieurs cellules fusionnées
      0
      1. Modérateur
        Salut,
        Tu peux trouver cette ligne grâce à la fonction find (tu recherches Feuille1 par exemple) un exemple ici pas très récent...
        0
        1. Re,

          Bon ben je n'arrive pas à adapter son code pour réaliser le mien (et oui je suis une vraie bille).

          Un peu d'aide ne serait pas de refus si tu as le temps.

          Merci d'avance
          0
          1. Modérateur
            Salut Farfadet,
            Petite question :
            ta feuille "finale" est construite sur ce modèle :
            feuille 1
            des données
            des données
            <une ligne vide>
            feuille 2
            des données
            des données
            des données
            <une ligne vide>
            feuille 3
            etc...
            Avec systématiquement une ligne vide entre les données de la feuille précédente et le nom "feuille x"?
            0
        2. Non.

          Au tout début de l'utilisation j'ai:

          Feuille1
          Feuille2
          Feuille3.
          ...

          Et par la suite je veux obtenir

          Feuille1
          Données
          Données
          Données
          Données
          Feuille2
          Données
          Données
          Feuille3
          Données

          Sachant que les cases "feuille" sont composées de plusieurs cases fusionnées. Ce sont en quelques sortes des cases "titre"

          0
          1. Modérateur
            Voilà déjà la bonne syntaxe pour la méthode find :
            Dim donnee As String, numlig As String
            donnee = ActiveSheet.Name
            numlig = Sheets("Feuille finale").Cells.Find(What:=donnee, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlNext).Row


            numlig te renvoie donc le numéro de ligne ou l'on trouve ton nom de feuille (feuille 1) sur la feuille finale

            Reste à copier / coller ta ligne.
            Pour le "copier" pas de souci, je suppose que tu copies la dernière ligne saisie et donc la dernière ligne non vide :
            Sheets("Feuille 1").Range("A65536").End(xlUp).EntireRow.Copy

            Par contre le "coller" pose problème. Le plus simple est de coller chaque nouvelle ligne juste sous la ligne de titre dans la feuille finale. Ton code complet donnerait ceci :

            Dim donnee As String, numlig As String
            'ton code ici
            donnee = ActiveSheet.Name
            numlig = Sheets("Feuille finale").Cells.Find(What:=donnee, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlNext).Row
            Sheets("Feuille finale").Range("A" & numlig).Offset(1, 0).EntireRow.Insert Shift:=xlDown
            ActiveSheet.Range("A65536").End(xlUp).EntireRow.Copy Sheets("Feuille finale").Range("A" & numlig).Offset(1, 0)

            0
        3. Erf ça a marché un moment dans un classeur de test mais ça ne marche pas dans mon vrai classeur

          La macro m'insère une ligne sous celle recherchée et me colle le nom de cette ligne et non les valeurs de la ligne située en fin de tableau
          0
          1. Modérateur
            Donne nous ton code, se sera plus simple de le corriger...
            Quand tu EDIT un message signale le car on ne le vois pas dans "mes interventions"...
            0
        4. If Sheets("données").Range("m1") = "Administratif" Then
          Sheets("Administratif").Select
          Range("a65536").End(xlUp).Offset(1, 0) = Sheets("données").Range("n1")
          Range("b65536").End(xlUp).Offset(1, 0) = Sheets("données").Range("o1")
          Sheets("données").Range("l1").Copy
          Range("c65536").End(xlUp).Offset(1, 0).Select
          ActiveCell.PasteSpecial
          If ActiveCell.Value = "Photo" Then ActiveCell.Comment.Visible = False
          Range("d65536").End(xlUp).Offset(1, 0) = Sheets("données").Range("p1").Value
          Range("e65536").End(xlUp).Offset(1, 0) = Sheets("données").Range("q1").Value
          Range("f65536").End(xlUp).Offset(1, 0) = Sheets("données").Range("r1").Value
          Range("g65536").End(xlUp).Offset(1, 0) = Sheets("données").Range("w1").Value
          Range("i65536").End(xlUp).Offset(1, 0) = Sheets("données").Range("t1").Value
          Range("j65536").End(xlUp).Offset(1, 0) = Sheets("données").Range("w1").Value
          Range("m65536").End(xlUp).Offset(1, 0) = Sheets("données").Range("u1").Value
          Range("h65536").End(xlUp).Offset(1, 0) = Sheets("données").Range("s1").Value
          Range("k65536").End(xlUp).Offset(1, 0) = Sheets("données").Range("x1").Value
          Range("l65536").End(xlUp).Offset(1, 0) = Sheets("données").Range("y1").Value

          Sheets("suivi").Select
          Range("a65536").End(xlUp).Offset(1, 0) = Sheets("données").Range("m1")
          Range("b65536").End(xlUp).Offset(1, 0) = Sheets("données").Range("n1")
          Range("c65536").End(xlUp).Offset(1, 0) = Sheets("données").Range("o1")
          Range("d65536").End(xlUp).Offset(1, 0) = Sheets("données").Range("x1")
          Range("e65536").End(xlUp).Offset(1, 0) = Sheets("données").Range("u1")

          Dim donnee As String, numlig As String
          donnee = ActiveSheet.Name
          numlig = Sheets("suivi").Cells.Find(What:="administratif", LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlNext).Row
          Sheets("suivi").Range("A" & numlig).Offset(1, 0).EntireRow.Insert Shift:=xlDown
          Sheets("suivi").Range("A65536").End(xlUp).EntireRow.Cut Sheets("suivi").Range("A" & numlig).Offset(1, 0)

          End If
          0
          1. Modérateur
            Tu écris :

            Sheets("suivi").Range("A65536").End(xlUp).EntireRow.Cut Sheets("suivi").Range("A" & numlig).Offset(1, 0)


            ce code coupe la dernière ligne saisie en feuille suivi pour la coller en feuille suivi sue la ligne sous le titre. C'est donc bien cela...
            Je ne vois pas d'erreur.
            Par contre,
            Dim donnee As String
            donnee = ActiveSheet.Name 
            ne servent à rien
            0
            1. Là est bien le souci
              Le code est bon mais la macro exécutée ne correspond pas à ce qui se passe...
              Les mystères d'excel
              0
              1. Modérateur
                essaie de rajouter ".value" à ces lignes :
                Sheets("suivi").Select
                Range("a65536").End(xlUp).Offset(1, 0) = Sheets("données").Range("m1").value
                Range("b65536").End(xlUp).Offset(1, 0) = Sheets("données").Range("n1").value
                etc etc
                0
                1. Toujours le même problème
                  0
                  1. Modérateur
                    Déjà change :
                    Dim numlig as string
                    par :
                    Dim numlig As Integer

                    et change :
                    Sheets("suivi").Range("A65536").End(xlUp).EntireRow.Cut Sheets("suivi").Range("A" & numlig).Offset(1, 0)

                    par
                    Sheets("suivi").Range("A65536").End(xlUp).EntireRow.Cut Range("A" & numlig).Offset(1, 0)
                    0
                    1. C'est fait

                      toujours le même résultat
                      0
                      1. Modérateur
                        Dans mon profil tu trouveras mon mail perso. Peut être pourrais tu m'envoyer ton fichier?
                        0
                        1. Le mail vient de partir :)
                          0
                          1. Modérateur
                            en réception. 18Mo le fichier Excel!!!!!!!!
                            0
                            1. Ouais je pense que ce sont mes macros de débutant qui foutent le bordel :P
                              0
                              1. Modérateur
                                Non ce ne sont pas tes macros "de débutant" qui alourdissent ton classeur. Ce sont les photos!
                                Un logo de 647Ko par feuille sur 8 feuille = 5Mo.
                                Ensuite toutes ces images insérées dans des commentaires...
                                Oui c'est beau, mais ça va forcément coincer à un moment ou à un autre.
                                Réduit au maximum les tailles de ces images quitte à perdre de leur qualité.

                                Au passage, bonjour Mr Le Pingou et bonne année...
                                0
                              2. @pijakuDako dak!
                                Encore merci
                                0
                            2. Bonjour Farfadet88,
                              Pouvez-vous mettre une copie du vrai classeur avec 2 à 3 feuilles contenant une dizaine de lignes et bien sur la UserForm la feuille [feuille finale] et les procédures (se sera moins lourd en taille !) sur http://cijoint.fr/
                              0
                              1. Des pare-feux admin m'empêchent de déposer ou récupérer des fichier sur Ci-joint... Hélas
                                0
                                1. Modérateur
                                  J'ai compris.
                                  Dans ton code tu nous écris :

                                  Sheets("suivi").Select 
                                  Range("a65536").End(xlUp).Offset(1, 0) = Sheets("données").Range("m1") 
                                  Range("b65536").End(xlUp).Offset(1, 0) = Sheets("données").Range("n1") 
                                  Range("c65536").End(xlUp).Offset(1, 0) = Sheets("données").Range("o1") 
                                  Range("d65536").End(xlUp).Offset(1, 0) = Sheets("données").Range("x1") 
                                  Range("e65536").End(xlUp).Offset(1, 0) = Sheets("données").Range("u1")


                                  Or dans ta feuille suivi, la dernière ligne non vide avant cette macro est une cellule fusionnée. Donc les lignes représentées par "Range("a65536").End(xlUp).Offset(1, 0)" "Range("b65536").End(xlUp).Offset(1, 0)" etc ne sont pas les mêmes...
                                  Solution :

                                  Sheets("suivi").Select 
                                  Dim i as Integer
                                  i = Range("a65536").End(xlUp).Offset(1, 0).Row
                                  Range("A" & i) = Sheets("données").Range("m1") 
                                  Range("B" & i) = Sheets("données").Range("n1") 
                                  Range("C" & i) = Sheets("données").Range("o1") 
                                  Range("D" & i) = Sheets("données").Range("x1") 
                                  Range("E" & i) = Sheets("données").Range("u1")


                                  ps : j'ai supprimé ton fichier de mon ordi...
                                  0
                                  • 1
                                  • 2