Transfert de plusieurs plages de données avec condition

Résolu/Fermé
D277 Messages postés 34 Date d'inscription lundi 7 avril 2014 Statut Membre Dernière intervention 30 avril 2015 - 27 mars 2015 à 16:23
ccm81 Messages postés 10903 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 19 novembre 2024 - 2 mai 2015 à 17:20
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

ccm81 Messages postés 10903 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 19 novembre 2024 2 427
Modifié par ccm81 le 27/03/2015 à 17:43
Bonjour

Une tentative à tester (sur la feuille jan02014-1)
https://www.cjoint.com/?3CBr3H6S0Kg

lien modifié

Cdlmnt
0
D277 Messages postés 34 Date d'inscription lundi 7 avril 2014 Statut Membre Dernière intervention 30 avril 2015
27 mars 2015 à 18:27
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
ccm81 Messages postés 10903 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 19 novembre 2024 2 427
27 mars 2015 à 19:02
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
D277 Messages postés 34 Date d'inscription lundi 7 avril 2014 Statut Membre Dernière intervention 30 avril 2015
1 avril 2015 à 10:08
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ccm81 Messages postés 10903 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 19 novembre 2024 2 427
1 avril 2015 à 15:00
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
D277 Messages postés 34 Date d'inscription lundi 7 avril 2014 Statut Membre Dernière intervention 30 avril 2015
2 avril 2015 à 12:50
Ok, je vais créer un nouveau sujet.
0
D277 Messages postés 34 Date d'inscription lundi 7 avril 2014 Statut Membre Dernière intervention 30 avril 2015
2 avril 2015 à 12:58
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
ccm81 Messages postés 10903 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 19 novembre 2024 2 427
2 avril 2015 à 19:51
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
D277 Messages postés 34 Date d'inscription lundi 7 avril 2014 Statut Membre Dernière intervention 30 avril 2015
6 avril 2015 à 11:09
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
D277 Messages postés 34 Date d'inscription lundi 7 avril 2014 Statut Membre Dernière intervention 30 avril 2015
6 avril 2015 à 22:49
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
ccm81 Messages postés 10903 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 19 novembre 2024 2 427
7 avril 2015 à 14:36
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
D277 Messages postés 34 Date d'inscription lundi 7 avril 2014 Statut Membre Dernière intervention 30 avril 2015
7 avril 2015 à 17:57
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
ccm81 Messages postés 10903 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 19 novembre 2024 2 427
7 avril 2015 à 18:29
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
D277 Messages postés 34 Date d'inscription lundi 7 avril 2014 Statut Membre Dernière intervention 30 avril 2015
13 avril 2015 à 19:05
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
D277 Messages postés 34 Date d'inscription lundi 7 avril 2014 Statut Membre Dernière intervention 30 avril 2015
30 avril 2015 à 19:21
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
ccm81 Messages postés 10903 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 19 novembre 2024 2 427
2 mai 2015 à 17:20
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