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 :

Retrouver le nouveau nom d'un fichier dans un dossier


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2012
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2012
    Messages : 78
    Points : 48
    Points
    48
    Par défaut Retrouver le nouveau nom d'un fichier dans un dossier
    Bonjour le forum,

    J'ai créé sous Excel et VBA un fichier des adhérents de notre association. Chaque adhérent a sa fiche accessible dans une UserForm avec sa photo issue d'un dossier Trombi. Pour chacun d'eux j'enregistre le nom du fichier .jpg qui leur est associé. Ainsi à chaque ouverture de fiche, je récupère le fichier dans le dossier Trombi pour l'afficher. Tout ceci fonctionne très bien.

    Mais ce dossier Trombi est aussi utilisé par le webmestre pour le trombinoscope du site, et pour des questions de cache, il modifie le nom du fichier à chaque fois qu'il change une photo, ce qui bien entendu m'oblige à remettre à jour ma base de donnée.
    Je cherche donc à automatiser cette mise à jour.
    Puisque le nouveau nom de fichier comporte une partie inchangée par rapport aux versions précédentes, je cherche le moyen de retrouver le nouveau nom pour mettre à jour le listing, mais je ne trouve pas de solution simple.

    Le fichier peut avoir ces deux libellés :
    1. abcdefg_xy.jpg
    2. abcdefg_xy_(+ une partie qui change à chaque remplacement du fichier).jpg

    abcdefg est de longueur variable. xy est aussi variable et peut avoir de 1 à 3 caractères. Les deux parties sont séparées par un "_". La partie supplémentaire du libellé 2 est elle aussi séparée du libellé 1 par un "_".

    En principe, le premier nom attribué est le libellé 1 qui est par la suite modifié en libellé 2 si le fichier est changé. Mais il peut très bien avoir le libellé 2 et être changé pour le libellé 1. Il faut donc rechercher le nouveau nom sur les 2 libellés, sachant qu'il n'y en aura bien entendu qu'un des deux dans le dossier Trombi.

    Je n'ai (en principe) par de problème pour extraire la partie générique (abcdefg_xy), mais c'est la suite que je ne sais pas par quel bout prendre. Je suppose qu'il faut utiliser le wildcard "*" et/ou Like mais je n'en suis pas sûr. J'ai bien l'idée mais je n'ai pas la manière, et il y a peut-être une méthode plus simple.

    Comment puis-je faire pour récupérer le nouveau nom du fichier, sachant que mon fichier doit rester compatible avec Excel pour MAC (donc exit toutes les windowseries, que du code classique) ?

    D'avance merci pour votre aide.

  2. #2
    Membre chevronné
    Inscrit en
    Septembre 2007
    Messages
    1 132
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 132
    Points : 1 803
    Points
    1 803
    Par défaut
    Bonsoir,

    Il te suffit apparemment de rechercher ta photo ainsi et dans "fichier" tu as le nom complet (sans le répertoire) modifié ou non.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim fichier As String, rep As String
    rep = "chemin_trombi\"
    fichier = Dir(rep & "abcdefg_xy" & "*")

  3. #3
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour
    La fonction Dir accepte l'utilisation des caractères génériques.
    Ainsi :
    veut dire : tout dossier qui, dans le répertoire F:\toto\ a un nom commençant par "cl", contenant un "." et se terminant par "sm"
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  4. #4
    Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2012
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2012
    Messages : 78
    Points : 48
    Points
    48
    Par défaut
    Merci pour vos réponses.
    En effet, avec dir c'est tellement plus simple. Je teste ça demain et je reviens vers vous.

    Edit :
    Finalement je viens de tester ce soir et ça fonctionne super bien avec dir. Merci pour votre aide qui m'a fait gagner du temps.
    Sujet résolu.

  5. #5
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Points : 11 274
    Points
    11 274
    Par défaut
    Salut, à lire
    extrait :
    Dir on a Mac is not working the same as in Excel for Windows, you can not use a Filter and wildcards on a Mac

  6. #6
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour kiki29
    Merci de cette précision.
    Il lui faudra alors, s'il veut assurer cette compatibilité, boucler avec Dir sur la totalité et utiliser Like pour ne garder que les éléments qui l'intéressent.
    Je me rappelle avoir déposé quelque-chose de ce genre (même plus complet) en contributions.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  7. #7
    Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2012
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2012
    Messages : 78
    Points : 48
    Points
    48
    Par défaut
    Ah zut j'ai répondu trop vite. Dir marchait trop bien. Va falloir que je fasse du dev pour MAC alors..... Mais pourquoi n'ont ils pas tous des PC ?

  8. #8
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Points : 11 274
    Points
    11 274
    Par défaut
    Salut, rdb donne un exemple purement Mac via le même lien
    Note: This function is only working in the Mac Excel versions 2011 and 2016
    Il m'est arrivé jadis d'utiliser qqch comme sys = UCase$(Left$(Application.OperatingSystem, 3)) pour récupérer WIN ou MAC et sélectionner la procédure idoine.

  9. #9
    Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2012
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2012
    Messages : 78
    Points : 48
    Points
    48
    Par défaut
    Merci kiki29.
    Quoique je fasse, il faut que j'introduise un Application.OperatingSystem pour qu'au moins le code soit propre. Après, je vois si je fais du dev pour MAC, ou si je zappe.
    Vu qu'il n'y a qu'un seul utilisateur MAC, je ne vais probablement pas me prendre trop la tête pour le moment avec ça. Je vais juste zapper la recherche. Il ne s'agit pas d'une donnée essentielle pour le fonctionnement du fichier. Juste un peu de cosmétique pour associer un nom à une photo.
    Tant que le nom ne changera pas, la photo s'affichera sur le MAC. Si le nom change, soit il attendra qu'un PC fasse la maj, soit il passera par l'USF que j'ai créé pour faire défiler les photos et choisir celle à associer.
    Merci en tout cas pour l'info.
    Voici mon bout de code qui fonctionne :
    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
            If Cells(Lig, [cTrombi].Column) <> "" Then
                Dim NomFich As String
                Dim NomFichTotal As String
                'vérification de l'existence du fichier
                NomFich = Cells(Lig, [cTrombi].Column)
                NomFichTotal = Dir(RepTrombi & NomFich)
                If Len(NomFichTotal) = 0 Then
                    'vérification du nombre d'occurrences de "_" dans NomFich
                    Dim NbOc As Byte
                    Dim NomFichTemp
                    NbOc = (Len(NomFich) - Len(Replace(NomFich, "_", "", , , 1))) / Len("_")
                    If NbOc = 1 Then
                        'suppression des 4 derniers caractères ".jpg"
                        NomFichTemp = Mid(NomFich, 1, Len(NomFich) - 4)
                    Else
                        NomFichTemp = Left(NomFich, InStr((InStr(1, NomFich, "_", 1) + 1), NomFich, "_", 1) - 1)
                    End If
                    On Error Resume Next 'au cas où le dossier ne soit pas accessible
                    'recherche du nouveau nom du fichier
                    NomFich = Dir(RepTrombi & NomFichTemp & "*.jpg")
                    On Error GoTo 0
                 End If
                .BoxFichierTrombi.Value = NomFich
                .Trombi.Picture = LoadPicture(RepTrombi & NomFich)
            End If

  10. #10
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Bonjour,

    Je suis sur Mac et utilisé aussi la version d'excel PC 2010.
    je m'arrange à faire du VBA pour les 2 plateformes.

    Personnellement, je n'utiliserais pas Application.OperatingSystem mais plutôt Application.Version,
    qui permet de savoir sur quel type d'excel on se trouve sur Mac entre le 2011 et le 2016 dont certains changements ne sont pas à prendre à la légère.

    Exemples pour savoir sur quelle plateforme l'on se trouve :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub MAC_PC()
    Dim Sep As String
        Sep = Application.PathSeparator
        #If Mac Then
            If Val(Application.Version) < 15 Then
                MsgBox "Mac Excel 2011"
            Else
                MsgBox "Mac Excel 2016"
            End If
        #Else
            MsgBox "Excel PC"
        #End If
    End Sub
    Où bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub MAC_PC2()
    Dim Sep As String
        Sep = Application.PathSeparator 'le fait de déclarer la variable de séparation est très utile et on peut s'en servir qq soit la plateforme (PC/MAC)
        If Sep = ":" Then
            MsgBox "Mac Excel 2011"
        ElseIf Sep = "/" Then
            MsgBox "Mac Excel 2016"
        Else
            MsgBox "Excel PC" ' Sep = "\"
        End If
    End Sub
    A partir de là il est plus simple de coder (en sus des conseils ci-dessous)

    Bien sur éviter tout ce qui est propre à PC : ActiveX, DLL, Dictionnaire (utiliser la Collection), …

    Voilà
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  11. #11
    Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2012
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2012
    Messages : 78
    Points : 48
    Points
    48
    Par défaut
    Bonjour RyuAutodidacte.

    Je ne suis pas contre la version, mais je ne vois pas comment elles sont différenciées puisqu'elles portent le même numéro.

    Val(Application.Version) renverra le même numéro respectivement pour Excel 2007, 2010, 2013, 2016 (PC) et Excel 2008, 2010, 2013, 2016 (MAC).

    Il y a effectivement des différences entre les versions à l'intérieur d'un même système, d'où l'utilisation de l'Application.Version dans certains codes, mais en aucun cas ça permet de déterminer la plateforme. Pour moi le seul moyen de différencier un PC d'un MAC c'est bien Application.OperatingSystem.

  12. #12
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Re,

    si tu regardes bien le 1er code, Application.Version ne sert que pour la version Mac et non Windows car sur Mac (PS : ceux sont les versions 2011 et 2016 qui sont utilisé actuellement sur Mac),
    il y a une réelle différence entre la version Mac 2011 et Mac 2016, le séparateur :
    - Mac Excel 2011 : ":"
    - Mac Excel 2016 : "/" (on aura ici un chemin du type unix (ne pas confondre avec "\" sur PC))

    Dans le 1er code on regarde seulement si on est sur Mac ou PC, dans le cas ou l'on est sur Mac on cherche seulement à savoir sur quel version d'Excel l'on se trouve,
    car il y a certaine différence de codage notamment au niveau du chemin, …, ce qui est pas le cas sur PC comparer au Mac

    Une autre façon de faire, avec le 2ème code, on ne se sert que du séparateur pour déterminer si l'on est sur Mac (Excel 2011 ou 2016) ou sur PC (Excel quasi toutes versions)

    Si tu utilise Application.OperatingSystem, on peut effectivement savoir si on est sur Mac ou pas, mais en aucun cas tu aurais eu la réponse sur quel version Mac l'on est …
    et là tu aurais rencontré qq soucis …
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  13. #13
    Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2012
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2012
    Messages : 78
    Points : 48
    Points
    48
    Par défaut
    Ah OK. Autant pour moi.
    En fait j'avoue que je n'avais pas regardé les codes car je ne connaissais pas cette subtilité chez la pomme.
    Dans le monde PC un Val(Application.Version) renvoi seulement un xx.0.
    J'aurai appris quelque chose.
    Merci pour ces explications.

  14. #14
    Expert confirmé
    Homme Profil pro
    PAO
    Inscrit en
    Octobre 2014
    Messages
    2 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : PAO
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2 576
    Points : 4 174
    Points
    4 174
    Par défaut
    Citation Envoyé par Mic13710 Voir le message
    … je ne connaissais pas cette subtilité chez la pomme.
    Dans le monde PC un Val(Application.Version) renvoi seulement un xx.0.
    Val(Application.Version) renvoi bien la version d'excel autant sur Mac que sur PC,
    le problème réside avec la dernière version d'Excel Mac 2016 ou pas mal de choses ont changé.
    Sur Mac :
    • on passe d'une version 2011 à 2016 (sacré écart, et pas mal d'eau a coulé sous les ponts)
    • Excel 2016 a amoindri les outils permettant de faire de la programmation correctement, comme par exemple avoir enlevé la fenêtre des variables locales en autre
    • Le sytème d'Apple à intégrer une SandBox, ce qui fait qu'il y a des restrictions par le sytème OS X auxquelles il faut faire face …
    • Sur 2016 le chemin à changé et est de type unix :
    ex : "/Users/UserName/Desktop/SousDossier1/SousDossier2/… etc/fichier.extension" (sur Excel 2011 : "Macintosh HD:Users: UserName:desktop:SousDossier1: SousDossier1:… etc:fichier.extension")
    • pour permettre de faire des scripts sur 2016 on doit dorénavant et pour une grande partie, passer par AppleScriptTask au lieu de MacScript
    - pour faire un script avec AppleScriptTask on doit le compartimenter dans un dossier au lieu de le faire en direct : ici Excel 2016 Mac s'est plié à la politique d'Apple avec le SandBox

    Surement que j'en ai oublié, mais c'est déjà pas mal
    Cordialement
    Ryu

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. – Albert Einstein

    Pensez à la Balise [ CODE][/CODE ] - à utiliser via le bouton # => Exemple

    Une fois votre problème solutionné pensez à mettre en n'oubliant pas d'indiquer qu'elle est la solution finale choisie

  15. #15
    Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2012
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2012
    Messages : 78
    Points : 48
    Points
    48
    Par défaut
    Merci un peu tardif RyuAutodidacte pour ces informations complémentaires. Je n'ai pas reçu de notification.

    Ca n'a pas l'air simple tout ça.
    A l'inverse, un fichier office développé en VBA sous MAC ne pourra pas être utilisé sous PC. Deux mondes à part quoi.
    Comme je crois que le MAC en question est sous Excel 2016, je vais très probablement éviter de me lancer dans un développement trop compliqué que je ne maitrise pas et que je ne peux pas vérifier (je n'ai pas de MAC). Ce sera donc sans.

Discussions similaires

  1. [Batch] Récupérer le nom d'un fichier dans un dossier
    Par mmahouac dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 13/08/2009, 16h47
  2. Rechercher les nom de fichier dans un dossier
    Par Didibzh dans le forum Langage
    Réponses: 2
    Dernier message: 15/06/2007, 11h41
  3. Commande sh permettant de récupérer le nom d'un fichier dans un repertoire
    Par Actarus78 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 13/09/2006, 17h18
  4. extraire le nom d'un fichier dans une chaine sauf le car -
    Par digger dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 13/12/2005, 00h02

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