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 :

[VBA-E] comment tester si un fichier est déjà ouvert?


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    795
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 795
    Par défaut [VBA-E] comment tester si un fichier est déjà ouvert?
    Bonjour à tous
    alors voila je fais une application sur excel.
    Au départ je voulais faire un seul fichier xls (on va l'appelé fichier1 pour la compréhension) mais le problème est que plusieurs personnes devront utilisé et modifier le contenu du fichier1
    et donc il risque d'avoir une perte de temps assez importante car un fois le fichier ouvert les autres utlisateurs ne pourrons utilisé ce fichier qu'en lecture seul
    Alors j'ai eu l'idée de dupliqué le fichier1 pour obtenir un traitement de ce style :
    si le fichier1 n'est pas utilisé -> utilisé le fichier1
    sinon testé le fichier2
    si le fichier2 n'est pas ouvert ->utilisé le fichier2
    sinon testé le fichier3
    si le fichier3 n'est pas ouvert ->utilisé le fichier3
    sinon indiqué à l'utilisateur de réessayé plus tard


    Comment pourais je faire le teste pour savoir si un fichier est déja ouvert? ou y a t'il un autre moyen ?

  2. #2
    Membre Expert
    Avatar de pc75
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    3 662
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 3 662
    Par défaut
    Bonjour,

    Tu dois pouvoir t'en sortir avec une gestion d'erreur non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    on error goto Erreur1
    open ....
     
    Erreur1:
    .....

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 105
    Par défaut
    Bonjour.

    Essai ceci : test si excel est ouvert et liste des fichiers utilisés.

    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
    Public Function Excel_Ouvert() As Boolean
     
        Dim Wb As Excel.Workbook
        Dim Appli As Excel.Application
     
        On Error Resume Next
     
        Set Appli = GetObject(, "Excel.Application")
     
        If Appli Is Nothing Then
            Excel_Ouvert = False
        Else
            Excel_Ouvert = True
        End If
     
        For Each Wb In Appli.Workbooks
            If Wb.Name = "classeurTest.xls" Then
                MsgBox "Le classeur est ouvert"
                Wb.Close True ' Fermeture classeur en sauvegardant les modifications
                Exit Function
            End If
        Next Wb
     
    End Function
    A toi de l'adapter à tes besoins.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    795
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 795
    Par défaut
    j'te remercie mais il va falloir m'expliquez un peu plus si possible car pour réadapter un code il faut le comprendre
    pourrai tu me mettre un peu plus de commentaire ? merci

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 105
    Par défaut
    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
    Public Function Excel_Ouvert() As Boolean
     
      Dim Wb As Excel.Workbook
      Dim Appli As Excel.Application
     
      On Error Resume Next
     
      Set Appli = GetObject(, "Excel.Application")
     
      ' Le test ci-dessous permet de vérifier si Excel est ouvert. Inutile peut-être dans ton cas, c'est juste un exemple.
     
      If Appli Is Nothing Then
        Excel_Ouvert = False
      Else
        Excel_Ouvert = True
      End If
     
      ' Le test ci-dessous permet de lister les fichiers Excel ouvert. A toi de déterminer lequel il faudra ouvrir.
     
      For Each Wb In Appli.Workbooks
        If Wb.Name = "Fichier1.xls" or Wb.Name="Fichier2.xls then
          ' ...
        End If
      Next Wb
     
      ' A toi de stocker dans un tableau la liste des fichiers ouverts (ou le dernier) pour savoir lequel ouvrir.
     
    End Function
    Désolé, j'ai un travail à faire et je ne peux pas développer plus mon exemple par rapport à ton besoin ponctuel.

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 290
    Par défaut
    Bonjour,
    Ce code teste si un fichier .xls est ouvert, si non propose de l'ouvrir, celà ne répond pas complètement à ta demande, mais enfin il peut servir.
    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
     
    Private Function EstDansCollection(Coln As Object, Item As String) As Boolean
    Dim obj As Object
    On Error Resume Next
    Set obj = Coln(Item)
    EstDansCollection = Not obj Is Nothing
    End Function
     
    Private Sub CommandButton1_Click()
    Dim Reponse
        If EstDansCollection(Workbooks, "Classeur2.xls") = True Then
            MsgBox "Le classeur est déjà ouvert !"
        Exit Sub
    End If
     
    If EstDansCollection(Workbooks, "Classeur2.xls") = False Then
        Reponse = MsgBox("Le classeur n'est pas ouvert, voulez-vous l'ouvrir ?", vbInformation + vbYesNo)
        If (Reponse = vbNo) Then
        Exit Sub
    Else
            Workbooks.Open ("Classeur2.xls")
        End If
    End If
    End Sub
    jpleroisse

  7. #7
    Membre Expert Avatar de Megaxel
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    1 187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 1 187
    Par défaut
    Hello!
    J'ai peut-être mal compris, mais il me semble que la question de départ est de savoir si le fichier n'est pas déjà ouvert PAR UN AUTRE UTILISATEUR.
    C'est bien ça ?
    Si oui, j'ai lu un post il y a quelques temps, qui parlait des fonctionnalités multi-utilisateurs qu'offrent les dernières versions d'Excel.
    Tu pourrais regarder dans cette direction, non?

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    795
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 795
    Par défaut
    c'est bien ca Megaxel mais hélas mon entreprise (et non je ne vais pas ca par plaisir) ne dispose que de excel 97 donc je suis un peu coincé

  9. #9
    Membre expérimenté
    Inscrit en
    Novembre 2005
    Messages
    130
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 130
    Par défaut
    Bonjour à tous

    Donc on veut tester si en fichier est ouvert ?
    Alors voila:

    cette fonction renvoi Vrai si le fichier est ouvert et ......dans le cas contraire !

    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
    Sub Procedure
    If FichierEstOuvert("C:\Test.xls") then
       blabla
    else
       blabla
    end sub
     
    Function FichierEstOuvert(ByRef FichierTeste As String) As Boolean
        Dim Fichier As Long
        On Error GoTo Erreur
        Fichier = FreeFile
        Open FichierTeste For Input Lock Read As #Fichier
        Close #Fichier
        FichierEstOuvert = False
        Exit Function
    Erreur:
        FichierEstOuvert = True
    End Function
    Cel ne fonctionne pas avec toutes les extentions mais c'est OK pour les XLS entre autres !

    @+

  10. #10
    Invité de passage
    Homme Profil pro
    Webmaster
    Inscrit en
    Janvier 2016
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2016
    Messages : 1
    Par défaut
    Citation Envoyé par bouley Voir le message
    Bonjour à tous

    Donc on veut tester si en fichier est ouvert ?
    Alors voila:

    cette fonction renvoi Vrai si le fichier est ouvert et ......dans le cas contraire !

    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
    Sub Procedure
    If FichierEstOuvert("C:\Test.xls") then
       blabla
    else
       blabla
    end sub
     
    Function FichierEstOuvert(ByRef FichierTeste As String) As Boolean
        Dim Fichier As Long
        On Error GoTo Erreur
        Fichier = FreeFile
        Open FichierTeste For Input Lock Read As #Fichier
        Close #Fichier
        FichierEstOuvert = False
        Exit Function
    Erreur:
        FichierEstOuvert = True
    End Function
    Cel ne fonctionne pas avec toutes les extentions mais c'est OK pour les XLS entre autres !

    @+

    Bonjour! Je réponds longtemps après , mais je viens de découvrir le message. En effet, ce code est super ,simple, et marche parfaitement chez moi, il suffit d'adapter pour ouvrir le fichier en question ou un autre.

    Avec mes meilleurs sentiments.

  11. #11
    Invité
    Invité(e)
    Par défaut
    Salut,

    Le code de bouley est dérivé de ce code je pense:
    https://support.microsoft.com/en-us/kb/291295
    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
    Sub TestFileOpened()
     
        ' Test to see if the file is open.
        If IsFileOpen("c:\Book2.xls") Then
            ' Display a message stating the file in use.
            MsgBox "File already in use!"
            '
            ' Add code here to handle case where file is open by another
            ' user.
            '
        Else
            ' Display a message stating the file is not in use.
            MsgBox "File not in use!"
            ' Open the file in Microsoft Excel.
            Workbooks.Open "c:\Book2.xls"
            '
            ' Add code here to handle case where file is NOT open by another
            ' user.
            '
        End If
     
    End Sub
     
    ' This function checks to see if a file is open or not. If the file is
    ' already open, it returns True. If the file is not open, it returns
    ' False. Otherwise, a run-time error occurs because there is
    ' some other problem accessing the file.
     
    Function IsFileOpen(filename As String)
        Dim filenum As Integer, errnum As Integer
     
        On Error Resume Next   ' Turn error checking off.
        filenum = FreeFile()   ' Get a free file number.
        ' Attempt to open the file and lock it.
        Open filename For Input Lock Read As #filenum
        Close filenum          ' Close the file.
        errnum = Err           ' Save the error number that occurred.
        On Error GoTo 0        ' Turn error checking back on.
     
        ' Check to see which error occurred.
        Select Case errnum
     
            ' No error occurred.
            ' File is NOT already open by another user.
            Case 0
             IsFileOpen = False
     
            ' Error number for "Permission Denied."
            ' File is already opened by another user.
            Case 70
                IsFileOpen = True
     
            ' Another error occurred.
            Case Else
                Error errnum
        End Select
     
    End Function

    @+

  12. #12
    Expert confirmé
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 093
    Billets dans le blog
    20
    Par défaut
    Bonjour,

    Avez vous essayé ce code, qui vérifie à l'ouverture du fichier s'il est en lecture seule ? à mettre dans THISWORKBOOK

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub Workbook_Open()
    isreadonly
    End Sub
     
    Sub isreadonly()
        If ThisWorkbook.ReadOnly Then
    MsgBox "Vous ne pouvez ouvrir actuellement ce fichier"
     
    ThisWorkbook.Close False
        End If
    End Sub
    Have a nice day. Oliv'
    Votre réponse est peut être dans mon blog !
    https://www.developpez.net/forums/blogs/191381-oliv-/

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    795
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 795
    Par défaut
    bonjour je reviens sur ce sujet que j'avai lasser de coté quelque temps car j'étais sur d'autre problème


    J'ai essayé de réadapter le code de bouley

    mais sans succes

    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
     
     
    Sub Procedure()
    If FichierEstOuvert("C:\Mes documents\Angelo\Conception\Apac Noisy\Domaine Chèque\Mensuel") Then
       Workbooks.Open ("C:\Mes documents\Angelo\Conception\Apac Noisy\Domaine Chèque\Mensuel2")
    Else
        Exit Sub
    End If
    If FichierEstOuvert("C:\Mes documents\Angelo\Conception\Apac Noisy\Domaine Chèque\Mensuel2") Then
      Workbooks.Open ("C:\Mes documents\Angelo\Conception\Apac Noisy\Domaine Chèque\Mensuel3")
    Else
        Exit Sub
    End If
    If FichierEstOuvert("C:\Mes documents\Angelo\Conception\Apac Noisy\Domaine Chèque\Mensuel3") Then
       MsgBox ("tout les fichiers sont ouverts")
    Else
        Exit Sub
    End If
    End Sub
     
    Function FichierEstOuvert(ByRef FichierTeste As String) As Boolean
        Dim Fichier As Long
        On Error GoTo Erreur
        Fichier = FreeFile
        Open FichierTeste For Input Lock Read As #Fichier
        Close #Fichier
        FichierEstOuvert = False
        Exit Function
    Erreur:
        FichierEstOuvert = True
    End Function

    j'ai placé ce code dans un module
    mais peut etre aurai je du le mettre au tout début??
    quoiqu'il en soit lorsque je lance Mensuel alors qu'il est déjà ouvert ca m'indique que le fichier est déjà ouvert et me propose de l'ouvrir en lectur seul alors que je voudrais pas qu'il propose ca mais plutot qu'il ouvre directement un fichier (mensuel2 ou mensuel3) qui soit pas ouvert

  14. #14
    Membre expérimenté
    Inscrit en
    Novembre 2005
    Messages
    130
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 130
    Par défaut
    Bonjour Nom

    Pour que tu adaptes ce que je t'ai montré le code il faut:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Not FichierEstOuvert("C:\Me............
    et non pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If FichierEstOuvert("C:\Me............
    ou tu inverses ton code entre le if et le else et le else et le end if !!!

    la fonction FichierEstOuvert est vrai si le fichier est ouvert et non l'inverse.
    @+

  15. #15
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Je pense qu'il y a un truc très simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    On error resume next
    Workbooks(NomDuFichier).activate
    if err <> 0 then Workbooks.Open Filename:=NomDuFichier
    on error goto 0
    A+

    Edit
    à la place de "<> 0" tu peux mettre le N° de l'erreur correspondant à l'activation d'un fichier qui n'est pas ouvert.
    if err = 9 then Workbooks.Open Filename:=NomDuFichier

  16. #16
    Membre confirmé Avatar de Ania
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 155
    Par défaut
    Bonjour tout le monde

    J'ai une question par rapport à ton code Ouskel'n'or

    Citation Envoyé par ouskel'n'or
    Je pense qu'il y a un truc très simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    On error resume next
    Workbooks(NomDuFichier).activate
    if err <> 0 then Workbooks.Open Filename:=NomDuFichier
    on error goto 0
    A+

    Edit
    à la place de "<> 0" tu peux mettre le N° de l'erreur correspondant à l'activation d'un fichier qui n'est pas ouvert.
    if err = 9 then Workbooks.Open Filename:=NomDuFichier
    En fait pourquoi n'y a t il pas besoin d'un "end if" est ce a cause de la gestion d'erreur qui le rends inutile ??

    PS je savais pas ou mettre ce post dite moi s'il n'est pas a sa place..

  17. #17
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Par défaut
    Vu que le posteur initial n'a plus daigné nous dire où en était son problème, il n'y a pas de mal à poser ta question ici.

    Réponse:
    Il ne faut pas de End If si l'action suit le Then sur la même ligne.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  18. #18
    Membre confirmé Avatar de Ania
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 155
    Par défaut
    Je te remercie AlainTech la réponse était toute simple et peut permettre d'aléger le code, mais peut etre perd on en lisibilité ou plutot c'est une question d'habitude.

    Encore merci et bonne continuation

  19. #19
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Bien que, sans doute à cause de l'habitude, je trouve très lisible un "if ... then... LeTraitement" sur une même ligne, tu peux le mettre sur trois lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if err <> 0 then
        Workbooks.Open Filename:=NomDuFichier
    endif
    C'est pas gênant

  20. #20
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    795
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 795
    Par défaut
    Citation Envoyé par AlainTech
    Vu que le posteur initial n'a plus daigné nous dire où en était son problème, il n'y a pas de mal à poser ta question ici.
    oublié de mettre délestage

    finalement ce traitement m'ai plus utile j'ai changer de "stratégie " enfin on m'a fais changer et donc un seul utilisateur à la fois sera amené a ouvrir mes fichiers ...

Discussions similaires

  1. Comment vérifier qu'un fichier est déjà ouvert ?
    Par n@n¤u dans le forum Entrée/Sortie
    Réponses: 14
    Dernier message: 04/08/2011, 12h23
  2. Tester si un fichier est déjà ouvert par un programme tiers
    Par E@gle_One dans le forum Entrée/Sortie
    Réponses: 16
    Dernier message: 17/04/2008, 11h33
  3. tester si un fichier est déjà ouvert
    Par fredppp dans le forum VC++ .NET
    Réponses: 1
    Dernier message: 21/05/2007, 13h29
  4. Réponses: 14
    Dernier message: 07/07/2006, 16h27

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