Transfert de plusieurs plages de données avec condition

Résolu
Bonjour à tous,

Je ne suis pas un expert de la programmation, mais ayant quelques bases j'aurai consacré plus de temps à la recherche d'une solution si je n'étais pas pris par le temps. C'est pour cette raison que je viens vers vous.

Voilà, dans le cas d'une étude, une extraction de données a été effectuée et mise en forme sous Excel (voir fichier joint : https://www.cjoint.com/c/ECBqBgi8sb8
Cependant, cette extraction étant "basique", j'aurai besoin d'effectuer quelques modifications.
En effet, pour chaque test (colonne A), j'ai plusieurs essais, le nombre variant entre 1 et 7. Je voudrais pour une meilleure exploitation regrouper chaque essai l'un en dessous de l'autre pour chaque test, c'est-à-dire aligner chaque essai avec la première donnée en colonne C. J'ai mis en forme le premier test pour être plus clair.
Le numéro de l'essai m'importe peu, seulement les résultats. Les plages de données étant toujours les mêmes :
Ligne étendue des colonnes K à R
S à Z
AA à AH
AI à AP
AQ à AX
AY à BF
Exemple de ce que donnerai la Macro à laquelle je pensais en littéral :
Définir chaque plage
Si première cellule de la première plage non vide, alors insertion d'une ligne en-dessous de celle où apparaît le nom du Test, puis coupe colle (ou copie/colle) de cette ligne, sinon aucune action
Puis plage suivante (peut être créer une boucle avec la condition cellule non vide ?)
Puis Test suivant, etc...

J'espère avoir été un minimum clair dans mes explications.
Merci d'avance à tous ceux qui m'aideront et me permettront de boucler cette étude dans les meilleurs délais.

Bonne journée

D277

11 réponses

  1. Bonjour ccm81,

    Juste parfait !
    Une dernière chose, si tu as le temps bien entendu, est-ce que si tu pourrais ajouter quelques explications à ton code, pour que je puisse le comprendre à 100% et pour moi progresser.

    Un grand merci

    Bonne soirée

    D277
    0
    1. De rien,
      Quelques explications

      Option Explicit
      
      ' la macro s'applique dans toute feuille active
      
      Const cotes = 1   ' colonne n° test
      Const codeb = 3   ' colonne debut des données
      Const lgtra = 8   ' nombre de colonne des "tranches" d'essais
      Const nbtra = 7   ' nombre maxi de tranche d'essais
      Const lideb = 10  ' première ligne à traiter
      
      Public Sub OK()
      Dim li As Long, lifin As Long, co As Long, plage As Range, k As Long
      Dim t
      t = Timer
      ' desactive la maj de l'ecran
      Application.ScreenUpdating = False
      ' depuis la feuille active
      With ActiveSheet
        ' ligne de fin de la colonne cotes
        lifin = .Cells(Rows.Count, cotes).End(xlUp).Row
        ' on boucle sur les lignes en commençant par la dernière et en remontant
        For li = lifin To lideb Step -1
          ' on boucle sur les tranches en partant de la dernière voir (nbtra-k)
          For k = 1 To nbtra - 1
            ' si la première cellule de la tranche n'est pas vide
            If .Cells(li, codeb + lgtra * (nbtra - k)) <> "" Then
              ' insertion d'une ligne avant la ligne li+1
              Rows(li + 1).Insert
              ' selection de la tranche à copier
              Set plage = .Cells(li, codeb + lgtra * (nbtra - k)).Resize(1, lgtra)
              ' copie de la plage
              plage.Copy .Cells(li + 1, codeb)
            End If
          Next k
        Next li
      End With
      ' ré-activation de l'affichage
      Application.ScreenUpdating = True
      MsgBox "temps mis " & Timer - t & "sec"
      End Sub

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

      Bonne fin de journée
      0
      1. Bonjour ccm81,

        Désolé de ne répondre que maintenant, mais je n'ai vraiment pas beaucoup de temps en ce moment. Un grand merci pour tes explications, cela me permettra de progresser. Ma question principale est résolue, mais avant de mettre la balise en tête de post, est-ce que je peux te poser une autre question ?
        Car contrairement à la précédente demande, là je ne suis pas sûr que cela soit réalisable mais je voudrais en être certain.

        Encore merci

        D277
        0
        1. Pas de problème, du moins tant que tu n'as pas posé la question ;-)
          Si ça n'a rien à voir avec le sujet actuel, il vaut quand même mieux ouvrir une nouvelle discussion

          Cdlmnt
          0
          1. Ok, je vais créer un nouveau sujet.
            0
          2. Mais une dernière modif avant de traiter l'autre problème, je ne me suis aperçu que maintenant (malheureusement), que certaines valeurs relatives à certains essais se trouvaient isolées du reste, à partir de la colonne "BG"
            Si tu reprends mon premier fichier, il y a quelquefois quelques valeurs qui correspondent à la première colonne de chaque essai. Je m'en suis aperçu car du coup après passage de ton programme, il y avait des cellules vides.
            Exemple, si il y a une valeur pour une ligne, pour l'essai 3, cette valeur devrait se trouvait dans la première colonne pour cet essai.
            Est-ce qu'il est possible d'ajouter une composante à ta macro pour aller chercher ces valeurs isolées ou vaudrait-il mieux faire une macro à part puis appliquer la tienne ?

            Encore merci

            D277
            0
        2. Oui mais
          1. ces valeurs colonnes 59 à ... dépassent les 7 tranches de 8 valeurs
          ce n'était pas prévu
          2. ça soulève un autre problème
          Test12
          essai 3 : il y a bien un trou colonne 3 et une valeur (39.3) colonne 59,
          donc là, on peut envisager de déplacer cette valeur en colonne 3
          essai 4 : pas de valeurs colonnes 35 à 42 mais une valeur (36.9) colonne 60, qu'est ce qu'on en fait ?
          essai 5 : même problème, 41.7 en colonne 61 et pas de valeur colonnes 27 à 34
          0
          1. Salut ccm81,

            Encore une fois, désolé de te répondre aussi tardivement mais je suis vraiment débordé ^^
            Alors tu as raison, je ne sais pas ce qui s'est passé, en fait j'ai enlevé certaines données et remplacer certains mots car ce sont des résultats de tests envoyés à nos clients, et en réalité, pour le test 12, c'est dans l'ordre : essai 3 / essai 1 / essai 2 et non pas essai 3 / essai 4 / essai 5 au niveau des colonnes 59 à 61.
            Là, je dois aller bosser. Je vais essayer de refaire le fichier d'origine correctement histoire que l'on reparte d'une bonne base et je le posterai ce soir.

            A+

            D277
            0
          2. Et voilà !! https://www.cjoint.com/c/EDgxbMFnQPQ
            Dis moi, si mon opération est faisable ou non, si ce n'est pas possible ou que cela serait trop casse tête, je ferai les "copier/coller" à la main.

            Un grand merci

            Bonne soirée

            D277
            0
        3. Ce que j'ai compris
          Lorsqu'il y a un "trou" dans les essais (colonnes 3 à 58) le "trou" est sur la première des 8 colonnes de cet essai, et sa valeur est (peut être) après la colonne 58, si elle y est, il faut la rapporter dans le "trou"
          A tester d'abord sur la feuille Test (100 lignes)
          https://www.cjoint.com/?3DhoTK8FvxP

          Cdlmnt
          0
          1. Juste incroyable ^^
            Tu es un génie !! J'aimerai vraiment maîtriser la programmation aussi bien que toi :)
            Ma question sera donc enfantine pour toi mais, quel est le paramètre à changer pour considérer la récupération des données au-delà de la ligne 100 ? Je dois avouer que je suis dépassé et de loin !
            Et enfin le plus important, est-ce que tu peux m'indiquer comme tu l'as fait ci-dessus des explications sur la macro "Récupérations Dernière Valeurs" ?

            Un énorme et monumental MERCI !

            D277
            0
            1. 1. Merci, mais n'exagérons rien !!!
              2. Quel est le paramètre à changer pour considérer la récupération des données au-delà de la ligne 100
              Rien à changer, la macro travaille sur la feuille active et va jusqu'à la dernière ligne de la colonne A
              3. Avec quelques explications
              Public Sub RecuperationDernieresValeurs()
              Dim essai As String, coess As Long
              Dim li As Long, lifin As Long, co As Long, cofin As Long, cocodeb As Long
              Application.ScreenUpdating = False
              With ActiveSheet
                ' colonne début des valeurs après la colonne 59 = 3+7*8
                cocodeb = codeb + nbtra * lgtra
                ' dernière ligne de la colonne A
                lifin = .Cells(Rows.Count, cotes).End(xlUp).Row
                ' boucle sur les lignes 
                For li = lideb To lifin
                  ' dernière colonne renseignée de la ligne li
                  cofin = .Cells(li, Columns.Count).End(xlToLeft).Column
                  ' si cofin >= 59 c'est qu'il y a des valeurs à récupérer
                  If cofin >= cocodeb Then
                    ' boucle sur les colonnes de récupération
                    For co = cocodeb To cofin
                      ' si la cellule(li,co) n'est pas vide, c'est une valeur à récupérer
                      If .Cells(li, co) <> "" Then
                        ' essai = entête de la colonne (en ligne liess)
                        essai = .Cells(liess, co)
                        ' coess = première colonne de essai dans la ligne li
                        coess = .Rows(liess).Find(essai, , , xlWhole).Column
                        ' copie de la valeur récupérée dans cette colonne
                        .Cells(li, co).Copy .Cells(li, coess)
                      End If
                    Next co
                  End If
                Next li
              End With
              Application.ScreenUpdating = True
              End Sub

              4. Si c'est fini, merci de mettre le sujet à Résolu (en haut à gauche de ton premier message)

              Bonne fin de journée
              0
              1. Un grand merci. Il ne me restera plus qu'à étudier ça ;)
                Mais d'abord, il faut que je réfléchisse au problème suivant, au pire je posterai un autre sujet.
                0
            2. Petit détail, j'ai demandé une nouvelle extraction de données pour m'éviter d'avoir certaines valeurs inutiles que je n'ai pas réussi à éliminer autrement (trop dispersées sur l'étendue du fichier).

              J'ai modifié les paramètres, chaque variable a été adaptée à la nouvelle forme du fichier, mais le résultat n'est pas là.
              Les valeurs récupérées ne sont pas à la bonne place et les essais ne sont pas tout le temps mis les uns en-dessous des autres.

              J'y réfléchis depuis des heures et j'ai repris chaque ligne de ton code avec tes explications mais je ne vois pas où est LE problème.
              Alors ma question, est-ce qu'il faut adapter autre chose que les variables pour réutiliser ton code ?

              Merci d'avance

              D277
              0
              1. Bonjour

                est-ce qu'il faut adapter autre chose que les variables pour réutiliser ton code ?
                En principe non
                Quelques précisions

                1. A exécuter dans l'ordre
                1.1. Lancer, si besoin, la récupération des données après la dernière colonne
                1.2. Lancer la macro OK

                2. Les données doivent être structurées (même nombre d'essai lgtra = 8 pour chacune des nbtra = 7 ) "tranches" d'essai

                3. Si tu as adapté les constantes à ton fichier, ça devrait fonctionner

                4. Les deux procédures ne doivent être exécutées qu'une fois et tu peux/dois supprimer toutes les colonnes après la colonne codeb+lgtra-1

                Cdlmnt
                0