XL 2013 Transfet de données d'une ligne d'un fichier vers une colonne d'un autre fichier

Averell1976

XLDnaute Junior
Bonjour à toutes et à tous,

J'ai posé un sujet il y a quelques temps. J'ai reçu de l'aide de votre part et je vous en remercie vivement, mais je coince toujours. Je n'avais pas de code à vous proposer, mais aujourd'hui, j'ai quelque peu avancé. Je peux donc vous le soumettre. J’avais mis les fichiers en PJ mais je comprends que cela puisse poser problème.
L'objectif est de transférer des données (en lignes) d'un fichier, compris entre 2 dates vers une colonne d'un autre fichier:

Code:
Private Sub GenererPlanning_Jour_Click()
 'J'ouvre un userform et je renseigne la date de début et la date de fin pour récupérer toutes les données entre ces 2 dates   
    Application.ScreenUpdating = False
    Set Fdép = ActiveSheet
    Dte1 = DateValue(Right(TextBox1, 10))
    Dte2 = DateValue(Right(TextBox2, 10))
    If Dte2 < Dte1 Then
        MsgBox "     Mauvaise saisie !" & Chr(13) & "     La date de fin doit être postérieure à celle de début ! ", 16
        Exit Sub
    End If
    LnNom = ComboBox1.ListIndex + 11
    NbreMois = Month(Dte2) - Month(Dte1)
    If NbreMois < 0 Then NbreMois = NbreMois + 13
    NomMois = Array("JANVIER", "FéVRIER", "MARS", "AVRIL", "MAI", "JUIN", "JUILLET", "AOÛT", "SEPTEMBRE", "OCTOBRE", "NOVEMBRE", "DéCEMBRE")
    
    Chemin = ThisWorkbook.Path & "\"
    If TextBox1 = "" Or TextBox2 = "" Then
        MsgBox "     Vous devez saisir une date de début et une date de " & Chr(13) & "     fin de remplacement.", 16
        Exit Sub
    End If
    
    'On ouvre le planning du remplaçant (le fichier dans lequel je veux copier les données en colonne)
    Application.DisplayAlerts = False
    'Workbooks.Open Filename:=Chemin & "MATRICE PLANNING JOUR PREVISIONNEL INDIVIDUEL.xlsm"
    Workbooks.Open Filename:="O:\Cecile BALANDRAUD\MATRICES\MATRICE PLANNING_FL\FL Melting1.xlsm"
    Set DocDest = ActiveWorkbook
    ActiveSheet.Name = NomMois(Month(Dte1) - 1)
    'Range("A1").Value = Fdép.Cells(LnNom + 1, 2).Value
    'Range("A2").Value = "qui remplace " & ComboBox1
    

    'On affiche le mois de début de remplacement dans ce fichier qui s'est ouvert
    Fdép.Range("Z2").Value = NomMois(Month(Dte1) - 1)
    Fdép.Range("AC2").Value = Year(Dte1)
    DocDest.Sheets(NomMois(Month(Dte1) - 1)).Range("O10").Value = NomMois(Month(Dte1) - 1)
    '''''''''''
    DocDest.Sheets(NomMois(Month(Dte1) - 1)).Range("O8").Value = Year(Dte1)
    
    ' Dernière colonne du mois
   For i = 3 To 34
    If Fdép.Cells(9, i).Value = "" Then
    Exit For
    End If
   Next i
   DerCol = i - 1
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    'On copie les jours de remplacement dans le planning du remplaçant; c'est là que ça coince
    For Col = 3 To DerCol
    For Lign = 21 To 51
  If Fdép.Cells(9, Col).Value >= Dte1 And Fdép.Cells(9, Col).Value <= Dte2 Then
    'If DocDest.Sheets(NomMois(Month(Dte1) - 1)).Cells(Lign, 1).Value >= Dte1 And DocDest.Sheets(NomMois(Month(Dte1) - 1)).Cells(Lign, 1).Value <= Dte2 Then
    Fdép.Cells(LnNom, Col).Copy
    DocDest.Sheets(NomMois(Month(Dte1) - 1)).Cells(Lign, 3).PasteSpecial xlPasteAll, Operation:=xlNone, SkipBlanks:= _
 False, Transpose:=True 'selection un collage special => transposé permet de passer de ligne en colonne
 Application.CutCopyMode = False
        
    End If
    Next Lign
    Next Col
    
    Unload Me
 
''''''''''''''''''''''''''''''''''''''''''
 
End Sub

Merci de votre aide éventuelle.
Cordialement,

Averell
 

thebenoit59

XLDnaute Accro
Re : Transfet de données d'une ligne d'un fichier vers une colonne d'un autre fichier

Bonjour Averell.
Si tu as l'occasion de nous transmettre des fichiers sur lesquels tu travailles, afin que nous puissions apporter une réponse cohérente :).
Bonne soirée.
 

Averell1976

XLDnaute Junior
Re : Transfet de données d'une ligne d'un fichier vers une colonne d'un autre fichier

Bonjour Averell.
Si tu as l'occasion de nous transmettre des fichiers sur lesquels tu travailles, afin que nous puissions apporter une réponse cohérente :).
Bonne soirée.
Bonsoir thebenoit59.
Merci pour ta réponse. Voici donc les fichiers. Le fichier source est MATRICE PLANNING FL. Le fichier de destination FL Melting 1.
L'objectif donc: En remplissant l'userform1 (nom du salarié, date de début d'absence, date de retour) et en cliquant sur le bouton "Générer un planning de jour", je voudrai récupérer les dates concernés en colonel A (partir de A21) et les horaires compris entre ces 2 dates en colonne C (à partir de C21, C22.... etc en fonction du nombre de jour) du fichier de destination... Ces horaires sont indiqués en ligne dans le fichier source (ex: ligne 11 pour le salarié "Combes": 13:30-22:00/R/R/7:00-14:00 entre le 1er et le 4 avril, à récupérer dans le fichier de destination en colonne C)

Merci de votre aide.
Averell
 

Pièces jointes

  • MATRICE PLANNING_FL.xlsm
    187.6 KB · Affichages: 20
  • MATRICE PLANNING_FL.xlsm
    187.6 KB · Affichages: 17
  • FL Melting1.xlsm
    124.6 KB · Affichages: 32
  • FL Melting1.xlsm
    124.6 KB · Affichages: 18

thebenoit59

XLDnaute Accro
Re : Transfet de données d'une ligne d'un fichier vers une colonne d'un autre fichier

Bonjour Averell.

Je te joins le fichier sur lequel j'ai travaillé.
J'ai imaginé la procédure un peu différemment.

A toi de voir si ça peut te convenir.
 

Pièces jointes

  • MATRICE PLANNING_FL.xlsm
    221.7 KB · Affichages: 26
  • MATRICE PLANNING_FL.xlsm
    221.7 KB · Affichages: 20

Averell1976

XLDnaute Junior
Re : Transfet de données d'une ligne d'un fichier vers une colonne d'un autre fichier

Merci thebenoit59,

Un grand merci pour ton aide.
J'ai bidouillé toute la matinée et j'ai réussi à faire fonctionner mon fichier.
Ceci dit, je vois que ton code est beaucoup plus propre que le mien. Cela m'intéresse donc.
Mais en voulant le tester, j'ai directement un message d'erreur:
erreur.jpg

En débogage, il pointe sur:
erreur1.jpg

Je ne vois pas bien d'où cela vient... Tu n'as pas ce bug quand tu testes?
 

Pièces jointes

  • erreur.jpg
    erreur.jpg
    45.3 KB · Affichages: 35
  • erreur1.jpg
    erreur1.jpg
    21.8 KB · Affichages: 35

thebenoit59

XLDnaute Accro
Re : Transfet de données d'une ligne d'un fichier vers une colonne d'un autre fichier

Non, mais je pense savoir d'où vient le problème. Je n'ai pas ré-attribué le bouton, il faut l'attribuer à la macro suivante :

Code:
Private Sub PlanningCDD_Click()
Planning_Absence
End Sub

En gros, j'ai divisé la procédure générale en sous-procédures (voir le module thebenoit59).
 

Averell1976

XLDnaute Junior
Re : Transfet de données d'une ligne d'un fichier vers une colonne d'un autre fichier

En effet, c'était cela.
J'ai ré- attribué le bouton et je peux lancer. Mais quand je lance, ça me récupère n'importe quoi au niveau des dates en colonne A???
 

thebenoit59

XLDnaute Accro
Re : Transfet de données d'une ligne d'un fichier vers une colonne d'un autre fichier

Je n'avais testé qu'avec des dates à partir du 16, c'est dû au transfert en date américaine.
Modifie juste la procédure ci-dessous :

Code:
Sub Transferer_Donnees()
Dim Range_Donnees, Range_Dates, d As Object, d1 As Object
Dim i As Integer, c As Range
    With fBase
        Range_Dates = Application.Transpose(.Range(.Cells(9, Premiere_Colonne), .Cells(9, Derniere_Colonne)).Value)
        Set d1 = CreateObject("scripting.dictionary")
        For i = LBound(Range_Dates) To UBound(Range_Dates)
            d1(i) = CDate(Range_Dates(i, 1))
        Next i
        Range_Donnees = Application.Transpose(.Range(.Cells(Ligne_Absent, Premiere_Colonne), .Cells(Ligne_Absent, Derniere_Colonne)).Value)
        Set d = CreateObject("scripting.dictionary")
        For i = LBound(Range_Donnees) To UBound(Range_Donnees)
            d(i) = Range_Donnees(i, 1)
        Next i
    End With
    With fDestination
        For i = 1 To d1.Count
            .Cells(20 + i, 1).Value = d1(i)
        Next i
        For i = 1 To d.Count
            If d(i) = "R" Then
                .Cells(20 + i, 3).Resize(, 2).Value = d(i)
                Else: .Cells(20 + i, 3).Resize(, 2).Value = Split(d(i), "-")
            End If
        Next i
        For Each c In .Range(.Cells(21, 3), .Cells(20 + i, 4))
            c = Application.WorksheetFunction.Trim(c)
        Next c
    End With
End Sub
 

Averell1976

XLDnaute Junior
Re : Transfet de données d'une ligne d'un fichier vers une colonne d'un autre fichier

Merci ça marche impeccable et cela s'exécute beaucoup plus rapidement que mon code....
Par contre du coup, je suis embêté car j'ai du mal à le comprendre et donc à le faire évoluer, pour récupérer par exemple le nom du salarié en colonne J... avec mon code, je sais où caser la requête, avec le tien, je vois pas trop.

En tout cas, je suis à la fois épaté, reconnaissant et dégouté car je n'aurai jamais pu programmer un truc aussi proprement...
 

thebenoit59

XLDnaute Accro
Re : Transfet de données d'une ligne d'un fichier vers une colonne d'un autre fichier

Il faut rajouter la commande dans la procédure Transferer_Donnees().
Ensuite la variable de la personne absente est Nom_Absent.
Juste définir la zone où tu souhaites le mettre, pour connaître le nombre de ligne tu peux utiliser Ubound(Range_Dates) comme variable.
Ce qui donnera :

Code:
.Cells(21,10).Resize(Ubound(Range_Dates)).Value = Nom_Absent

Bien sûr que tu aurais pu programmer ainsi. C'est juste une démarche à utiliser, celle-ci je m'efforce de l'utiliser à chacun de mes codes pour obtenir quelque chose de lisible pour mes collègues le jour de mes absences.
 

thebenoit59

XLDnaute Accro
Re : Transfet de données d'une ligne d'un fichier vers une colonne d'un autre fichier

Ce que je te conseille, c'est de lancer la procédure pas à pas, c'est à dire d'aller dans l'éditeur te placer à la première ligne de Planning_Absence et d'appuyer sur F8, tu pourras suivre le cheminement de la procédure.

Ensuite pour Nom_Absent, tu peux faire une recherche dans l'éditeur avec Ctrl+F et sélectionner dans le projet.
Tu remarqueras que la valeur est définit quand tu valides l'userform.

Pour le UBound, je place la zone des dates et des horaires sous forme de tableau Range_Donnees et Range_Dates.
LBound est la limite inférieure et UBound la limite supérieure (en gros la dernière ligne), soit le nombre de lignes qui seront utilisées.
 

Averell1976

XLDnaute Junior
Re : Transfet de données d'une ligne d'un fichier vers une colonne d'un autre fichier

Merci, j'ai compris, c'était en effet pas sorcier.
Je bricoles encore certaines choses pour l'améliorer.
Mais ton aide m'a été très très bénéfique.
Merci à toi.

Averell
 

Discussions similaires

Statistiques des forums

Discussions
312 082
Messages
2 085 170
Membres
102 805
dernier inscrit
emes