Transposition et collage données

Sonia2020

XLDnaute Nouveau
Bonjour Le Forum

Je me présente Sonia, c'est la première fois que je viens sur ce forum. Je me suis inscrite afin de trouver une aide précieuse pour m'aider à avancer sur mon sujet de stage.
J'ai essayé de me débrouiller seule mais je suis tombée sur un problème auquel la maîtrise du VBA est nécessaire. Je ne sais pas du tout comment il faut faire.

J'aimerai vous expliquer mon problème et comment je souhaite que cela fonctionne afin que vous y voyez plus clair.

J'aimerai que le code VBA me fasse le nombre de boucle nécessaire en fonction du nombre de date différente dans la l'onglet Extraction en Colonne I.

1ère boucle de démarrage :
1ère étape : La macro va trier les données en fonction des dates de la plus ancienne saisie à la plus récente de l'onglet "Extraction" en colonne I.

2ème étape : Une fois triées, elle va faire une recherche V des données de la colonne C de l'onglet Données Analyse Charge par rapport aux données de l'onglet Paramètre en K, et copier coller les valeurs de la colonne L (onglet Paramètre) vers Colonne D (onglet Données Analyse Charge).

3ème étape : Sur (onglet Extraction), en colonne I prendre la première date saisie et la coller en B15 (onglet Data).

4ème étape : Une fois le collage en B15 Faite, il va prendre la valeur de la date en B16 (onglet Data) copier et coller en colonne A (démarrage en A2, onglet Transfert & Retard),

Puis en B (démarrage en B2, onglet Transfert & Retard) la charge à transférer qui se trouve en G (onglet Données Analyse Charge), la cellule à prendre se retrouve en fonction de la croix sur la colonne V du même onglet. S'il identifie une croix, alors il va sur la même ligne en G, copie et colle la valeur sur la colonne B (démarrage en B2, onglet Transfert & Retard)

Puis en C (démarrage en C2, onglet Transfert & Retard), le retard qui est égal au cumul de la charge en colonne F (onglet Données Analyse Charge),seulement les valeurs dont les dates (colonne J, onglet Données Analyse Charge) sont entre la date la plus ancienne (B18, onglet Data) et la date de saisie en (B18, onglet Data).

2ème boucle et jusqu`à la fin :
Quand il démarrera la boucle 2, la seule chose qui différenciera de la 1ère boucle c'est qu'au moment de la recherche V, il collera les données de la colonne M (onglet Paramètre) vers Colonne D (onglet Données Analyse Charge) au lieu des données en de la colonne L.

Autre chose : Il ne prendra pas la date de saisie suivante en colonne I (onglet Extraction) si elle est identique. Exemple, si à ma première boucle j'ai démarré avec la date du 12.01.2021, si la date suivante est au 12.01.2021, alors je passe à la suivante). Si j'ai 3 lignes avec une première date au 12.01.2021, puis celle du dessous avec une date en 12.01.2021, puis la suivante au 13.01.2021) il passera directement sur la date du 13.01.2021.

Je ne sais pas si mes explications sont claires, mais espère que quelqu'un du forum pourra comprendre et m'aider sur cette problématique.

Je vous remercie par avance pour votre aide précieuse !!

Sonia2020
 
Dernière édition:

Sonia2020

XLDnaute Nouveau
Bonjour à nouveau le forum

J'ai essayé de le faire avec l'enregistrement macro mais cela ne fonctionne pas tout à fait, je ne sais pas faire de boucle, je ne sais pas cumuler la charge en fonction des valeurs de dates.

J'essaye de relancer le sujet pour vraiment obtenir de l'aide. Merci de votre aide.

Sonia2020
 

Rouge

XLDnaute Impliqué
Bonjour,

Puis en C (démarrage en C2, onglet Transfert & Retard), le retard qui est égal au cumul de la charge en colonne F (onglet Données Analyse Charge),seulement les valeurs dont les dates (colonne J, onglet Données Analyse Charge) sont entre la date la plus ancienne (B18, onglet Data) et la date de saisie en (B18, onglet Data).

Là, il y a un problème
 

Sonia2020

XLDnaute Nouveau
Bonjour Rouge

Pourqu
Bonjour,

Puis en C (démarrage en C2, onglet Transfert & Retard), le retard qui est égal au cumul de la charge en colonne F (onglet Données Analyse Charge),seulement les valeurs dont les dates (colonne J, onglet Données Analyse Charge) sont entre la date la plus ancienne (B18, onglet Data) et la date de saisie en (B18, onglet Data).

Là, il y a un problème
Bonjour Rouge

Pourquoi il y a un problème ?

Merci de ton retour

Sonia
 

Sonia2020

XLDnaute Nouveau
entre B18 et B18 où est la différence?

Oui je vois, il y a bien un problème, je ne connais pas la réponse.
Dans ce cas, serait-il possible de ne pas prendre en compte la problématique de copier coller les données de la colonne C ?

Simplement faire le code sur les étapes :

1ère boucle de démarrage :
1ère étape : La macro va trier les données en fonction des dates de la plus ancienne saisie à la plus récente de l'onglet "Extraction" en colonne I.

2ème étape : Une fois triées, elle va faire une recherche V des données de la colonne C de l'onglet Données Analyse Charge par rapport aux données de l'onglet Paramètre en K, et copier coller les valeurs de la colonne L (onglet Paramètre) vers Colonne D (onglet Données Analyse Charge).

3ème étape : Sur (onglet Extraction), en colonne I prendre la première date saisie et la coller en B15 (onglet Data).

4ème étape : Une fois le collage en B15 Faite, il va prendre la valeur de la date en B16 (onglet Data) copier et coller en colonne A (démarrage en A2, onglet Transfert & Retard),

Puis en B (démarrage en B2, onglet Transfert & Retard) la charge à transférer qui se trouve en G (onglet Données Analyse Charge), la cellule à prendre se retrouve en fonction de la croix sur la colonne V du même onglet. S'il identifie une croix, alors il va sur la même ligne en G, copie et colle la valeur sur la colonne B (démarrage en B2, onglet Transfert & Retard)

2ème boucle et jusqu`à la fin :
Quand il démarrera la boucle 2, la seule chose qui différenciera de la 1ère boucle c'est qu'au moment de la recherche V, il collera les données de la colonne M (onglet Paramètre) vers Colonne D (onglet Données Analyse Charge) au lieu des données en de la colonne L.

Autre chose : Il ne prendra pas la date de saisie suivante en colonne I (onglet Extraction) si elle est identique. Exemple, si à ma première boucle j'ai démarré avec la date du 12.01.2021, si la date suivante est au 12.01.2021, alors je passe à la suivante). Si j'ai 3 lignes avec une première date au 12.01.2021, puis celle du dessous avec une date en 12.01.2021, puis la suivante au 13.01.2021) il passera directement sur la date du 13.01.2021.

J'essayerai de trouver une solution pour comptabiliser le retard.

Merci pour ton aide par avance

Sonia
 

Rouge

XLDnaute Impliqué
Alors voilà une première ébauche, il y aura sûrement des modifications à apporter, mais dans un premier temps, ça devrait permettre d'avancer.

Dans la feuille "Exttraction" , cliquez sur le bouton.

VB:
Option Explicit
Option Compare Text

Sub Traitement()
    'Déclaration des variables
    Dim f1 As Worksheet, f2 As Worksheet, f3 As Worksheet, f4 As Worksheet, f5 As Worksheet, f6 As Worksheet, f7 As Worksheet
    Dim DerLig_f1 As Long, DerLig_f2 As Long, DerLig_f3 As Long, DerLig_f4 As Long, DerLig_f5 As Long, DerLig_f6 As Long, DerLig_f7 As Long
    Dim i As Long
    Dim DateSaisie As Double
    Dim x As Range
    Set f1 = Sheets("Données Analyse Charge")
    Set f2 = Sheets("Data")
    Set f3 = Sheets("Transfert & Retard")
    Set f4 = Sheets("Bilan")
    Set f5 = Sheets("Extraction")
    Set f6 = Sheets("Liste délai court")
    Set f7 = Sheets("Paramètre")
    
    Application.ScreenUpdating = False 'Evite les scintillements de l'écran et accélère l'exécution du programme
    '**************************************************************************************************************************************************
    f3.Range("A2:C" & f3.Range("A" & Rows.Count).End(xlUp).Row + 1).ClearContents 'efface les précédents résultats de la feuille ""Transfert & Retard"
    f5.Select 'on se positionne sur la feuille "Extraction"
    
    '************************ 1ère boucle **************************************************************************************************
    '1ère étape :  trier les données en fonction des dates de la plus ancienne saisie à la plus récente de l'onglet "Extraction" en colonne I.
    DerLig_f5 = f5.Range("A" & Rows.Count).End(xlUp).Row 'dernière ligne de la feuille "Extraction"
    f5.Range("A2:M" & DerLig_f5).Sort [I1], 1 'filtrage par date
    
    '2ème étape : Une fois triées, elle va faire une recherche V des données de la colonne C de l'onglet Données Analyse Charge par rapport aux données _
    de l'onglet Paramètre en K, et copier coller les valeurs de la colonne L (onglet Paramètre) vers Colonne D (onglet Données Analyse Charge).
    DerLig_f1 = f1.Range("A" & Rows.Count).End(xlUp).Row 'dernière ligne de la feuille "Données Analyse Charge"
    f1.Range("D5:D" & DerLig_f1).FormulaR1C1 = "=VLOOKUP(RC[-1],Paramètre!C[7]:C[9],2,FALSE)"
    f1.Range("D5:D" & DerLig_f1).Value = f1.Range("D5:D" & DerLig_f1).Value
    
    For i = 2 To DerLig_f5 'De la ligne 2 à la dernière ligne de la feuille "Extraction"
        '3ème étape : Sur (onglet Extraction), en colonne I prendre la première date saisie et la coller en B15 (onglet Data).
        If f5.Cells(i, "I") <> f5.Cells(i - 1, "I") Then 'si les dates sont différentes
            f2.Range("B15").Value = f5.Cells(i, "I").Value
            
            '4ème étape : Une fois le collage en B15 Faite, il va prendre la valeur de la date en B16 (onglet Data) copier et coller en colonne A (démarrage en A2, onglet Transfert & Retard),
            DerLig_f3 = f3.Range("A" & Rows.Count).End(xlUp).Row + 1 'dernière ligne de la feuille "Transfert & Retard"
            f3.Cells(DerLig_f3, "A") = f2.Range("B16").Value 'Copie de la date saisie en B16
            DateSaisie = f3.Cells(DerLig_f3, "A") 'Attribution de la variable "DateSaisie"
            
            'Puis en B (démarrage en B2, onglet Transfert & Retard) la charge à transférer qui se trouve en G (onglet Données Analyse Charge), la cellule _
                à prendre se retrouve en fonction de la croix sur la colonne W du même onglet. S'il identifie une croix, alors il va sur la même ligne en G, _
                copie et colle la valeur sur la colonne B (démarrage en B2, onglet Transfert & Retard)
             Set x = f1.Range("C1:C" & DerLig_f1).Find(DateSaisie, LookIn:=xlValues, lookat:=xlWhole) 'on recherche la date saisie
             If Not x Is Nothing Then 'Si la date est trouvée
                If f1.Cells(x.Row, "W") = "x" Then 'on regarde s'il y a un "x" dans la colonne "W"
                    f3.Cells(DerLig_f3, "B") = f1.Cells(x.Row, "G") 'on copie en "B" la valeur trouvée en "G"
                    'Puis en C (démarrage en C2, onglet Transfert & Retard), le retard qui est égal au cumul de la charge en colonne F (onglet Données Analyse Charge), _
                    seulement les valeurs dont les dates (colonne J, onglet Données Analyse Charge) sont entre la date la plus ancienne (B18, onglet Data) et la date de saisie en (B18, onglet Data).
                    'If f2.Cells(x.Row, "J") < f2.Range("B18") And f2.Cells(x.Row, "J") > f2.Range("B18") Then 'Si entre ces 2 dates
                        'f3.Cells(DerLig_f3, "C") = f1.Cells(x.Row, "F") 'Copie de "F" dans "C"
                    'End If
                End If
            End If
        End If
    Next i
    
    '************************ 2ème boucle **************************************************************************************************
    'Quand il démarrera la boucle 2, la seule chose qui différenciera de la 1ère boucle c'est qu'au moment de la recherche V, il collera les données _
    de la colonne M (onglet Paramètre) vers Colonne D (onglet Données Analyse Charge) au lieu des données en de la colonne L.
    f1.Range("D5:D" & DerLig_f1).FormulaR1C1 = "=VLOOKUP(RC[-1],Paramètre!C[7]:C[9],3,FALSE)"
    f1.Range("D5:D" & DerLig_f1).Value = f1.Range("D5:D" & DerLig_f1).Value
    
    For i = 2 To DerLig_f5 'De la ligne 2 à la dernière ligne de la feuille "Extraction"
        '3ème étape : Sur (onglet Extraction), en colonne I prendre la première date saisie et la coller en B15 (onglet Data).
        If f5.Cells(i, "I") <> f5.Cells(i - 1, "I") Then 'si les dates sont différentes
            f2.Range("B15").Value = f5.Cells(i, "I")
            
            '4ème étape : Une fois le collage en B15 Faite, il va prendre la valeur de la date en B16 (onglet Data) copier et coller en colonne A (démarrage en A2, onglet Transfert & Retard),
            DerLig_f3 = f3.Range("A" & Rows.Count).End(xlUp).Row + 1
            f3.Cells(DerLig_f3, "A") = f2.Range("B16").Value
            DateSaisie = f3.Cells(DerLig_f3, "A")
            
            'Puis en B (démarrage en B2, onglet Transfert & Retard) la charge à transférer qui se trouve en G (onglet Données Analyse Charge), la cellule _
                à prendre se retrouve en fonction de la croix sur la colonne W du même onglet. S'il identifie une croix, alors il va sur la même ligne en G, _
                copie et colle la valeur sur la colonne B (démarrage en B2, onglet Transfert & Retard)
             Set x = f1.Range("C1:C" & DerLig_f1).Find(DateSaisie, LookIn:=xlValues, lookat:=xlWhole) 'on recherche la date saisie
             If Not x Is Nothing Then 'Si la date est trouvée
                If f1.Cells(x.Row, "W") = "x" Then 'on regarde s'il y a un "x" dans la colonne "W"
                    f3.Cells(DerLig_f3, "B") = f1.Cells(x.Row, "G") 'on copie en "B" la valeur trouvée en "G"
                    'Puis en C (démarrage en C2, onglet Transfert & Retard), le retard qui est égal au cumul de la charge en colonne F (onglet Données Analyse Charge), _
                    seulement les valeurs dont les dates (colonne J, onglet Données Analyse Charge) sont entre la date la plus ancienne (B18, onglet Data) et la date de saisie en (B18, onglet Data).
                    'If f2.Cells(x.Row, "J") < f2.Range("B18") And f2.Cells(x.Row, "J") > f2.Range("B18") Then 'Si entre ces 2 dates
                        'f3.Cells(DerLig_f3, "C") = f1.Cells(x.Row, "F") 'Copie de "F" dans "C"
                    'End If
                End If
            End If
        End If
    Next i
    
    f3.Select ' affichage de la feuille "Transfert & Retard"
    
    '**************************************************************************************************************************************
    'Libération de la mémoire
    Set x = Nothing
    Set f1 = Nothing
    Set f2 = Nothing
    Set f3 = Nothing
    Set f4 = Nothing
    Set f5 = Nothing
    Set f6 = Nothing
    Set f7 = Nothing
End Sub
 

Pièces jointes

  • Sonia2020_Transposition et collage données.xlsm
    254.1 KB · Affichages: 16

Sonia2020

XLDnaute Nouveau
Bonjour Rouge,

Je te remercie pour ton aide

1603378366344.png


Mais normalement le résultat que je suis censé avoir c'est ceci.
sur le fichier recu j'ai ceci comme résultat
1603379033648.png

Je ne suis pas censé avoir 2 fois les mêmes dates mais juste une fois.

Sonia
 
Dernière édition:

Rouge

XLDnaute Impliqué
En ce qui concerne les boucles, je crois que j'ai compris, vous confondez "Boucle" avec le nombre de "passages" à effectuer.
Dans "for i =2 to DerLig_f5" cela signifie que le programme va boucler de la ligne 2 jusqu'à la dernière ligne, il recommence son cycle autant de fois qu'il y a de lignes à traiter.
 

Sonia2020

XLDnaute Nouveau
Alors, il n' y a qu'une seule boucle et non pas 2.
D'où sortent les valeurs 110 et 42?

Alors, il n' y a qu'une seule boucle et non pas 2.

Je pense que j'ai mal utilisée le vocabulaire. Oui c'est 1 boucle pour la totalité.
Au démarrage il fait il fait le tri avec la recherche v pour coller les données en colonne D des valeurs trouvées en L de l'onglet Paramètre, puis quand il passe à la date suivante, il va ne va pas trier et il va chercher les données en colonne M via la recherche v.

D'où sortent les valeurs 110 et 42?
Pour le 110, quand il copie colle la date du 12.01.2021 de la colonne I de l'onglet Extraction
1603380344399.png


Pour le 42, quand il copie colle la date du 14.01.2012 de la colonne I de l'onglet Extraction
1603380477000.png
 

Sonia2020

XLDnaute Nouveau
En ce qui concerne les boucles, je crois que j'ai compris, vous confondez "Boucle" avec le nombre de "passages" à effectuer.
Dans "for i =2 to DerLig_f5" cela signifie que le programme va boucler de la ligne 2 jusqu'à la dernière ligne, il recommence son cycle autant de fois qu'il y a de lignes à traiter.

Oui c'est bien ca, même avec le vocabulaire je suis nulle -_- !!!

Je suis navrée sérieusement.
 

Sonia2020

XLDnaute Nouveau
Re

Voici le fichier
Normalement il démarre avec la date du 12.01.2021, ce qui va mettre en valeur 110.
Puis une fois fini, il va prendre la valeur du 13.01.2021 qui va donner la valeur de 32
Puis il fini avec la valeur du 14.01.2021 qui va donner la valeur de 42.

En sachant que pour la première date de démarrage doit 12.01.2021, il va prendre les valeurs de la colonne L de l'onglet paramètre et les coller sur la colonne D de l'onglet Données Analyse Charge en fonction de la recherche V des valeur de la colonne C de l'onglet Données Analyse Charge

Puis pour le reste des dates, il prendre les valeurs recherche V de la colonne M de l'onglet paramètre

Merci beaucoup pour le temps que vous consacrez pour m'aider
Sonia
 

Pièces jointes

  • Sonia2020_Transposition et collage données.xlsm
    238.1 KB · Affichages: 3

Discussions similaires