Transfert de plusieurs plages de données avec condition

Résolu
D277 Messages postés 38 Statut Membre -  
ccm81 Messages postés 11033 Statut Membre -
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. D277 Messages postés 38 Statut Membre
     
    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
  2. ccm81 Messages postés 11033 Statut Membre 2 434
     
    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
  3. D277 Messages postés 38 Statut Membre
     
    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
  4. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  5. ccm81 Messages postés 11033 Statut Membre 2 434
     
    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. D277 Messages postés 38 Statut Membre
       
      Ok, je vais créer un nouveau sujet.
      0
    2. D277 Messages postés 38 Statut Membre
       
      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
  6. ccm81 Messages postés 11033 Statut Membre 2 434
     
    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. D277 Messages postés 38 Statut Membre
       
      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. D277 Messages postés 38 Statut Membre
       
      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
  7. ccm81 Messages postés 11033 Statut Membre 2 434
     
    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
  8. D277 Messages postés 38 Statut Membre
     
    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
  9. ccm81 Messages postés 11033 Statut Membre 2 434
     
    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. D277 Messages postés 38 Statut Membre
       
      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
  10. D277 Messages postés 38 Statut Membre
     
    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
  11. ccm81 Messages postés 11033 Statut Membre 2 434
     
    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