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 :

Extraire des caractères à un nom de fichier et prendre en compte le nom de fichier [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Orange UIPL
    Inscrit en
    Janvier 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Orange UIPL
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 23
    Points : 31
    Points
    31
    Par défaut Extraire des caractères à un nom de fichier et prendre en compte le nom de fichier
    Bonjour le forum, chers membres et staff Dvp !

    Bien le bonjour

    Je viens vers vous au sujet d'une procédure qui est présente dans la faq, je vous la link.

    http://excel.developpez.com/faq/?pag...riptingRuntime

    J'utilise du coup ce code, pour lister des Fiches d'Instructions.
    Ce sont des documents Word et seulement Word.

    J'aimerais ajouté le fait que ma liste ne comporte que des documents word, ce qui n'est pas le cas à l'heure actuel car la procédure me liste tout fichier présent à la racine précisé.

    Étant donné que ce sont des fichiers sont souvent mise à jour, je me doit de rajouter une case pour la révision de ce/ces documents.

    Voila le code que j'utilise (c'est celui de la FAQ, mise à ma sauce xD ):

    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
    Sub TestListeFichiers()
        Dim Dossier As String
     
        'Définit le répertoire pour débuter la recherche de fichiers.
        '(Attention à ne pas indiquer un répertoire qu contient trop de sous-dossiers ou de
        'fichiers, sinon le temps de traitement va être très long).
        Dossier = "C:\FI générées\"
     
        'Appelle la procédure de recherche des fichiers
        ListeFichiers Dossier
     
     
        MsgBox "Mise à jour de la liste des Fiches d'Instructions : Terminée"
    End Sub
     
     
    Sub ListeFichiers(Repertoire As String)
     
        Dim Fso As Scripting.FileSystemObject
        Dim SourceFolder As Scripting.Folder
        Dim SubFolder As Scripting.Folder
        Dim FileItem As Scripting.File
        Dim i As Long
     
        Set Fso = CreateObject("Scripting.FileSystemObject")
        Set SourceFolder = Fso.GetFolder(Repertoire)
     
    Application.ScreenUpdating = False
    Worksheets("Signets & Macros").Activate
     
        'Récupère le numéro de la dernière ligne vide dans la colonne A.
        i = Range("J3").End(xlUp).Row + 1
     
        'Boucle sur tous les fichiers du répertoire
        For Each FileItem In SourceFolder.Files
            'Inscrit le nom du fichier dans la cellule
            Cells(i, 10) = FileItem.Name
            'Ajoute un lien hypertexte vers le fichier
            ActiveSheet.Hyperlinks.Add Anchor:=Cells(i, 10), _
                Address:=FileItem.ParentFolder & "\" & FileItem.Name
            'Indice de la révision
            Cells(i, 11) = "?"
            'Indique la date de création
            Cells(i, 12) = FileItem.DateCreated
            'Indique la date de dernier acces
            Cells(i, 13) = FileItem.DateLastAccessed
            'Indique la date de dernière modification
            Cells(i, 14) = FileItem.DateLastModified
     
     
            i = i + 1
        Next FileItem
     
     
        '--- Appel récursif pour lister les fichier dans les sous-répertoires ---.
        For Each SubFolder In SourceFolder.subfolders
            ListeFichiers SubFolder.Path
        Next SubFolder
     
    Worksheets("Glossaire").Activate
    Application.ScreenUpdating = True
     
    End Sub
    C'est donc au niveau de cette ligne que je bute:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'Indice de la révision
            Cells(i, 11) = "?"
    On m'as conseillé d'utiliser la fonction left ou right pour prendre la chaine de caractère qui m'interesse.

    Mes noms de fichier sont écris de la façon suivante:

    FI 1000 Rev A.docx
    FI 1001 Rev F.docx
    FI 1002 Rev G.docx
    FI 1003 Rev H.docx
    FI 1004 Rev K.docx
    FI 1005 Rev Z.docx

    J'aimerais donc qu'en Cells (i, 11) le lettre de la révision soit apparante (Garder juste un caractère à partir de la droite).

    Et qu'en cells (i,10) ou se trouve le nom de fichier il y paraisse que FI 1000 et non FI 1000 Rev A.docx (en gros gardé que les 7 caractère à partir de la gauche).


    Au plaisir de vous relire.

    Je voulais vous dire que grâce à vous et d'autres forums ... ba on progresse ... lentement mais surement Thanks for all !!!!

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2013
    Messages : 46
    Points : 35
    Points
    35
    Par défaut
    essaye ça:
    A = "F1 10000 Rev A.docx"
    Cells(i, 11) = Mid(A, 14, 1)
    Cells(i, 10) = Left(A, 7)

    si jamais tu veut vraiment prendre le dernier caractère avant le point ( si ton nom de fichier varie en taille ou extension: tu peut utiliser des boucles )

    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
    inddot = Len(A)
    While Mid(A, inddot, 1) <> "." Or inddot = 0
    inddot = inddot - 1
    Wend
    Cells(i, 11) = Mid(A, inddot - 1, 1)
     
    'De Même
     
    indREV = Len(A)
    While Mid(A, indREV, 4) <> " Rev" Or inddot = 0
    indREV = indREV - 1
    Wend
    Cells(i, 10) = Left(A, indREV - 1)
     
    'Tu peut même optimiser en utilisant do until mais perso je préfère while..
    End Sub

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Orange UIPL
    Inscrit en
    Janvier 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Orange UIPL
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 23
    Points : 31
    Points
    31
    Par défaut
    Bonjour wini29 !
    (Pour un peu un breton ou une bretonne ^^')
    Sa marche parfaitement je me suis pas embêté, j'ai pris ta première solution étant donné que mes FI 100x rev X.docx ne change pas ! Donc sa colle parfaitement à l'application que j'en est ... !

    Par contre je n'est pas encore trouver de solution pour répertorier seulement les documents Word et pas tout fichier confondus .....

    Merci bien en tout cas wini ! t'est de bon conseil !

    Au plaisir de vous relire.

    Cordialement.


    Guillaume.

  4. #4
    Membre éclairé
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2006
    Messages
    542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mai 2006
    Messages : 542
    Points : 712
    Points
    712
    Par défaut
    Bonjour à tous
    Bonjour Malcomiix, Wini29

    Si je peux me permettre, pour trouver la lettre de révision si le nom du fichier se modifie, et s'il n'y a qu'un point, je préfère cette solution sans boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub extrait_la_revision()
    A = "F1 10000 Rev A.docx"
    la_rev = Mid(A, InStr(A, ".") - 1, 1)
    End Sub
    avec plusieurs points tu as ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub extrait_la_revision()
    A = "F1 10000 Rev A.docx"
    la_rev = Mid(Right(A, 6), 1, 1)
    End Sub
    Eric

  5. #5
    Membre éclairé
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2006
    Messages
    542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mai 2006
    Messages : 542
    Points : 712
    Points
    712
    Par défaut
    Re

    Pour récupérer uniquement les fichiers "docx" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub Liste_des_Fichiers_docx()
      Application.ScreenUpdating = False
      repertoire = ThisWorkbook.Path & "\" ' adapter
      ligne = 2
      nf = Dir(repertoire & "*.docx") 'premier fichier docx
      Do While nf <> ""
        Cells(ligne, 1) = nf
        ligne = ligne + 1
        nf = Dir() ' fichier suivant
      Loop
    End Sub
    A adapter
    Attention, la liste sera sur la feuille courante du fichier excel à partir de la cellule A2

    Eric

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Orange UIPL
    Inscrit en
    Janvier 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Orange UIPL
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 23
    Points : 31
    Points
    31
    Par défaut
    Re bonjour, wini29, Éric !

    Bon du coup n'ayant pas plus besoin des dates extraites avec le code de la FAQ.

    J'ai pris ton code mon cher Éric, d'ailleurs je t'en remercie !


    Voila ce que cela donne !

    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
    '~> Macro de mise à jour de la liste de fichier "/FI générées" <~'
    Sub Liste_des_Fichiers_docx()
    Dim repertoire As String
    Dim i As Long
    Dim nf As String
     
    Worksheets("Signets & Macros").Activate
     
      Application.ScreenUpdating = False
      repertoire = ThisWorkbook.Path & "\FI générées\"
      i = 3
      nf = Dir(repertoire & "*.docx") 'premier fichier docx
     
      Do While nf <> ""
        Cells(i, 10) = Left(nf, 7)
        Cells(i, 11) = Mid(Right(nf, 6), 1, 1)
     
        i = i + 1
        nf = Dir() ' fichier suivant
      Loop
     
    Worksheets("Glossaire").Activate
    Application.ScreenUpdating = True
     
    End Sub

    Sinon j'ai encore un petit soucis sauf que le soucis c'est que c'est du vba word/excel.

    Je m'explique ....!

    J'ai donc ma macro suivante qui me génère un document word via un fichier texte ou se trouve la valeur de signets à insérer.

    Le fichier est sauvegarder sous cette forme, FI 1000 rev A. J'aimerais pouvoir placer ce "FI 1000 - Rev A" dans une tableau qui est situé en entête de mon document ....

    Voila la bête ^^' :

    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
    '~> Macro de génération de FI <~'
    Sub génération_fi()
     
    '   Déclaration des variables
    Dim a As String
    Dim i As Integer
    Dim j As Integer
    Dim Log As Object
    Dim wrd As Object
    Dim textFile As Object
    Dim textLine As String
    Dim textFileName As String
    Dim resultat As String
    Dim wdDoc As Word.Document
    Dim wdApp As Word.Application
    Dim chemin_trame As String
     
    chemin_trame = "C:\document.docx"
     
    Application.ScreenUpdating = False
     
     
    resultat = Cells(10, 2).End(xlDown).Row
     
    '   Définie le chemin du fichier log_signets.txt
    textFileName = ActiveWorkbook.Path & "\log_signets.txt"
     
    '   Créer le fichier log_signets.txt
    Set Log = CreateObject("Scripting.FileSystemObject")
    Set textFile = Log.CreateTextFile(Filename:=textFileName, overwrite:=True)
     
    '   Initialise le fichier log_signets.txt
    textLine = vbNullString
     
    '   Ecris dans le fichier log_signets.txt
    For i = 10 To Cells(10, 2).End(xlDown).Row
    If Cells(i, 7).Value = "X" Then
    a = Cells(i, 6).Value
    textFile.WriteLine a
    End If
    Next
     
    '   Ferme le fichier log_signets.txt
    textFile.Close
    Set textFile = Nothing: Set Log = Nothing
     
    '  Ouvre Word puis éxecute des macros
    Set wdApp = CreateObject("word.application")
     
    With wdApp
    .DisplayAlerts = False
    .Visible = True
    .WindowState = wdWindowStateMaximize
     
    End With
    Set wdDoc = wdApp.Documents.Open(chemin_trame)
     
    wdApp.Run "'Librairie_macro_wd'!curseur_fin_doc"
    wdApp.Run "'Librairie_macro_wd'!insertion_signets"
     
    'resultat = ActiveWorkbook.Path & "\FI générés\"
    wdApp.ActiveDocument.SaveAs Filename:="C:\FI générées\" & resultat
     
    ' ---------- Suprime le fichier log_signets.txt ----------
    Kill textFileName
     
    End Sub
    J'aimerais donc que cette variable "resultat" prenne en compte le nombre de la dernière Fiche d'Instruction créer pour qu'il incrémente (+1)

    Au plaisir de faire à des amateurs comme des pros ! Mais toujours aussi "calé" !!

    Cordialement.


    Guillaume!

  7. #7
    Membre éclairé
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2006
    Messages
    542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mai 2006
    Messages : 542
    Points : 712
    Points
    712
    Par défaut
    Re

    J'ai du mal à comprendre :
    "Le fichier est sauvegarder sous cette forme, FI 1000 rev A. J'aimerais pouvoir placer ce "FI 1000 - Rev A" dans une tableau qui est situé en entête de mon document ...."
    Quel document ?

    Peut être entre ces 2 lignes ????
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    '   Ecris dans le fichier log_signets.txt
    For i = 10 To Cells(10, 2).End(xlDown).Row
    puis :
    "J'aimerais donc que cette variable "resultat" prenne en compte le nombre de la dernière Fiche d'Instruction créer pour qu'il incrémente (+1)"
    le nombre de la dernière Fiche d'Instruction : késako ?

    Eric

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Orange UIPL
    Inscrit en
    Janvier 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Orange UIPL
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2013
    Messages : 23
    Points : 31
    Points
    31
    Par défaut
    Oui donc mon fichier excel est "appairé" à un fichier word.

    Dans le fichier Excel, il y as un glossaire qui répertorie tout les savoir faire et techniques de mon entreprise. Je fait une insertion de champs (signets) dans mon word via mon excel. (Excel me sert uniquement d'interface) Et pour le nombre de la dernière FI. Je vous montre un exemple:

    L'utilisateur génère la FI 1000 Rev A.
    Un autre utilisateur veut générer une autre FI, elle devra être la FI 1001 donc je doit lier mon nom de fichier dernièrement créer pour l’incrémenter et pouvoir sauvegarder sous FI 1001 rev A.

    En espérant avoir été plus clair que précédemment....

    Encore désolé mais je tente tant bien que mal de m'exprimer le plus français possible ... mais j'ai des difficultés ^^'

    EDIT: J'ai réussis à solutionner mon problème, si des personnes veulent savoir comment j'ai procédé, j'expliquerais volontiers mais c'est pas simple ^^

    Merci bien en tout cas Éric de te pencher sur mon problème !

    Cordialement vôtre !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 04/03/2008, 13h48
  2. requête pour extraire des caractères d'un champ
    Par hellyjlj dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 13/11/2007, 15h32
  3. Extraire des caractères d'une chaine
    Par fabpeden dans le forum C
    Réponses: 5
    Dernier message: 07/05/2007, 10h09
  4. Extraire des caractères spéciaux de la base
    Par Samrock dans le forum Langage
    Réponses: 17
    Dernier message: 28/05/2006, 18h13
  5. Comment extraire des caractères d'une chaine ?
    Par Powa87 dans le forum Langage
    Réponses: 16
    Dernier message: 01/01/2005, 19h00

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