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 :

renommer un fichier excel


Sujet :

Macros et VBA Excel

  1. #21
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    hey hey!! hey!!!

    et voila la première version qui fonctionne
    en premier lieu on ajoute un sheets"brouillon" par macro pour copier le contenu du presse papier puisque l'on utilisera le control "c" sur le pdf

    j'ai repris pour les fichiers excel la macro que je t'avais faite puisqu'elle fonctionne parfaitement bien
    je l'ai placer dans un select case ça semblait te convenir

    ensuite pour les pdfs j'ai utiliser la méthode avec le sendkey
    pour la simple et bonne raison que les données copiées dans le sheets"brouillon" ne sont pas des hiéroglyphes comme les autre méthodes

    j'utilise certaines apis pour le shell (excecution d'une application)
    les apis pour les fenêtres pour gérer la fermeture d'adobe reader

    j'ai volontairement séparé la sub de la fonction en ce qui concerne les pdfs
    au cas ou on devrait (changer ,améliorer,modifier) la méthode

    ça évitera de réécrire tout le code
    tu devra adapter ton chemin bien sur moi j'ai travailler sur un dossier que j'ai placer sur le bureau

    et voila c'est moi le meilleur
    et voila le code

    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
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    Option Explicit
    Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    Private Const WM_CLOSE As Long = &H10
    Private Const HTCAPTION As Long = 2&
    Dim chemin As String, filtre As String, NomDeLafenetre As String, url As String, fichiers As String
    Dim lHwnd As Long
    Dim tableau
    Dim AncienNom As String, NouveauNom As String
    Dim sh As Worksheet
    Dim objFSO As Object
    Sub change_le_nom_des_xls()
    'on bloque les fenetres d'avertissements on en a pas besoins
        Application.ScreenUpdating = False
        Application.DisplayAlerts = False
        'ICI ON VA AJOUTER UN SHEETS QUI VANOUS SERVIR A RECUPERER LES DONNEES DES PDFS ON L APPELERA "brouillon"
        'au cas ou brouillon existe on le supprime
        For Each sh In Worksheets
            If sh.Name = "brouillon" Then sh.Delete
        Next
        'on l'ajoute
        Sheets.Add After:=Sheets(Sheets.Count)
        Sheets(Sheets.Count).Name = "brouillon"
     
     
        chemin = "C:\Users\Patrick\Desktop\dossier test\"    ' chemin a adapter
        'on va lister tout les fichiers de type excel en filtrant l'extention
        filtre = "*.*"    ' ou le filtre que tu veux ... par exemple "*.txt" ou même "toto*.*"
     
        fichiers = Dir(chemin & filtre, vbNormal Or vbHidden)    'on prend meme ce qui sont caché
        'c'est parti
        Do While fichiers <> ""    '
     
            Select Case Right(fichiers, 3)
            Case "xls"
                Workbooks.Open (chemin & fichiers)
     
                'on sauve le classeur sous le nom
                ActiveWorkbook.SaveAs Filename:=chemin & Range("C22") & "_" & Range("C20") & "_" & Range("B8") & ".xls", _
                                      FileFormat:=xlExcel8, Password:="", WriteResPassword:="", _
                                      ReadOnlyRecommended:=False, CreateBackup:=False
                ActiveWorkbook.Close
                'on va supprimer le fichier portant l'ancien nom
                Set objFSO = CreateObject("Scripting.FileSystemObject")
                objFSO.DeleteFile (chemin & fichiers)
     
                'POUR LES PDFS
            Case "pdf"
                'ICI ON REPREND LE CHEMIN ET LE FICHIER POUR DETERMINER L ANCIEN NOM
                AncienNom = chemin & fichiers
                Sheets("brouillon").Cells.Clear
                'Vérifie si le fichier à renommer existe.
                If Dir(AncienNom) = "" Then Exit Sub
                'Renomme le fichier avec la fonction "nouveau_name_de_Pdf" que j'ai créé pour toi
                NouveauNom = nouveau_name_de_Pdf(chemin, fichiers)
                'on copy le fichier au meme encroit sous le nom que je recupère avec la premiere ligne ecrit dans le pdf  a adapter
                FileCopy AncienNom, NouveauNom
     
                '*********
                ' on peut supprimer maintenant  l'ancien fichier
                Set objFSO = CreateObject("Scripting.FileSystemObject")
                objFSO.DeleteFile (AncienNom)
            End Select
            fichiers = Dir
        Loop
        'on supprime le sheets brouillon on en a plus besoins
        Sheets("brouillon").Delete
    End Sub
     
     
     
    'ici la fonction qui va chercher la premiere ligne dans le pdf _
     il y a de forte chance que ca soit le titre du document pdf a adapter a ton cas bien sur
    Function nouveau_name_de_Pdf(lechemin, lenom) As String
        url = lechemin & lenom    'Adapter à votre fichier
    'Ouvrir le fichier pdf avec le programme approprié
        ShellExecute 0&, vbNullString, url, vbNullString, vbNullString, vbNormalFocus
        'Attendre 2 secondes que la fenetre soit entierement activée
               Application.Wait (Now + TimeValue("0:00:02"))
        ' ici il faudra peut etre adapter a ton logiciel de lecture des pdfs mais en general c'est celui la_
        'pour le savoir tu ouvre directement un pdf et en haut de la fenetre en titre tu a le nom de ton fichier suivie un tiret et le nom de l'application c'est celui qu'il faut metre
        NomDeLafenetre = "Adobe Reader"
      lHwnd = FindWindow(vbNullString, lenom & " - " & "Adobe Reader")
         'Donner le focus à Acrobat Reader ou ton logiciel de lecture de tes pdfs
        'on active le fenetre pdf en premier plan
        AppActivate NomDeLafenetre  'on selectionne tout
        'on Sélectionne tout avec CTRL-A
        SendKeys "^{a}"
     
        'AppActivate NomDeLafenetre
        SendKeys "^{c}"    'Copier avec CTRL-C
        Application.Wait (Now + TimeValue("0:00:02"))
        AppActivate "Microsoft Excel"    'Redonner le focus à Excel
        Sheets("brouillon").Select
        Sheets("brouillon").Range("A1").Select
        ActiveSheet.Paste
        nouveau_name_de_Pdf = lechemin & Replace(Range("a1").Text, ".", "") & ".pdf"
       'on va fermer la fenetre de adobe reader sinon on poura pas supprimer le fichier pdf  portant l'ancien nom car il est utilisé
                'pour cela on va utiliser les apis windows en captant le handle de la fenetre adobe reader et simuler la fermeture par la croix
     
                    Call SendMessage(lHwnd, WM_CLOSE, HTCAPTION, ByVal 0&) 'on ferme adobe reader
     
     
    End Function
    a toi maintenant a tu trouvé une solution différente

    trop facile

    au plaisir
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  2. #22
    Membre très actif
    Homme Profil pro
    Etudiant
    Inscrit en
    Janvier 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 118
    Par défaut
    Bonjour et Merci Patrick

    Cela semble sur le chemin de fonctionner mais ça ne renomme pas mes fichiers pdf qui sont dans mon classeur. J'ai quelques questions sur ton codes pour comprendre et le travailler:

    -Quand je le lance un fichier pdf s'ouvre et selectionne le text puis rien... Normalement ton code copie le PDF a partir de la cellule A1?

    -Pour plus de simplicité (pke là ça me semble un brin complexe) j'aimerais juste que mes pdf vienne dans mon dossier (ça c'est déjà fait je les extrait de ma boite mail) SI en A19 j'ai "Date" = la date de la veille. Par exemple j'ai ça en A19 avec les pdf quand je l'ai copie sur excel à la main :

    Date APR 19 2012.

    J'ai une fonction Veille mais reconnaitra t-elle APR 19 2012 sur un excel?

    Vois tu ce que je veux dire? En fait je pense que c'est un peu dur de changer les nom des fichiers parce que il faut prendre en A9 le 4eme caractere ect ect je ne sais pas si c'est possible. Enregistrer dans mon classeur que les piece jointe pdf qui en A19 en marqué la date de la veille me parait plus simple. (Pour l'instant j'ai toute les piece jointe pdf).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Function Veille() As Date
    Dim d As Byte
     
    d = DatePart("w", Date, vbSunday)                'Si Date est Dimanche ou Lundi, on prend Vendredi comme étant la veille. 'Sinon, on prend j-1
    Veille = Date - IIf(d <= 2, d + 1, 1)
    End Function
    Merci encore et have a good day!

  3. #23
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut
    bonjour naoned005

    excuses moi j'ai eu beaucoup de boulot ces deux derniers jours

    oui alors si sa ne renomme pas le fichier pdf c'est que en range a1 il y a rien
    tu peut simplement ajouter dans la fonction a la place de a1

    =cells(activesheet.range("a65635").end(xldown).row,1)' te donne la première cellule rempli lorsque tu a copier le pdf dans excel( dans le sheets brouillon bien sur )

    a tu compris cette fois ci

    a ne pas oublier que a chaque fois il te faut changer le saves as qui n'est pas le meme que le mien (toi 2003 moi 2007)
    et il est vrai que plus on avance plus le code va se compliquer
    si tu ne comprend pas une ligne de code tu n'a qu'a demander

    ensuite pour la date en anglais j'avoue que je gère mal les dates comme ça
    cela dis on peut créer des array pour les mois

    je vais regarder ça

    au plaisir
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  4. #24
    Membre très actif
    Homme Profil pro
    Etudiant
    Inscrit en
    Janvier 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 118
    Par défaut
    Bonjour Patrick

    C'est bon ça marche nickel de chez nickel. Merci

    J'explique quand même parce qu'il me semble qu'après ça va se corser (on a l'hab je sais mais bon)

    Voici le code déjà

    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
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    Option Explicit
    Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    Private Const WM_CLOSE As Long = &H10
    Private Const HTCAPTION As Long = 2&
    Dim chemin As String, filtre As String, NomDeLafenetre As String, url As String, fichiers As String
    Dim lHwnd As Long
    Dim tableau
    Dim AncienNom As String, NouveauNom As String
    Dim sh As Worksheet
    Dim objFSO As Object
    Sub change_le_nom_des_xls()
    'on bloque les fenetres d'avertissements on en a pas besoins
        Application.ScreenUpdating = False
        Application.DisplayAlerts = False
        'ICI ON VA AJOUTER UN SHEETS QUI VANOUS SERVIR A RECUPERER LES DONNEES DES PDFS ON L APPELERA "brouillon"
        'au cas ou brouillon existe on le supprime
        For Each sh In Worksheets
            If sh.Name = "brouillon" Then sh.Delete
        Next
        'on l'ajoute
        Sheets.Add After:=Sheets(Sheets.Count)
        Sheets(Sheets.Count).Name = "brouillon"
     
     
        chemin = "Z:\Risques et documentation OPCVM\Rapprochement Front Back\Confirmation Trades\Essai\"    ' chemin a adapter
        'on va lister tout les fichiers de type excel en filtrant l'extention
        filtre = "*.*"    ' ou le filtre que tu veux ... par exemple "*.txt" ou même "toto*.*"
     
        fichiers = Dir(chemin & filtre, vbNormal Or vbHidden)    'on prend meme ce qui sont caché
        'c'est parti
        Do While fichiers <> ""    '
     
     
                'POUR LES PDFS
     
                'ICI ON REPREND LE CHEMIN ET LE FICHIER POUR DETERMINER L ANCIEN NOM
                AncienNom = chemin & fichiers
                Sheets("brouillon").Cells.Clear
                'Vérifie si le fichier à renommer existe.
                If Dir(AncienNom) = "" Then Exit Sub
                'Renomme le fichier avec la fonction "nouveau_name_de_Pdf" que j'ai créé pour toi
                NouveauNom = nouveau_name_de_Pdf(chemin, fichiers)
                'on copy le fichier au meme encroit sous le nom que je recupère avec la premiere ligne ecrit dans le pdf  a adapter
                FileCopy AncienNom, NouveauNom
     
                '*********
                ' on peut supprimer maintenant  l'ancien fichier
                Set objFSO = CreateObject("Scripting.FileSystemObject")
                objFSO.DeleteFile (AncienNom)
     
            fichiers = Dir
        Loop
        'on supprime le sheets brouillon on en a plus besoins
        Sheets("brouillon").Delete
    End Sub
     
     
     
    'ici la fonction qui va chercher la premiere ligne dans le pdf _
     il y a de forte chance que ca soit le titre du document pdf a adapter a ton cas bien sur
    Function nouveau_name_de_Pdf(lechemin, lenom) As String
        url = lechemin & lenom    'Adapter à votre fichier
    'Ouvrir le fichier pdf avec le programme approprié
        ShellExecute 0&, vbNullString, url, vbNullString, vbNullString, vbNormalFocus
        'Attendre 2 secondes que la fenetre soit entierement activée
               Application.Wait (Now + TimeValue("0:00:02"))
        ' ici il faudra peut etre adapter a ton logiciel de lecture des pdfs mais en general c'est celui la_
        'pour le savoir tu ouvre directement un pdf et en haut de la fenetre en titre tu a le nom de ton fichier suivie un tiret et le nom de l'application c'est celui qu'il faut metre
        NomDeLafenetre = "Adobe Reader"
      lHwnd = FindWindow(vbNullString, lenom & " - " & "Adobe Reader")
         'Donner le focus à Acrobat Reader ou ton logiciel de lecture de tes pdfs
        'on active le fenetre pdf en premier plan
        AppActivate NomDeLafenetre  'on selectionne tout
        'on Sélectionne tout avec CTRL-A
        SendKeys "^{a}"
     
        'AppActivate NomDeLafenetre
        SendKeys "^{c}"    'Copier avec CTRL-C
        Application.Wait (Now + TimeValue("0:00:02"))
        AppActivate "Microsoft Excel"    'Redonner le focus à Excel
        Sheets("brouillon").Select
        Sheets("brouillon").Range("A1").Select
        ActiveSheet.Paste
        nouveau_name_de_Pdf = lechemin & Replace(Range("a1").Text, ".", "") & ".pdf"
       'on va fermer la fenetre de adobe reader sinon on poura pas supprimer le fichier pdf  portant l'ancien nom car il est utilisé
                'pour cela on va utiliser les apis windows en captant le handle de la fenetre adobe reader et simuler la fermeture par la croix
     
                    Call SendMessage(lHwnd, WM_CLOSE, HTCAPTION, ByVal 0&) 'on ferme adobe reader
     
     
    End Function
    Donc il me renomme mes fichiers PDF qui sont dans le classeur Essai par ce qui est marqué dans la cellule A1 du "brouillon" (toujours la meme chose pke c'est une formule juridique ...) bon le principal c'est que ça fonctionne!

    Apres j'ai réflechi un peu à l'architecture et ça me parait compliqué puisqu'il faudrait

    1) Prendre uniquement ceux de la veille pour renommer le fichier PDF (2):

    Avec la cellule A32 (à partir du 15eme caractere jusqu'au 20 eme) "_"
    Avec la cellule A29 (à partir du 10eme caracter jusqu'au 13eme) "_"
    Avec la cellulle A20 à partir du 5eme caractere "_"
    Avec la cellulle A30 à partir du 11 caractere "_"



    Donc je ne sais pas si l'étape du renommage(2) est possible et je pensais peut etre faire juste la 1) Prendre uniquement ceux de la veille

    Ne serait-il pas plus simple en effet de selctionner le pdf, le copier/coller sur excel (grace a ta macro) mais au lieux d'essayer de renommer le pdf, de juste le supprimer si en A30 la date indiquée n'est pas celle de la veille?

    les dates sont toujours marquées sous se format en A30: Trade Date MAY 07 2012. On pourrais donc faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If Range ("A30") <> Trade Date + Veille Then
    ect ect
    Ainsi apres forcement il y a la tache du renommage a faire soi même mais il ne reste plus que les PJ PDF de la veille dans le classeur!


    M. le Toulonais quelles pistes vous parrait le plus envisageable?

    Merci encore et have a good day

  5. #25
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bon a ce que je voit tu modifie tout le temps les constantes pour enregistrer les xls

    alors j'ai un peu remanier mon code a fin de ne pas avoir a réécrire le code a chaque fois

    maintenant il y a deux fonction qui sont appelées par la sub

    pour les xls et l'autre pour les pdfs

    maintenant pour modifier les condition ulterieures de nouveau nom se regeleront en changant rien que le code dans les fonction respectives en fonction de l'extention du fichier (xls ou pdf)
    voila le code
    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
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    Option Explicit
    'api kernel pour lancer l'execution d'un programe externe
    Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
    'apis windows pour gérer la recherche de l'identifiant de la fenetre (handle)
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    'apis window pour gérer les simulation de click sur les boutons de la caption
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    'apis window pour gérer les affichage des fenetre
    Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
    'constante représentant la position des fenetres
    Private Const WM_CLOSE As Long = &H10
    Private Const HTCAPTION As Long = 2&
    ' variable servant a nommer le handle obtenue avec findwindow
    Dim lHwnd As Long
    'variable diverses
    Dim chemin As String, filtre As String, NomDeLafenetre As String, url As String, fichiers As String
     
    Dim tableau
    Dim AncienNom As String, NouveauNom As String
    Dim sh As Worksheet
    Dim objFSO As Object
    Sub change_le_nom_des_xls()
    'on bloque les fenetres d'avertissements on en a pas besoins
        Application.ScreenUpdating = False
        Application.DisplayAlerts = False
        For Each sh In Worksheets
            If sh.Name = "brouillon" Then sh.Delete
        Next
        'on l'ajoute
        Sheets.Add After:=Sheets(Sheets.Count)
        Sheets(Sheets.Count).Name = "brouillon"
     
     
        chemin = "C:\Users\Patrick\Desktop\dossier test\"    ' chemin a adapter
        'on va lister tout les fichiers de type excel en filtrant l'extention
        filtre = "*.*"    ' ou le filtre que tu veux ... par exemple "*.txt" ou même "toto*.*"
     
        fichiers = Dir(chemin & filtre, vbNormal Or vbHidden)    'on prend meme ce qui sont caché
        'c'est parti
        Do While fichiers <> ""    '
            NouveauNom = ""
            Sheets("brouillon").Cells.Clear
     
            Select Case Right(fichiers, 3)
            Case "xls"
     
                AncienNom = chemin & fichiers
                'on créé le nouveau nom  avec la fonction "nouveau_name_de_XLS" que j'ai créé pour toi plus bas
                NouveauNom = nouveau_name_de_XLS(chemin, fichiers)
                'on copy le fichier sous le nouveau nom au meme endroit
                FileCopy AncienNom, NouveauNom
                'on va supprimer le fichier portant l'ancien nom
                Set objFSO = CreateObject("Scripting.FileSystemObject")
                objFSO.DeleteFile (chemin & fichiers)
     
                'POUR LES PDFS
            Case "pdf"
                'ICI ON REPREND LE CHEMIN ET LE FICHIER POUR DETERMINER L ANCIEN NOM
                AncienNom = chemin & fichiers
                'Renomme le fichier avec la fonction "nouveau_name_de_Pdf" que j'ai créé pour toi plus bas
                'en lui envoyant comme argument le chemin du dossier et l'ancien nom
                NouveauNom = nouveau_name_de_Pdf(chemin, fichiers)
                'on copy le fichier au meme encroit sous le nom que je recupère avec la premiere ligne ecrit dans le pdf  a adapter
                FileCopy AncienNom, NouveauNom
     
                ' on peut supprimer maintenant  l'ancien fichier
                Set objFSO = CreateObject("Scripting.FileSystemObject")
                objFSO.DeleteFile (AncienNom)
            End Select
            fichiers = Dir
        Loop
        'on supprime le sheets brouillon on en a plus besoins
        Sheets("brouillon").Delete
    End Sub
     
     
     
     
     
    '***************************************************************************************************************
    '                                    FONCTION QUI VA CONSTRUIRE LE NOUVEAU NOM                                 *
    '                          EN RECUPERANT LES VALEURS DANS LES CELLULES DE REFERENCES                           *
    '***************************************************************************************************************
    Function nouveau_name_de_XLS(lechemin, lenom) As String                                                       '*
        Workbooks.Open (lechemin & lenom)    'OUVRE LE FICHIER XLS cité par les deux arguments(chemin & fichiers)'*
    'on va construire le nouveau nom avec les cellules de reference                                                *
        nouveau_name_de_XLS = lechemin & Range("C22") & "_" & Range("C20") & "_" & Range("B8") & ".xls"             '*
        ActiveWorkbook.Close    'on ferme le fichier que l'on viens d'ouvrir on en a plus besoins                 '*
    End Function                                                                                                  '*
    '***************************************************************************************************************
    '---------------------------------------------------------------------------------------------------------------
    '---------------------------------------------------------------------------------------------------------------
    '*********************************************************************************************************
    '                       FONCTION QUI VA CHERCHER LA CELLULE DE REFERENCE POUR RENOMER UN PDF             *
    '                          EN COPIANT LE PDF DANS UN SHEET PROVISOIRE "brouillon"                        *
    '*********************************************************************************************************
    Function nouveau_name_de_Pdf(lechemin, lenom) As String                                                 '*
        url = lechemin & lenom    'Adapter à votre fichier                                                   *
    'Ouvrir le fichier pdf avec le programme approprié                                                       *
        ShellExecute 0&, vbNullString, url, vbNullString, vbNullString, vbNormalFocus                       '*
    'Attendre 2 secondes que la fenetre soit entierement activée                                             *
        Application.Wait (Now + TimeValue("0:00:02"))                                               '        *
    ' ici il faudra peut etre adapter a ton logiciel de lecture des pdfs mais en general c'est celui la      *
    'pour le savoir tu ouvre directement un pdf et en haut de la fenetre en titre tu a le nom de             *
    'ton fichier suivie un tiret et le nom de l'application c'est celui qu'il faut metre                     *
        NomDeLafenetre = lenom & " - " & "Adobe Reader"                                                     '*
        lHwnd = FindWindow(vbNullString, NomDeLafenetre)                                                    '*
    'Donner le focus à Acrobat Reader ou ton logiciel de lecture de tes pdfs                                '*
    'on active le fenetre pdf en premier plan                                                                *
        AppActivate NomDeLafenetre  'on selectionne tout                                                     *
        SendKeys "^{a}"     'on Sélectionne tout avec CTRL-A                                                 *                                                                                  '*
        SendKeys "^{c}"    'Copier avec CTRL-C                                                               *
        ShowWindow lHwnd, 6    'on minimise la fentre on s'en fou de voir ce qui s'y passe                   *
        Application.Wait (Now + TimeValue("0:00:02"))                                                       '*
        AppActivate "Microsoft Excel"    'Redonner le focus à Excel                                          *
        Sheets("brouillon").Select      ' on selectionne le sheets brouillon                                '*
        Sheets("brouillon").Range("A1").Select    'on se positionne sur la cellule a1                       '*
        ActiveSheet.Paste                  'on colle se que l'on a copier dans le pdf                       '*
    'on va fermer la fenetre de adobe reader sinon on poura pas supprimer le fichier pdf  portant            *
    ' l 'ancien   'nom car il est utilisé  pour cela on va utiliser les apis windows en captant              *
    'le handle de la fenetre adobe reader et simuler la fermeture par la croix                               *
        Call SendMessage(lHwnd, WM_CLOSE, HTCAPTION, ByVal 0&)    'on ferme adobe reader                     *
    '                                                                                                        *
    'LE NOUVEAU NOM CHEMIN COMPLET COMPORTERA LE CHEMIN DU DOSSIER INITIAL ET                                *
    'LA VALEUR DE LA CELLULE DE REFERENCE EN L'OCURENCE ICI LA CELLULE "A1" 'a adapter!!!!!                  *
        nouveau_name_de_Pdf = lechemin & Replace(Range("a1").Text, ".", "") & ".pdf"                        '*
    End Function    '                                                                                        *
    '*********************************************************************************************************
    toi tu n'a plus qu'a adapter le chemin du dossier et le save as a xlnormal(moi )

    essaie dabord celui ci
    ensuite on verra les modifications des cellules ca me parait pas bien compliqué

    on verra ensuite pour les date en anglais

    bon pour les pdfs

    tu dis :
    Apres j'ai réflechi un peu à l'architecture et ça me parait compliqué puisqu'il faudrait

    1) Prendre uniquement ceux de la veille pour renommer le fichier PDF (2):

    Avec la cellule A32 (à partir du 15eme caractere jusqu'au 20 eme) "_"
    Avec la cellule A29 (à partir du 10eme caracter jusqu'au 13eme) "_"
    Avec la cellulle A20 à partir du 5eme caractere "_"
    Avec la cellulle A30 à partir du 11 caractere "_"
    donne moi pluto un exemple de nom je ferais le reste
    on va utiliser pour cela la fonction split voir "mid" sur le texte des cellules
    attention quand meme a ne pas oublier que les nom ne doivent pas comporter des caracteres particulier tel que des (slach ,;,:,_,ect...)

    allez essaie le vite demain je reprend le boulot pour 2 jours non stop
    je pourrais pas revenir avant jeudi en soirée

    au plaisir
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  6. #26
    Membre très actif
    Homme Profil pro
    Etudiant
    Inscrit en
    Janvier 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 118
    Par défaut
    Merci patrick! Je vois ce que tu veux dire pour les fonctions, ça serait plus propre, mais je trouve plus simple de travailler avec deux sub pour l'instant

    On avance step by step (mais je garde tes fonctions et tes case dans un coin du bureau) et derniere je modifie des trucs mais c'est pour pas embrouiller avec des détails (par exemple je voulais des titre de piece jointe de ce genre là AXA_BUY_M_20120407, ce que j'ai obtenu en changeant un peu la macro)

    PS: J'ai excel 2010 maintenant!

    Pour les xls. C'est pratiquement fini. Voici la sub (qui marche du tonnerre)

    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
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    Sub change_le_nom_des_xls()
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
     
      Dim chemin As Variant
    Dim filtre As Variant
    Dim fichiers As Variant
    Dim Workbook As Variant
    Dim objFSO As Variant
     
     
     
    chemin = "Z:\Risques et documentation OPCVM\Rapprochement Front Back\Confirmation Trades\Essai\"                        ' chemin a adapter
       'on va lister tout les fichiers de type excel en filtrant l'extention
       filtre = "*.xls" ' ou le filtre que tu veux ... par exemple "*.txt" ou même "toto*.*"
     
       fichiers = Dir(chemin & filtre, vbNormal Or vbHidden) 'on prend meme ce qui sont caché
       'c'est parti
       Do While fichiers <> "" '
     
        Workbooks.Open (chemin & fichiers)
     
     
        If Range("B13") = "" Then
     
        'Macro pour la date et le sens de l'odre
     
        Range("E15") = "=YEAR(R[-8]C[-3])"
     
        Range("F15") = "=MONTH(R[-8]C[-4])"
     
        Range("G15") = "=DAY(R[-8]C[-5])"
     
        Range("D25") = "=R[-10]C[1]&R[-10]C[2]&R[-10]C[3]"
     
        If Range("C20") = "Vente" Then Range("C20").Value = "SELL"
        If Range("C20") = "Achat" Then Range("C20").Value = "BUY"
     
      'on sauve le classeur sous le nom
        ActiveWorkbook.SaveAs Filename:=chemin & Range("C22") & "_" & Range("C20") & "_" & Range("B8") & "_" & Range("D25") & ".xls", FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
            ReadOnlyRecommended:=False, CreateBackup:=False
     ActiveWorkbook.Close
     
       'on va supprimer le fichier portant l'ancien nom
       Set objFSO = CreateObject("Scripting.FileSystemObject")
    objFSO.DeleteFile (chemin & fichiers)
     
         fichiers = Dir
     
     
     
       End If
     
       If Range("B13") = "OPERATION N°" Then
     
       'Macro pour la date et le sens de l'ordre
     
       Range("E15") = "=YEAR(R[-7]C[-3])"
     
        Range("F15") = "=MONTH(R[-7]C[-4])"
     
        Range("G15") = "=DAY(R[-7]C[-5])"
     
        Range("D25") = "=R[-10]C[1]&R[-10]C[2]&R[-10]C[3]"
     
     
        If Range("C20") = "Vente" Then Range("C20").Value = "SELL"
        If Range("C20") = "Achat" Then Range("C20").Value = "BUY"
     
     
       'on sauve le classeur sous le nom
        ActiveWorkbook.SaveAs Filename:=chemin & Range("C22") & "_" & Range("C20") & "_" & Range("B9") & "_" & Range("D25") & ".xls", FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
            ReadOnlyRecommended:=False, CreateBackup:=False
     ActiveWorkbook.Close
     
       'on va supprimer le fichier portant l'ancien nom
       Set objFSO = CreateObject("Scripting.FileSystemObject")
    objFSO.DeleteFile (chemin & fichiers)
     
     fichiers = Dir
     
     End If
     
     Loop
     
    End Sub
    Il ne reste plus qu'à supprimer le fichier si en C16 il n'y a pas la date de la veille. C'est ce dont je parlais plus haut!

    Pour faire cela je ferais:

    Apres cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Workbooks.Open (chemin & fichiers)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        If Range("C16") <> Veille Then
     
    Set wk = Workbooks.Open(chemin & fichiers)
    wk.Close
     
     
     wk.Delete
     
     End If
    (ma fonction Veille est plus haut je ne la remet pas) mais ça ne fonctionne pas. C'est juste ce petit truc qui me dérange sur les xls



    Maintenant sur les pdf

    Voici la sub qui fonctionne aussi

    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
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    Option Explicit
    Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    Private Const WM_CLOSE As Long = &H10
    Private Const HTCAPTION As Long = 2&
    Dim chemin As String, filtre As String, NomDeLafenetre As String, url As String, fichiers As String
    Dim lHwnd As Long
    Dim tableau
    Dim AncienNom As String, NouveauNom As String
    Dim sh As Worksheet
    Dim objFSO As Object
    Sub change_le_nom_des_xls()
    'on bloque les fenetres d'avertissements on en a pas besoins
        Application.ScreenUpdating = False
        Application.DisplayAlerts = False
        'ICI ON VA AJOUTER UN SHEETS QUI VANOUS SERVIR A RECUPERER LES DONNEES DES PDFS ON L APPELERA "brouillon"
        'au cas ou brouillon existe on le supprime
        For Each sh In Worksheets
            If sh.Name = "brouillon" Then sh.Delete
        Next
        'on l'ajoute
        Sheets.Add After:=Sheets(Sheets.Count)
        Sheets(Sheets.Count).Name = "brouillon"
     
     
        chemin = "Z:\Risques et documentation OPCVM\Rapprochement Front Back\Confirmation Trades\Essai\"    ' chemin a adapter
        'on va lister tout les fichiers de type excel en filtrant l'extention
        filtre = "*.*"    ' ou le filtre que tu veux ... par exemple "*.txt" ou même "toto*.*"
     
        fichiers = Dir(chemin & filtre, vbNormal Or vbHidden)    'on prend meme ce qui sont caché
        'c'est parti
        Do While fichiers <> ""    '
     
     
                'POUR LES PDFS
     
                'ICI ON REPREND LE CHEMIN ET LE FICHIER POUR DETERMINER L ANCIEN NOM
                AncienNom = chemin & fichiers
                Sheets("brouillon").Cells.Clear
                'Vérifie si le fichier à renommer existe.
                If Dir(AncienNom) = "" Then Exit Sub
                'Renomme le fichier avec la fonction "nouveau_name_de_Pdf" que j'ai créé pour toi
                NouveauNom = nouveau_name_de_Pdf(chemin, fichiers)
                'on copy le fichier au meme encroit sous le nom que je recupère avec la premiere ligne ecrit dans le pdf  a adapter
                FileCopy AncienNom, NouveauNom
     
                '*********
                ' on peut supprimer maintenant  l'ancien fichier
                Set objFSO = CreateObject("Scripting.FileSystemObject")
                objFSO.DeleteFile (AncienNom)
     
            fichiers = Dir
        Loop
        'on supprime le sheets brouillon on en a plus besoins
        Sheets("brouillon").Delete
    End Sub
     
     
     
    'ici la fonction qui va chercher la premiere ligne dans le pdf _
     il y a de forte chance que ca soit le titre du document pdf a adapter a ton cas bien sur
    Function nouveau_name_de_Pdf(lechemin, lenom) As String
        url = lechemin & lenom    'Adapter à votre fichier
    'Ouvrir le fichier pdf avec le programme approprié
        ShellExecute 0&, vbNullString, url, vbNullString, vbNullString, vbNormalFocus
        'Attendre 2 secondes que la fenetre soit entierement activée
               Application.Wait (Now + TimeValue("0:00:02"))
        ' ici il faudra peut etre adapter a ton logiciel de lecture des pdfs mais en general c'est celui la_
        'pour le savoir tu ouvre directement un pdf et en haut de la fenetre en titre tu a le nom de ton fichier suivie un tiret et le nom de l'application c'est celui qu'il faut metre
        NomDeLafenetre = "Adobe Reader"
      lHwnd = FindWindow(vbNullString, lenom & " - " & "Adobe Reader")
         'Donner le focus à Acrobat Reader ou ton logiciel de lecture de tes pdfs
        'on active le fenetre pdf en premier plan
        AppActivate NomDeLafenetre  'on selectionne tout
        'on Sélectionne tout avec CTRL-A
        SendKeys "^{a}"
     
        'AppActivate NomDeLafenetre
        SendKeys "^{c}"    'Copier avec CTRL-C
        Application.Wait (Now + TimeValue("0:00:02"))
        AppActivate "Microsoft Excel"    'Redonner le focus à Excel
        Sheets("brouillon").Select
        Sheets("brouillon").Range("A1").Select
        ActiveSheet.Paste
        nouveau_name_de_Pdf = lechemin & Replace(Range("a1").Text, ".", "") & ".pdf"
       'on va fermer la fenetre de adobe reader sinon on poura pas supprimer le fichier pdf  portant l'ancien nom car il est utilisé
                'pour cela on va utiliser les apis windows en captant le handle de la fenetre adobe reader et simuler la fermeture par la croix
     
                    Call SendMessage(lHwnd, WM_CLOSE, HTCAPTION, ByVal 0&) 'on ferme adobe reader
     
     
    End Function
    Pour renommmer les fichiers comme je disais ça me parait compliqué car quand ta macro copie colle les fichier pdf sur excel, les informations pour faire un titre se trouve:

    A la cellule A32 (à partir du 15eme caractere jusqu'au 20 eme)
    A la cellule A29 (à partir du 10eme caracter jusqu'au 13eme)
    A la cellulle A20 à partir du 5eme caractere
    A la cellulle A30 à partir du 11eme caractere

    Donc vu que ça me paraissait complexe j'ai pensé juste récuperer automatiquement les fichier de la veille(pour les pdf aussi il y a une histoire de veille). Et apres il faudra les renommer manuellement (j'avoue je me décourage c'est pas tres tres bien )
    Petite difficulté supplémentaire: La date est marqué en A30 à partir du 11eme caractere sous la forme Trade Date 07 MAY 2012

    Allez pour le plaisir je remet ma fonction veille qui va servir pour les pdf et les xls

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Function Veille() As Date
    Dim d As Byte
     
    d = DatePart("w", Date, vbSunday)                'Si Date est Dimanche ou Lundi, on prend Vendredi comme étant la veille. 'Sinon, on prend j-1
    Veille = Date - IIf(d <= 2, d + 1, 1)
    End Function

    J'espere que l'on se comprend bien par forum?

    Thanks a lot!

  7. #27
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    oui ca fait un petit momment deja que j'ai compris ce que tu voulais

    donc je garde ta sub qui marche du tonnere

    et l'on va y ajouter la veille
    pour cela il faut savoir
    la veille de quoi???

    cettte veille doit etre calculée en fonction de la date qui ce trouve dans une cellule
    ou bien est celle du jour

    c'est toujour le meme probleme

    il faudrais que tu depose en exemple en supprimant bien entendu les donnéees confidentielles un exemple de fichier a renommer

    je ferais le reste en fonction du choix que je t'ai suggéré plus haut au sujet de la veille

    ensuite je te remetrais tout ca sous forme de 2 fonctions car le gain de temps est pas négligable surtout si tu a beaucoup de fichiers

    au plaisir
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  8. #28
    Membre très actif
    Homme Profil pro
    Etudiant
    Inscrit en
    Janvier 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 118
    Par défaut
    Voila un exemple de PJ excel (qui n'a pas ce nom bien sur lorsqu'elle arrive dans ma boite mail le matin). J'ai un code qui les transmet toute dans un fichier nommé Essai dans l'exemple

    Maintenant en C16 il y a une date. Si cette date correspond à la veille (par rapport à aujourd'hui) on ne supprime pas le fichier. Si C16 = Veille on continue le code pour renommer le fichier.

    La veille veut dire pour moi: Lundi si on est mardi ect ect et Vendredi si on est lundi

    J'aurais fais cette sub pour les excels pour ça mais elle ne fonctionne pas

    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
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    Sub change_le_nom_des_xls()
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
     
      Dim chemin As Variant
    Dim filtre As Variant
    Dim fichiers As Variant
    Dim Workbook As Variant
    Dim objFSO As Variant
     
     
     
    chemin = "Z:\Risques et documentation OPCVM\Rapprochement Front Back\Confirmation Trades\Essai\"                        ' chemin a adapter
       'on va lister tout les fichiers de type excel en filtrant l'extention
       filtre = "*.xls" ' ou le filtre que tu veux ... par exemple "*.txt" ou même "toto*.*"
     
       fichiers = Dir(chemin & filtre, vbNormal Or vbHidden) 'on prend meme ce qui sont caché
       'c'est parti
       Do While fichiers <> "" '
     
        Workbooks.Open (chemin & fichiers)
     
    'La j'essaye de supprimer les fichiers qui n'ont pas Veille en C16
     
     If Range("C16") <> Veille Then
     
    Set wk = Workbooks.Open(chemin & fichiers)
    wk.Close
     
     
     wk.Delete
     
     End If
     
    'Et apres je reprend mon code qui marche
     
        If Range("B13") = "" Then
     
        'Macro pour la date et le sens de l'odre
     
        Range("E15") = "=YEAR(R[-8]C[-3])"
     
        Range("F15") = "=MONTH(R[-8]C[-4])"
     
        Range("G15") = "=DAY(R[-8]C[-5])"
     
        Range("D25") = "=R[-10]C[1]&R[-10]C[2]&R[-10]C[3]"
     
        If Range("C20") = "Vente" Then Range("C20").Value = "SELL"
        If Range("C20") = "Achat" Then Range("C20").Value = "BUY"
     
      'on sauve le classeur sous le nom
        ActiveWorkbook.SaveAs Filename:=chemin & Range("C22") & "_" & Range("C20") & "_" & Range("B8") & "_" & Range("D25") & ".xls", FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
            ReadOnlyRecommended:=False, CreateBackup:=False
     ActiveWorkbook.Close
     
       'on va supprimer le fichier portant l'ancien nom
       Set objFSO = CreateObject("Scripting.FileSystemObject")
    objFSO.DeleteFile (chemin & fichiers)
     
         fichiers = Dir
     
     
     
       End If
     
       If Range("B13") = "OPERATION N°" Then
     
       'Macro pour la date et le sens de l'ordre
     
       Range("E15") = "=YEAR(R[-7]C[-3])"
     
        Range("F15") = "=MONTH(R[-7]C[-4])"
     
        Range("G15") = "=DAY(R[-7]C[-5])"
     
        Range("D25") = "=R[-10]C[1]&R[-10]C[2]&R[-10]C[3]"
     
     
        If Range("C20") = "Vente" Then Range("C20").Value = "SELL"
        If Range("C20") = "Achat" Then Range("C20").Value = "BUY"
     
     
       'on sauve le classeur sous le nom
        ActiveWorkbook.SaveAs Filename:=chemin & Range("C22") & "_" & Range("C20") & "_" & Range("B9") & "_" & Range("D25") & ".xls", FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
            ReadOnlyRecommended:=False, CreateBackup:=False
     ActiveWorkbook.Close
     
       'on va supprimer le fichier portant l'ancien nom
       Set objFSO = CreateObject("Scripting.FileSystemObject")
    objFSO.DeleteFile (chemin & fichiers)
     
     fichiers = Dir
     
     End If
     
     Loop
     
    End Sub 
     
    Private Function Veille() As Date
    Dim d As Byte
     
    d = DatePart("w", Date, vbSunday)                'Si Date est Dimanche ou Lundi, on prend Vendredi comme étant la veille. 'Sinon, on prend j-1
    Veille = Date - IIf(d <= 2, d + 1, 1)
    End Function
    Voit tu?

    Fichiers attachés Fichiers attachés

  9. #29
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    je regarde tout ca et je reviens jeudi

    a prmiere vu la date en c16 est normale donc la question a sa reponse toute seule tu comparee donc cette date en c16 a celle du jour

    donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if cdate([c16])=cdate(date)-1 then

    au plaisir
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  10. #30
    Membre très actif
    Homme Profil pro
    Etudiant
    Inscrit en
    Janvier 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 118
    Par défaut
    Merci je réarrange le message pour qu'il soit plus facile à comprendre pour toi jeudi!

    Bon fin de soirée

    Non on peut pas faire ça car sinon le lundi ça prend pas vendredi. C'est pour ça que j'ai crée une fonction Veille

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Function Veille() As Date
    Dim d As Byte
     
    d = DatePart("w", Date, vbSunday)                'Si Date est Dimanche ou Lundi, on prend Vendredi comme étant la veille. 'Sinon, on prend j-1
    Veille = Date - IIf(d <= 2, d + 1, 1)
    End Function
    Et à mon avis c juste a faire

    If Range("C16")<> Veille Then

    Worksheet.DeleteFile

    mais ça ne fonctionne pas meme quand je ferme le fichier avant de le supprimer

  11. #31
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bonjour je viens de réfléchir a ton problème


    en fait il faut s'occuper que de ceux qui on pour jour lundi,mardi,mercredi,jeudi,vendredi

    mais j'ai un problème si je fais par
    exemple
    msgbox format(day(date),"dddd") chez moi sa devrait m'afficher le jour en toute lettre soit "mercredi pour aujourd'hui
    mais sa m'affiche 2 jours avant soit " lundi" je ne comprend pas bien
    ça n'est pas logique

    j'ai bien une idée comment gérer ton souci mais je ne peut pas aller plus loin tant que cette erreur n'es pas solutionnée
    a tu une idée la dessus
    parce que la je cale
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  12. #32
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bonjour

    j'ai enfin réglé mon problème de date


    mais tout en réfléchissant il m'est venu une idée

    en fait tu fait quoi??:

    1 tu télécharge des pièces jointes (xls et pdfs) de tes mails

    2 tu les met dans un dossier

    3 pour les xls tu récupère des données dans les cellules pour en fabriquer le nouveau nom

    pour cela tu a besoins de tester
    1 si la date correspond a la veille et si c'est un dimanche ,ou un lundi on prend le vendredi
    et bien en fait il me viens une idée toute simple
    1 récupération de la date en c16
    ensuite tu fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    format(day(daterecupérée),"dd")
    en fait il faut que sa soit lundi ou mardi ou mercredi ou jeudi ou vendredi et surtout que le nom fabriqué n'existe pas déjà sinon ca voudrais dire que ce fichier a déjà été renomé

    pour cela c'est simple

    texter les jours valables et si le nom n'existe pas deja

    c'est tout

    et je dirais meme mieux finalement je supose que tu veux faire ca pour ne pas avoir l'erreur si le fichier avec le nouveau nom existe

    dans ce cas la dans la boucle tu ouvre tu récupère les données c20 c22 b8 c25
    tu construit le nom avec dans une variable et tu teste si il existe deja c'est tout ca te donne le meme résultat

    réfléchi a ca

    au plaisir
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  13. #33
    Membre très actif
    Homme Profil pro
    Etudiant
    Inscrit en
    Janvier 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 118
    Par défaut
    Bonjour Patrick

    Jsp tout va bien? J'écrie encore là mais il va falloir changer de file apres pour les PDF!!

    Donc alors on est sur des fichiers XLS hein! Pour résumé vite fait

    1) J'ai une macro qui télecharge mes fichiers excel dans un dossier (ils sont tous dans un sous dossier de ma messagerie.. bref )

    2)J'ai une deuxieme macro qui récupère les données dans les cellules de ces fichiers pour en fabriquer un nouveau nom de titre

    Maintenant j'aimerais juste insérer un petit bout de code dans ce 2) pour que cette macro récupere des données dans les cellules pour fabriquer un nouveau titre uniquement si la date en C16 correspond a la date de la veille (par rapport a aujourd'hui, sinon PAM elle supprime le fichier.

    Autrement dis la macro serai exactement la même mais uniquement pour les fichier ayant en C16 la date de la veille

    nb: Il n'y a jamais de date dans ses fichiers correspondant à un dimanche ou à un samedi donc si on est mardi elle renomme juste les fichiers du lundi juste avant supprimant les autres, si on est mercredi elle renomme les fichiers du mardi juste avant supprimant les autres et ainsi de suite. Et si on est lundi elle renomme les fichiers du vendredi juste avant suprimant les autres

    Voila ma macro qui fonctionne en renommant Tous les fichiers sans prendre en compte la veille

    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
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    Sub change_le_nom_des_xls()
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
     
      Dim chemin As Variant
    Dim filtre As Variant
    Dim fichiers As Variant
    Dim Workbook As Variant
    Dim objFSO As Variant
     
     
     
    chemin = "Z:\Risques et documentation OPCVM\Rapprochement Front Back\Confirmation Trades\Essai\"                        ' chemin a adapter
       'on va lister tout les fichiers de type excel en filtrant l'extention
       filtre = "*.xls" ' ou le filtre que tu veux ... par exemple "*.txt" ou même "toto*.*"
     
       fichiers = Dir(chemin & filtre, vbNormal Or vbHidden) 'on prend meme ce qui sont caché
       'c'est parti
       Do While fichiers <> "" '
     
        Workbooks.Open (chemin & fichiers)
     
     
        If Range("B13") = "" Then
     
        'Macro pour la date et le sens de l'odre
     
        Range("E15") = "=YEAR(R[-8]C[-3])"
     
        Range("F15") = "=MONTH(R[-8]C[-4])"
     
        Range("G15") = "=DAY(R[-8]C[-5])"
     
        Range("D25") = "=R[-10]C[1]&R[-10]C[2]&R[-10]C[3]"
     
        If Range("C20") = "Vente" Then Range("C20").Value = "SELL"
        If Range("C20") = "Achat" Then Range("C20").Value = "BUY"
     
      'on sauve le classeur sous le nom
        ActiveWorkbook.SaveAs Filename:=chemin & Range("C22") & "_" & Range("C20") & "_" & Range("B8") & "_" & Range("D25") & ".xls", FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
            ReadOnlyRecommended:=False, CreateBackup:=False
     ActiveWorkbook.Close
     
       'on va supprimer le fichier portant l'ancien nom
       Set objFSO = CreateObject("Scripting.FileSystemObject")
    objFSO.DeleteFile (chemin & fichiers)
     
         fichiers = Dir
     
     
     
       End If
     
       If Range("B13") = "OPERATION N°" Then
     
       'Macro pour la date et le sens de l'ordre
     
       Range("E15") = "=YEAR(R[-7]C[-3])"
     
        Range("F15") = "=MONTH(R[-7]C[-4])"
     
        Range("G15") = "=DAY(R[-7]C[-5])"
     
        Range("D25") = "=R[-10]C[1]&R[-10]C[2]&R[-10]C[3]"
     
     
        If Range("C20") = "Vente" Then Range("C20").Value = "SELL"
        If Range("C20") = "Achat" Then Range("C20").Value = "BUY"
     
     
       'on sauve le classeur sous le nom
        ActiveWorkbook.SaveAs Filename:=chemin & Range("C22") & "_" & Range("C20") & "_" & Range("B9") & "_" & Range("D25") & ".xls", FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
            ReadOnlyRecommended:=False, CreateBackup:=False
     ActiveWorkbook.Close
     
       'on va supprimer le fichier portant l'ancien nom
       Set objFSO = CreateObject("Scripting.FileSystemObject")
    objFSO.DeleteFile (chemin & fichiers)
     
     fichiers = Dir
     
     End If
     
     Loop
     
    End Sub

    Moi je pensais créer un fonction Veille, ici présente

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Function Veille() As Date
    Dim d As Byte
     
    d = DatePart("w", Date, vbSunday)                'Si Date est Dimanche ou Lundi, on prend Vendredi comme étant la veille. 'Sinon, on prend j-1
    Veille = Date - IIf(d <= 2, d + 1, 1)
    End Function
    Puis rajouté un petit bout de code apres

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Do While fichiers <> "" '
     
        Workbooks.Open (chemin & fichiers)
    dans la macro ci dessus
    Ce bout de code serrait du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    If Range("C16") <> Veille Then
     
       Workbooks.Close (chemin & fichiers) 'Je ferme le fichier pour pouvoir le supprimer
     
    'Et je le suprimme
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    objFSO.DeleteFile (chemin & fichiers)
    Mais je sens que cette idée ne te plait pas??

  14. #34
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bonjour tortureur d'esprit

    donc si je comprend bien ton code tu sauve une fois le classeur de la veille avec c20,c22,b8

    et une 2eme fois avec c25 en plus si en b13 il y a rien

    est ce bien ca ????
    au plaisir
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  15. #35
    Membre très actif
    Homme Profil pro
    Etudiant
    Inscrit en
    Janvier 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 118
    Par défaut
    Pas du tout lol! Mais je vois ce que tu veux dire! No Problem

    Dans la macro qui marche pour l'instant:

    Je renomme et sauve 1 fois les fichiers du classeurs toujours de la même maniere:

    Avec C22_C20_B8(ouB9 ça depent j'ai 2 types de présentation que je différencie avec la ligne B13...bref!) et D25(c'est moi qui fait cette case dans chaque fichier en fait je remet la date sous la forme 20120510)

    Et en fait j'aimerais avant de commencer le renommage suprrimer le fichier SI en C16 je n'ai pas la date de la veille. Et si C16= Veille je laisse ma macro telle quel.

    Tu vois?

    Je pense que la façon dont les fichiers sont renommer n'a pas bcp d'importance? Non? Mais bon si tu demandes c'est que ça doit l'être!!

  16. #36
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    je vois que tu ne suis plus le fil


    bon laissons de coté le problème de renommage

    le problème c'est que dans ce dossier il y a:

    les fichiers qui viennent d'arriver
    les fichiers que tu a déjà traité dans les jour précédent

    donc dans ta boucle avec dir ces fichiers sont pris en compte et donc
    nous somme jeudi et les fichiers que tu a traité avant donc mercredi,mardi,lundi seront supprimer avec ta condition de la cellule c16

    c'est pour cela que c'était important

    en fait il te faut te simplifier la tache pour éviter de supprimer des fichiers

    tu boucles sur tous
    tu construit le nom avec tes cellules et tu test si un fichier portant ce nom existe tout simplement car forcement si un fichier a été traiter et donc renommer lorsque tu bouclera dessus et construira le nom avec les cellules
    tu retombera sur un nom existant donc saute ce fichier

    me comprend tu ??? je l'espère en tout cas sinon on est pas prêt d'arriver

    au plaisir
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  17. #37
    Membre très actif
    Homme Profil pro
    Etudiant
    Inscrit en
    Janvier 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 118
    Par défaut
    Si si je vois ce que tu veux dire. Mais je vois ou je vais . ça a pas l'air logique comme ça parce que les fichiers enregistré auparavant seront supprimé.

    Mais en fait c'est normal puisqu'apres j'enregistrerai plus la macro sous Essai mais sous un dossier qui se créra chaque jour automatiquement quand on cliquera sur un bouton. Ce dossier aura pour titre la veille.

    Tu comprend donc chaque jour les fichiers excels de la veille qui resteront (ceux dont C16=Veille) s'enregistrerons non plus sous Essai mais sous un dossier correspondant a la veille.

    Je pensais faire comme ça. Regarde plus bas?

    Autrement dis ce fichier Essai est un Essai et a pas vocation a rester.
    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
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
     
     
     Sub change_le_nom_des_xls()
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
     
      Dim chemin As Variant
    Dim filtre As Variant
    Dim fichiers As Variant
    Dim Workbook As Variant
    Dim objFSO As Variant
     
     
     
    chemin = "Z:\Risques et documentation OPCVM\Rapprochement Front Back\Confirmation Trades"                        ' chemin a adapter
       'on va lister tout les fichiers de type excel en filtrant l'extention
       filtre = "*.xls" ' ou le filtre que tu veux ... par exemple "*.txt" ou même "toto*.*"
     
       fichiers = Dir(chemin & filtre, vbNormal Or vbHidden) 'on prend meme ce qui sont caché
       'c'est parti
     
    'Si le répertoir père existe
    If Dir(chemin, vbDirectory) <> "" Then
        'Dans maDate on récuppère la date de la veille (si c'est un dimanche ou lundi, on prend vendredi précédent
        'Ici appel à la fonction veille
        MaDate = Veille
     
        'On va chercher si le sous répertoire du mois existe au sein du répertoire père, on le crée s'il n'existe pas
        RepMois = chemin & "\" & Format(MaDate, "mmmm yyyy")
        If Dir(RepMois, vbDirectory) = "" Then MkDir RepMois
        'On va chercher si le sous répertoire du jour existe au sein du sous répertoire du mois, on le crée s'il n'existe pas
        RepJour = RepMois & "\" & Format(MaDate, "yyyymmdd")
        If Dir(RepJour, vbDirectory) = "" Then MkDir RepJour
     
     
       Do While fichiers <> "" '
     
        Workbooks.Open (chemin & fichiers)
     
    'LA IL Y Aura la condition Si C16<> Veille Then supprime le fichier
     
     
        If Range("B13") = "" Then
     
        'Macro pour la date et le sens de l'odre
     
        Range("E15") = "=YEAR(R[-8]C[-3])"
     
        Range("F15") = "=MONTH(R[-8]C[-4])"
     
        Range("G15") = "=DAY(R[-8]C[-5])"
     
        Range("D25") = "=R[-10]C[1]&R[-10]C[2]&R[-10]C[3]"
     
        If Range("C20") = "Vente" Then Range("C20").Value = "SELL"
        If Range("C20") = "Achat" Then Range("C20").Value = "BUY"
     
      'on sauve le classeur sous le nom (tu vois ici je met Rep jour??)
     
        ActiveWorkbook.SaveAs Filename:= RepJour & "\"& Range("C22") & "_" & Range("C20") & "_" & Range("B8") & "_" & Range("D25") & ".xls", FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
            ReadOnlyRecommended:=False, CreateBackup:=False
     ActiveWorkbook.Close
     
       'on va supprimer le fichier portant l'ancien nom
       Set objFSO = CreateObject("Scripting.FileSystemObject")
    objFSO.DeleteFile (chemin & fichiers)
     
         fichiers = Dir
     
     
     
       End If
     
       If Range("B13") = "OPERATION N°" Then
     
       'Macro pour la date et le sens de l'ordre
     
       Range("E15") = "=YEAR(R[-7]C[-3])"
     
        Range("F15") = "=MONTH(R[-7]C[-4])"
     
        Range("G15") = "=DAY(R[-7]C[-5])"
     
        Range("D25") = "=R[-10]C[1]&R[-10]C[2]&R[-10]C[3]"
     
     
        If Range("C20") = "Vente" Then Range("C20").Value = "SELL"
        If Range("C20") = "Achat" Then Range("C20").Value = "BUY"
     
     
       'on sauve le classeur sous le nom
        ActiveWorkbook.SaveAs Filename:=RepJour & "\" & Range("C22") & "_" & Range("C20") & "_" & Range("B9") & "_" & Range("D25") & ".xls", FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
            ReadOnlyRecommended:=False, CreateBackup:=False
     ActiveWorkbook.Close
     
       'on va supprimer le fichier portant l'ancien nom
       Set objFSO = CreateObject("Scripting.FileSystemObject")
    objFSO.DeleteFile (chemin & fichiers)
     
     fichiers = Dir
     
     End If
     
     Loop
     
    End Sub
     
    Private Function Veille() As Date
    Dim d As Byte
     
    d = DatePart("w", Date, vbSunday)                'Si Date est Dimanche ou Lundi, on prend Vendredi comme étant la veille. 'Sinon, on prend j-1
    Veille = Date - IIf(d <= 2, d + 1, 1)
    End Function

    Tu en pense quoi le toulonais. Promis apres c fini je te cache plus rien

  18. #38
    Membre très actif
    Homme Profil pro
    Etudiant
    Inscrit en
    Janvier 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 118
    Par défaut
    Alors je me lance. Ca va etre un peu long. Mais en réalité je pense que c'est simple et j'ai pas mal avancé

    Comme tu sais j'importe tous les jours de ma messagerie grâce a un code tous les fichiers xls d'un sous dossier, ils viennent s'enregistrer dans un dossier nommé Essai.

    Une fois qu'ils sont dans le dossier Essai je les renomme (effectivement j'ai rajouté des trucs ici et là mais maintenant les fichiers se renomment comme je veux).

    J'explique comment je les renomme (=je change le titre):

    -Je prends C22 tel quel
    -C20 = soit BUY ou SELL je change en français et j'utilise C20 dans le titre
    -Je prends B8 ou B9 dans le titre (car l'information que je veux ici est défois en B8 défois en B9 selon ce qu'il y a marqué en B13 c'est pourquoi j'ai fait deux IF)
    - Et enfin je prends D25, ici (comme avec C20) je travaille sur le fichier avant de changer le titre. Ma date est sous la forme 12/05/2012 à l'état initial et je la met sous la forme 20120512 pour pouvoir la mettre dans le titre

    Tout cela marche tres bien. Je met la macro ci dessous

    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
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    Public Sub TransfertPJ()
     
        'Création de l'objet Outlook
        Set objoutlook = CreateObject("Outlook.application")
        'Récupération de l'espace de nom d'outlook
        Set olns = objoutlook.GetNamespace("MAPI")
        'Récupération du répertoire "boite de réception" par défault
        Set fld = olns.GetDefaultFolder(olFolderInbox)
        ' Initialisation du reperetoire de sauvegarde
        ' ne pas oublier l'anti-slash à la fin du repertoire
        Repertoire = "Z:\Risques et documentation OPCVM\Rapprochement Front Back\Confirmation Trades\Essai\"
        'Inialisation des variables Message, NomDeFichier, NomDeFichierSurDisque, Taille, Emetteur
        message = NomDeFichierSurDisque = NomDeFichier = Taille = Emetteur = ""
     
        ' Sauve les pieces jointes des mails se trouvant dans la boîte de réception.
        ' Pour adresser un dossier dans la boite de réception on pourrait utiliser :
        ' fld.Folders("Nom_Du_Dossier").Items
    For Each mItem In fld.Folders("Confirmation Oddo").Items
     
        For Each att In mItem.Attachments
        If att.Type = olByValue Then
     
        ' Nom du fichier modifié pour l'enregistrement. Evite les controles superflus en renommant.
     
        NomDeFichier = att.Filename
        NomDeFichierSurDisque = NomDeFichier
        att.SaveAsFile Repertoire & NomDeFichierSurDisque
     
     
     
     
     
     
        End If
        Next
        Next
     
     
     
     
        Exit Sub
     
        End Sub
     
    Sub change_le_nom_des_xls()
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
     
      Dim chemin As Variant
    Dim filtre As Variant
    Dim fichiers As Variant
    Dim Workbook As Variant
    Dim objFSO As Variant
    Dim objFSOA As Variant
     
     
     
     
    chemin = "Z:\Risques et documentation OPCVM\Rapprochement Front Back\Confirmation Trades\Essai\"                        ' chemin a adapter
       'on va lister tout les fichiers de type excel en filtrant l'extention
       filtre = "*.xls" ' ou le filtre que tu veux ... par exemple "*.txt" ou même "toto*.*"
     
       fichiers = Dir(chemin & filtre, vbNormal Or vbHidden) 'on prend meme ce qui sont caché
       'c'est parti
       Do While fichiers <> "" '
     
        Workbooks.Open (chemin & fichiers)
     
     
        If Range("B13") = "" Then
     
        'Macro pour la date et le sens de l'odre
     
        Range("E15") = "=YEAR(R[-8]C[-3])"
     
        Range("F15") = "=MONTH(R[-8]C[-4])"
     
        Range("G15") = "=DAY(R[-8]C[-5])"
     
        Range("D25") = "=R[-10]C[1]&R[-10]C[2]&R[-10]C[3]"
     
        If Range("C20") = "Vente" Then Range("C20").Value = "SELL"
        If Range("C20") = "Achat" Then Range("C20").Value = "BUY"
     
      'on sauve le classeur sous le nom
        ActiveWorkbook.SaveAs Filename:=chemin & Range("C22") & "_" & Range("C20") & "_" & Range("B8") & "_" & Range("D25") & ".xls", FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
            ReadOnlyRecommended:=False, CreateBackup:=False
     ActiveWorkbook.Close
     
       'on va supprimer le fichier portant l'ancien nom
       Set objFSO = CreateObject("Scripting.FileSystemObject")
    objFSO.DeleteFile (chemin & fichiers)
     
         fichiers = Dir
     
     
     
       End If
     
       If Range("B13") = "OPERATION N°" Then
     
       'Macro pour la date et le sens de l'ordre
     
       Range("E15") = "=YEAR(R[-7]C[-3])"
     
        Range("F15") = "=MONTH(R[-7]C[-4])"
     
        Range("G15") = "=DAY(R[-7]C[-5])"
     
        Range("D25") = "=R[-10]C[1]&R[-10]C[2]&R[-10]C[3]"
     
     
        If Range("C20") = "Vente" Then Range("C20").Value = "SELL"
        If Range("C20") = "Achat" Then Range("C20").Value = "BUY"
     
     
       'on sauve le classeur sous le nom
        ActiveWorkbook.SaveAs Filename:=chemin & Range("C22") & "_" & Range("C20") & "_" & Range("B9") & "_" & Range("D25") & ".xls", FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
            ReadOnlyRecommended:=False, CreateBackup:=False
     ActiveWorkbook.Close
     
       'on va supprimer le fichier portant l'ancien nom
       Set objFSO = CreateObject("Scripting.FileSystemObject")
    objFSO.DeleteFile (chemin & fichiers)
     
     fichiers = Dir
     
     End If
     
     Loop
     
    End Sub
    Maintenant j'aimerais rajouter 2 petites améliorations a cette macro

    1) La premiere c'est d'enregistrer avec leur changement de nom chaque jour les fichiers non pas sous Essai, mais sous un dossier qui se nomme 20120512 puis le lendemain les enregistrer sous 20120513 ect ect (sauf le dimanche et le samedi). (ce nom correspond à la date de la veille)

    2) Et donc à l'interieur de chacun de ces dossiers il y aura les fichiers qui correspondent a la date du titre du dossier

    Exemple (c'est tout bete.... si si je t'assure)

    Si nous somme le 14 mai 2012 par exemple la macro va enregistrer TOUS les PJ xls tiré de mon sous dossier de ma boite de reception sous un fichier nommé 20120511 (car le 13 et le 12 c'était un week end). Puis elle va supprimé ceux qui ont pas en C16 la date de la veille (dans mon exemple ceux qui ont pas en C16 11/05/2012.

    ça parait un peu dingue de TOUS les tiré de la messagerie pour les supprimer apres mais je t'assure c'est la meilleure architecture

    J'ai commencé a travailler sur ça tu en pense quoi du code ci dessous? J'ai jumélé les sub (importation des PJ et changement de nom)


    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
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    Dim objoutlook As Outlook.Application
        Dim olns As Outlook.Namespace
        Dim mItem As Outlook.MailItem
        Dim att As Outlook.Attachment
        Dim fld As Outlook.MAPIFolder
        Dim Compteur As Integer
        Dim message, Repertoire, NomDeFichierSurDisque, NomDeFichier, Taille, Emetteur As String
         Dim AncienNom As String, NouveauNom As String
     
      Dim chemin As Variant
    Dim filtre As Variant
    Dim fichiers As Variant
    Dim Workbook As Variant
    Dim objFSO As Variant
    Dim Rep As String, RepMois As String, RepJour As String
    Dim MaDate As Date
     
     
     
     
     
        Option Explicit
     
        Public Sub TransfertPJ()
     
        'Création de l'objet Outlook
        Set objoutlook = CreateObject("Outlook.application")
        'Récupération de l'espace de nom d'outlook
        Set olns = objoutlook.GetNamespace("MAPI")
        'Récupération du répertoire "boite de réception" par défault
        Set fld = olns.GetDefaultFolder(olFolderInbox)
        ' Initialisation du reperetoire de sauvegarde
        ' ne pas oublier l'anti-slash à la fin du repertoire
        Rep = "Z:\Risques et documentation OPCVM\Rapprochement Front Back\Confirmation Trades"
     
        'Si le répertoir père existe
    If Dir(Rep, vbDirectory) <> "" Then
        'Dans maDate on récuppère la date de la veille (si c'est un dimanche ou lundi, on prend vendredi précédent
        'Ici appel à la fonction veille
        MaDate = Veille
     
        'On va chercher si le sous répertoire du mois existe au sein du répertoire père, on le crée s'il n'existe pas
        RepMois = Rep & "\" & Format(MaDate, "mmmm yyyy")
        If Dir(RepMois, vbDirectory) = "" Then MkDir RepMois
        'On va chercher si le sous répertoire du jour existe au sein du sous répertoire du mois, on le crée s'il n'existe pas
        RepJour = RepMois & "\" & Format(MaDate, "yyyymmdd")
        If Dir(RepJour, vbDirectory) = "" Then MkDir RepJour
        'Inialisation des variables Message, NomDeFichier, NomDeFichierSurDisque, Taille, Emetteur
        message = NomDeFichierSurDisque = NomDeFichier = Taille = Emetteur = ""
     
        ' Sauve les pieces jointes des mails se trouvant dans la boîte de réception.
        ' Pour adresser un dossier dans la boite de réception on pourrait utiliser :
        ' fld.Folders("Nom_Du_Dossier").Items
    For Each mItem In fld.Folders("Confirmation Oddo").Items
     
        For Each att In mItem.Attachments
        If att.Type = olByValue Then
     
        ' Nom du fichier modifié pour l'enregistrement. Evite les controles superflus en renommant.
     
     
     
     
        NomDeFichier = att.Filename
        NomDeFichierSurDisque = NomDeFichier
        att.SaveAsFile Repertoire & NomDeFichierSurDisque
     
     
     
        End If
        Next
        Next
     
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
     
     
     
     
    chemin = Rep                       ' chemin a adapter
       'on va lister tout les fichiers de type excel en filtrant l'extention
       filtre = "*.xls" ' ou le filtre que tu veux ... par exemple "*.txt" ou même "toto*.*"
     
       fichiers = Dir(chemin & filtre, vbNormal Or vbHidden) 'on prend meme ce qui sont caché
       'c'est parti
       Do While fichiers <> "" '
     
        Workbooks.Open (chemin & fichiers)
     
    'LA JE RAJOUTE MA SUPPRESSION SI C16<>VEILLE
     
     
        If Range("C16") <> Veille Then
     
       Workbooks(chemin & fichiers).Close  'Je ferme le fichier pour pouvoir le supprimer
     
    'Et je le suprimme
    Set objFSOA = CreateObject("Scripting.FileSystemObject")
    objFSOA.DeleteFile (chemin & fichiers)
     
    End If
     
     
        If Range("B13") = "" Then
     
        'Macro pour la date et le sens de l'odre
     
        Range("E15") = "=YEAR(R[-8]C[-3])"
     
        Range("F15") = "=MONTH(R[-8]C[-4])"
     
        Range("G15") = "=DAY(R[-8]C[-5])"
     
        Range("D25") = "=R[-10]C[1]&R[-10]C[2]&R[-10]C[3]"
     
        If Range("C20") = "Vente" Then Range("C20").Value = "SELL"
        If Range("C20") = "Achat" Then Range("C20").Value = "BUY"
     
      'on sauve le classeur sous le nom
        ActiveWorkbook.SaveAs Filename:=chemin & Range("C22") & "_" & Range("C20") & "_" & Range("B8") & "_" & Range("D25") & ".xls", FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
            ReadOnlyRecommended:=False, CreateBackup:=False
     ActiveWorkbook.Close
     
       'on va supprimer le fichier portant l'ancien nom
       Set objFSO = CreateObject("Scripting.FileSystemObject")
    objFSO.DeleteFile (chemin & fichiers)
     
         fichiers = Dir
     
     
     
       End If
     
       If Range("B13") = "OPERATION N°" Then
     
       'Macro pour la date et le sens de l'ordre
     
       Range("E15") = "=YEAR(R[-7]C[-3])"
     
        Range("F15") = "=MONTH(R[-7]C[-4])"
     
        Range("G15") = "=DAY(R[-7]C[-5])"
     
        Range("D25") = "=R[-10]C[1]&R[-10]C[2]&R[-10]C[3]"
     
     
        If Range("C20") = "Vente" Then Range("C20").Value = "SELL"
        If Range("C20") = "Achat" Then Range("C20").Value = "BUY"
     
     
     
     
     
       'on sauve le classeur sous le nom
        ActiveWorkbook.SaveAs Filename:=RepJour & "\" & Range("C22") & "_" & Range("C20") & "_" & Range("B9") & "_" & Range("D25") & ".xls", FileFormat:=xlNormal, Password:="", WriteResPassword:="", _
            ReadOnlyRecommended:=False, CreateBackup:=False
     ActiveWorkbook.Close
     
       'on va supprimer le fichier portant l'ancien nom
       Set objFSO = CreateObject("Scripting.FileSystemObject")
    objFSO.DeleteFile (chemin & fichiers)
     
     fichiers = Dir
     
     End If
     
     Loop
     
    End If
     
     
     
        End Sub
      Private Function Veille() As Date
    Dim d As Byte
     
    d = DatePart("w", Date, vbSunday)                'Si Date est Dimanche ou Lundi, on prend Vendredi comme étant la veille. 'Sinon, on prend j-1
    Veille = Date - IIf(d <= 2, d + 1, 1)
    End Function

  19. #39
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bonjour

    oui t'inquiète j'avais très bien compris le problème c'est que tu supprime pas la pièce jointe après l'avoir récupéré dans un dossier
    c'est pour cela que tu galope dans le vide

    sur ce plan la je ne peut pas 't'aider car je n'utilise pas du tout outlook
    mais je pense que tu dois avoir ça dans la faq
    mais pour le reste c'est super simple

    reste un peu a détailler la 2 condition sur le b8 et b9
    il me faudrais un exemple de chaque j'ai toujours le 1er que tu avais mis en PJ

    au plaisir
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  20. #40
    Membre très actif
    Homme Profil pro
    Etudiant
    Inscrit en
    Janvier 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 118
    Par défaut
    Je supprime pas les pieces jointes apres les avoir récupérées dans un dossier?? Comment ça???

    S,i je supprime celle qui ont l'ancien nom! Et non je supprime pas celles qui ont C16<> Veille mais justement c'est ce que je veux faire

    Sur quelle partie tu ne peux pas m'aider?

    la1) qui consite a enregistrer les pieces jointes tous les jours sur le dossier de la veille du type 20120514

    ou la 2) qui consiste a supprimé dans ce dossier tous les xls qui ont pas en C16 la date de la veille?

    Voici un exemple du 2eme type d'excel. C'est partiquement le même. Mais je vois tjs pas a quoi ça va servir pour résoudre les 1) et 2)

    Bonne fin de journée et encore merci
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. Renommer un fichier Excel selon une zone du classeur
    Par matt240490 dans le forum Contribuez
    Réponses: 1
    Dernier message: 09/05/2014, 16h55
  2. Réponses: 2
    Dernier message: 21/04/2014, 22h31
  3. Réponses: 3
    Dernier message: 21/11/2013, 14h55
  4. [XL-2007] Renommer un fichier Excel par macro
    Par Yunasthar dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 23/08/2010, 11h05
  5. Renommer des fichiers EXCEL à partir de SAS
    Par id301077 dans le forum ODS et reporting
    Réponses: 1
    Dernier message: 21/11/2009, 13h11

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