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

Contribuez Discussion :

Fonction permettant de vérifier la disponibilité d'un fichier en local ou réseau pou y effectuer une procédure


Sujet :

Contribuez

  1. #1
    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 Fonction permettant de vérifier la disponibilité d'un fichier en local ou réseau pou y effectuer une procédure
    Bonjour,

    Voilà un moment que je suis sur le forum sans avoir fait encore de contribution (pourtant je pense que j'aurai pu en faire quelques unes )

    Donc voici ma première :

    Vérification qu'un ou des fichiers ne soit pas ouvert par un autre utilisateur ou une autre instance, aussi bien en réseau qu'en local,
    toute plateforme confondu (Mac Excel 2011 et 2016 - Excel PC (désolé, j'ai pas fait les tests sur PC donc si je peux avoir un retour svp) :


    PS : une partie des MsgBox sont là à titre d'indication pour test de la fonction, j'ai essayé de prendre en compte un max de cas possible

    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
    Sub Demo_CheckFileOpen()
    Dim Chm$, Classeur$, Result
            'Chm = "/Volumes/Serveur Fichier/Temporaire/DossierTest/ClasseurO.xls" <= en chemin complet comprenant le fichier
            Chm = "/Volumes/Serveur Fichier/Temporaire/DossierTest":        Classeur = "ClasseurO.xls"  ' <= chemin et fichier séparé | ex : traitement par Dir ou autre
            Result = CheckFileOpen(Chm, Classeur, "00:00:03", 2)
            If Result = True Then
                MsgBox "On peut démarrer la procédure voulu sur le Classeur"
            ElseIf IsEmpty(Result) Then
                MsgBox "Le Classeur n'existe pas au chemin indiqué." & vbCrLf & "Vérifier vos paramètres/procédures !":      Exit Sub
            Else
                Mess = IIf(Result = 1, "Nb de tentatives d'ouvertures du fichier atteint" & vbCrLf & "Le fichier est utilisé sur une autre instance" & vbCrLf & "ou par un autre User", _
                                                    "La procédure ne peux se faire." & vbCrLf & "Vérifier les paramètres, etc …")
                MsgBox Mess
            End If
    End Sub
    La Fonction :
    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
    Function CheckFileOpen(Chm As String, Optional Classeur As String, Optional T As String = "00:00:30", Optional Cpt As Byte)
    Dim Sep$, i As Byte
    '----------------------------------------------------------------------------------------------------------------------
    '====================== Créé par : RyuAuodidacte 20/09/2017 - Fonction CheckFileOpen pour Mac/PC ======================
     
        ' Fonction permettant de vérifier la disponibilité d'un fichier en local ou réseau pou y effectuer une procédure
    '-------------------------------------------------------------------------------------------------------------
        ' PS : une partie des MsgBox sont là à titre d'indication pour test de la fonction, j'ai essayé de prendre en compte un max de cas possible
        ' Bien sur c'est à adapter … et se centrer seulement sur le cas voulu si besoin
    '-------------------------------------------------------------------------------------------------------------
        ' PARAMETRES
        ' Chm = Chemin complet du fichier ou Chemin du dossier où se trouve le fichier
        ' Classeur = Variable représentant le nom du classeur (Extension du ficher compris)
        ' T = Temps d'attente souhaité pour une nouvelle tentative d'ouverture de fichier jusqu'à temps que celui-ci soit disponible
        ' Cpt = Compteur : nombre Maxi de tentatives d'ouvertures du fichier lorsque celui-ci est en cours d'utilisation par un autre User
    '----------------------------------------------------------------------------------------------------------------------
     
        '======== Reconnaissance du séparateur selon la plateforme (Mac/PC) ========
        Sep = Application.PathSeparator
     
        '======== Vérification et séparation en 2 variables du Chemin et du Classeur ========
        If InStrRev(Chm, ".") > 0 Then
            Classeur = Mid(Chm, InStrRev(Chm, Sep) + 1):      Chm = Mid(Chm, 1, InStrRev(Chm, Sep))
        Else
            If Right(Chm, 1) > Sep Then Chm = Chm & Sep
        End If
     
        '======== Vérification que le paramètre Classeur ne soit pas manquant, si il l'est on quitte la fonction ========
        If Classeur = "" Then MsgBox "Mettre la variable ""Classeur"" en paramètre." & vbCrLf & "Celle-ci est manquante !":      CheckFileOpen = False: Exit Function
     
        '======== Vérification si le Classeur est disponible afin d'éffectuer par la suite une procédure | Si paramètre manquant ou chemin faux, indication que la procédure va s'arrêter ========
        Application.DisplayAlerts = False
        On Error Resume Next
                If Workbooks(Classeur).Names Is Nothing Then
                    Workbooks.Open Chm & Classeur, Notify:=False
                    If Workbooks(Classeur).ReadOnly Then
                        MsgBox "Le classeur """ & Classeur & """ est utilisé par " & vbCrLf & "un autre User ou sur une autre instance"
                        Do
                            Workbooks(Classeur).Close False:
                            If Cpt > 0 Then i = i + 1: If Cpt = i - 1 Then CheckFileOpen = 1: Exit Function
                            Application.Wait Now + TimeValue(T):      Workbooks.Open Chm & Classeur, Notify:=False
                            If Workbooks(Classeur).ReadOnly Then MsgBox "Le classeur """ & Classeur & """ n'est pas encore disponible" Else MsgBox "Le classeur """ & Classeur & """ est disponible":      CheckFileOpen = True:      Exit Do
                        Loop While Workbooks(Classeur).ReadOnly
                    Else
                        MsgBox "Ouverture du classeur : " & Classeur:      CheckFileOpen = True
                    End If
                Else
                    MsgBox "Le classeur """ & Classeur & """ est déjà en cours d'utilisation sur cette instance":      CheckFileOpen = True
                End If
        On Error GoTo 0
        Application.DisplayAlerts = True
    End Function
    Merci pour ceux qui me lisent et vos remarques

    A vos tests !!

    Ryu

    Edit : Je reviens pour apporter une précision, comme dit précédemment les MsgBox sont là à titre indicatif afin de se situer aisément sur ce qui se passe lorsqu'on lance le code.
    Certains s'en douteront, et d'autres pas, mais j'ai choisi délibérément de typer ma fonction en tant que Variant pour la simple et bonne raison que selon ce que l'on veut faire (donc l'adaptation),
    on pourra, choisir le type de réponse en retour, c'est-à-dire :
    - un String ou
    - un Boolean ou
    - un Byte pour traiter différent cas
    Car cette fonction est censé être malléable, les MsgBox n'étant pas forcément nécessaire comme réponse (ici en exemple) et qui pourrait être remplacé directement par des actions à faire.

    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

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 594
    Points : 34 263
    Points
    34 263
    Par défaut
    Hello,

    jusqu'à présent j'utilisais la solution disponible dans la
    https://excel.developpez.com/faq/?pa...ClasseurOuvert

    Peut-etre n'est-elle pas compatible Mac, auquel une bien belle idée
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    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
    Salut Jean-Philippe,

    Merci de ton intérêt et de ta remarque
    Je voulais te répondre avant, mais il y avait une chose dont je n'étais plus certain; maintenant que c'est re-testé, je peux t'en dire plus …
    En fait, je n'avais jamais fait ce type de code auparavant, car je n'en est pas eu besoin jusqu'à présent.

    L'origine de cette démarche vient d'un post récent ("Vérifier toutes les 30 secondes si un fichier réseau est disponible"), dont le demandeur n'a pas fait suite.
    Comme ce genre de code est utile, j'ai exploré les propositions, MS (quasi équivalent à la Faq), etc …, et j'ai décidé de faire mon propre code (à ma sauce) en contribution .

    Alors en effet j'ai déjà testé ce code (sur le lien que tu m'as fourni ou celui de MS), et malheureusement, il ne fonctionne pas sur Mac, quelque soit les situations,
    il m'indique toujours que le fichier est fermé => c'est la 2ème raison pour laquelle j'ai fait cette contribution

    PS : Dès que c'est possible, je fais toujours en sorte que mes codes soit multi-plateformes

    Il est vrai que la plupart des propositions sur le net, ne font que le strict minimum, c-à-d : fichier ouvert ou fermé via un Boolean - et suffisant dans la plupart des cas, mais il y a des cas qui demandent à aller au delà …

    Alors que ce que je propose permet vraiment de savoir dans quel cas l'on se trouve (cf le code en post #1) et donc de permettre/prévoir différentes actions.
    Le plus MAC/PC (toutes versions - Sur PC je suis quasi sur que cela marche sur Excel 2010 - 2013 - 2016 (si on peut me confirmer svp) ; pour les autres je ne suis pas en mesure de me prononcer)

    J'essaierai d'appronfondir, il m'est venu une / contexte, pour proposer un autre code qui je pense peux être intéressant (toujours pour MAC/PC )

    Ryu

    Edit : petit ajout de texte
    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

Discussions similaires

  1. Réponses: 5
    Dernier message: 23/06/2005, 15h46
  2. Fonction permettant de remplacer des caractères
    Par PrinceMaster77 dans le forum ASP
    Réponses: 3
    Dernier message: 06/09/2004, 15h48
  3. Fonction permettant d'afficher le chemin d'un fichier
    Par kilinette dans le forum Langage
    Réponses: 4
    Dernier message: 22/06/2004, 10h52
  4. Fonctions permettant la copie d'un répertoire
    Par benj63 dans le forum C++Builder
    Réponses: 6
    Dernier message: 17/06/2004, 08h41

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