IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Copier les données du fichier (fermé) le plus récent d'un dossier dans un autre classeur excel


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Janvier 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Janvier 2020
    Messages : 3
    Par défaut Copier les données du fichier (fermé) le plus récent d'un dossier dans un autre classeur excel
    Bonjour a tous,

    J'ai deja écris le code suivant qui fonctionne et qui me permet d'aller recupérer les données que je veux dans un classeur et de les copier dans un autre classeur mais aujourd'hui je voudrais que ma macro aille récupérer les données dans le dernier fichier créer/modifier du dossier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Sub PDPfrontimport()
     
    Dim wkA As Workbook, wkB As Workbook
    Dim chemin As String, fichier As String
    Dim j As Long
    Application.ScreenUpdating = False
    Set wkA = ThisWorkbook
    chemin = "\\serveur\data\Common\PIC & PDP\PDP\2020\"
    fichier = "PDP WK.04.2020.xlsx"
     
    Workbooks.Open chemin & fichier
    Set wkB = ActiveWorkbook
     j = wkB.Sheets("PDP").Range("A" & Rows.Count).End(xlUp).Row
     wkA.Sheets("PDP, Working Time & MOD INPUTS").Range("Z18:AE18" & j).Value = wkB.Sheets("PDP").Range("G18:L18" & j).Value
     wkA.Sheets("PDP, Working Time & MOD INPUTS").Range("Z20:AE20" & j).Value = wkB.Sheets("PDP").Range("G20:L20" & j).Value
     
     
    wkB.Close True
    Sheets("PDP, Working Time & MOD INPUTS").Activate
     Application.ScreenUpdating = True
    End Sub
    Pour cela j'ai potentiellement deux solutions :

    Le fichier dans lequel je vais récupérer les données se nomme "PDP WK.04.2020" et une copie s'ajoute dans le dossier en s'incrémentant chaque semaine en fonction du numéro de semaine (ex: semaine 5 sera "PDP WK.05.2020", semaine 6 sera "PDP WK.05.2020" etc). Je dois mettre à jour le classeur dans lequel j'ai fait la macro hebdomadairement, par conséquent chaque semaine le fichier dans lequel je vais récupérer mes données change de nom.

    - Premiere solution serait de pouvoir aller recupérer les données du bon fichier en ouvrant un inputbox demandant de taper le numero de semaine
    - Deuxième solution qui pour moi serait plus simple à coder, ce serait d'aller récupérer les données dans le fichier en fonction de sa derniere date de mofication ou sa date de création pour être sûr d'avoir les données du dernier fichier.

    Ma question est donc comment intégrer dans mon code actuel l'une de ses deux fonction additionnelle, lorsque je définit la variable fichier.

    Merci par avance de votre aide

  2. #2
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonsoir,

    1 - Le numéro de semaine s'obtient facilement, soit par le tableur Excel, soit par VBA
    2 - Pour définir le fichier le plus récent d'un répertoire, il suffit de
    boucler sur tous ceux qui le composent
    constituer un tableau trié par ordre décroissant de date de création
    considérer le 1er élément
    Ce processus est présenté dans la FAQ au chapitre concernant les fichiers

  3. #3
    Candidat au Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Janvier 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Janvier 2020
    Messages : 3
    Par défaut
    Merci beaucoup pour cette réponse rapide.


    En utilisant ta deuxieme solution qui me parait la plus adaptée. J'ai essayé de constituer le tableau comme décrit dans la procédure mais je pense mal l'incorporer dans mon code de base. Cela me marque erreur de compilation.

    Cela ne fonctionne pas.

    Ps : je suis novice en VBA

    Merci encore pour l'aide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    Sub PDPfrontimport()
     
     
    Dim wkA As Workbook, wkB As Workbook
     
    Dim j As Long
    Application.ScreenUpdating = False
    Set wkA = ThisWorkbook
     
     
    Sub triDecroissant_Fichiers_DateDreation()
        Dim Fichier As String, Chemin As String
     
        Dim Fso As Scripting.FileSystemObject
        Dim FileItem As Scripting.File
        Dim Tableau()
        Dim Plage As Range
        Dim m As Integer, i As Integer
        Dim z As Byte, Valeur As Byte
        Dim Cible As Variant
     
        '---liste les fichiers du répertoire ---
        Chemin = "\\serveur\data\Common\PIC & PDP\PDP\2020\"
        Fichier = Dir(Chemin & "\*.xlsx*")
     
        'Boucle sur les fichiers
        Do
     
            m = m + 1
            ReDim Preserve Tableau(1 To 2, 1 To m)
            Tableau(1, m) = Fichier
     
            Set Fso = CreateObject("Scripting.FileSystemObject")
            Set FileItem = Fso.GetFile(Chemin & "\" & Fichier)
     
            'Récupère la date de création
            Tableau(2, m) = Left(FileItem.DateLastModified, 10)
            'Pour récupérer la date de dernière modification
            'Tableau(2, m) = Left(FileItem.DateLastModified, 10)
            'Pour récupérer la taille du fichier
            'Tableau(2, m) = Left(FileItem.Size, 10)
     
            Fichier = Dir
        Loop Until Fichier = ""
     
     
        '---Trie les fichiers par ordre décroissant de création ---
        Do
            Valeur = 0
            For i = 1 To m - 1
                If CDate(Tableau(2, i)) < CDate(Tableau(2, i + 1)) Then
                    For z = 1 To 2
                        Cible = Tableau(z, i)
                        Tableau(z, i) = Tableau(z, i + 1)
                        Tableau(z, i + 1) = Cible
                    Next z
     
                    Valeur = 1
                End If
            Next i
        Loop While Valeur = 1
    End Sub
     
     
    Workbooks.Open Chemin & Fichier
    Set wkB = ActiveWorkbook
     j = wkB.Sheets("PDP").Range("A" & Rows.Count).End(xlUp).Row
     wkA.Sheets("PDP, Working Time & MOD INPUTS").Range("Z18:AE18" & j).Value = wkB.Sheets("PDP").Range("G18:L18" & j).Value
     wkA.Sheets("PDP, Working Time & MOD INPUTS").Range("Z20:AE20" & j).Value = wkB.Sheets("PDP").Range("G20:L20" & j).Value
     
     
    wkB.Close True
    Sheets("PDP, Working Time & MOD INPUTS").Activate
     Application.ScreenUpdating = True
     
    End Sub

  4. #4
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonjour Aurélien, Bonjour le Forum,

    Les fichiers alimentant le tableau étant triés, il te faut ouvrir le 1er élément de celui-ci
    Soit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim lasource as String
    lasource = "Chemin" & Application.PathSeparator & Tableau(LBound(Tableau()), 1)
     
    Workbooks.Open Filename:=lasource
    Ici,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tableau(LBound(Tableau()), 1)
    désigne le 1er élément (Lbound) de la 1ère dimension de Tableau, soit le nom du dernier fichier créé.

    L'argument Filename de la méthode Open est la concaténation du nom de répertoire et de ce nom de fichier séparé par, généralement, "\" (PathSeparator)

  5. #5
    Candidat au Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Janvier 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Janvier 2020
    Messages : 3
    Par défaut
    Bonjour,

    Merci pour ta réponse et ton aide.

    Mais à quel endroit dois-je mettre le code que tu me dis ?

    Autre question comment incorporer ce tableau dans mon code initial ?

    Une fois que j'ai mon code pour le tableau qui me permet de trier mes dossiers et de faire remonter le premier en date, comment je fais pour aller recuperer les données dont j'ai besoin ?

    Dans mon code de base c'etait simple car j'allais juste chercher un dossier precis dans un répertoire et je faisais corespondre les cellules avec mon classeur ouvert.

    Là je t'avoue ne pas voir comment lier les deux codes.

  6. #6
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonjour Aurélien, Bonjour le Forum,

    Mais à quel endroit dois-je mettre le code que tu me dis ?

    Autre question comment incorporer ce tableau dans mon code initial ?
    Logiquement.
    Une fois le fichier le lus récent déterminé, tu l'ouvres et tu y affectes les méthodes de ton choix.

    Si tu regardes bien le code reporté à mon dernier poste, alors tu verras que l'élément 1 du tableau (Lbound) est utilisé comme paramètre de l'instruction Open.

    Une fois utilisé, il pourra être fermé sans changement (paramètre SaveChanges à Faux)

    Nota: Personnellement, je ne suis pas fan de travailler sur des fichiers fermés.

Discussions similaires

  1. [XL-2016] Copier les données d'un classeur vers un fichier fermé
    Par sebing dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 21/02/2019, 15h38
  2. Copier un champs de cellules dans un autre classeur Excel
    Par sylvain5923 dans le forum VB.NET
    Réponses: 0
    Dernier message: 06/01/2012, 14h19
  3. Réponses: 12
    Dernier message: 09/06/2008, 17h54
  4. Réponses: 2
    Dernier message: 19/03/2007, 17h38
  5. Réponses: 1
    Dernier message: 05/12/2006, 10h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo