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 :

Tester si un fichier est ouvert --> probleme si le fichier n est pas dans le repertoire de destination [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2010
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 28
    Points : 24
    Points
    24
    Par défaut Tester si un fichier est ouvert --> probleme si le fichier n est pas dans le repertoire de destination
    Bonjour a tous,

    je tourne en rond depuis 2 bonnes heures, et plus je reflechis, plus j a il impression que ce casse tete n a pas de solution !!

    Voila mon probleme : je veux tester si un fichier est ouvert, et s il n est pas ouvert l ouvrir. Je vais donc faire un test dans le repertoire de destination du fichier. Difficulute supplementaire : le fichier peut etre ou pas dans ce fichier de destination.

    Voici mon bout de 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
     
    'Fonction qui teste si un fichier est ouvert ou non
    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
     
    Sub Text()
     
    'test pour savoir si mon fichier existe dans mon fichier de destination ou non
    'retourne compt=1 si oui, compt=0 sinon
    Dim oFS As Office.FileSearch
    Set oFS = Application.FileSearch
    With oFS
        .NewSearch
        .FileType = msoFileTypeAllFiles
        .FileName = fichierachercher
        .LookIn = "G:\STOCK" 
        .Execute
        If .FoundFiles.Count = 1 Then
            compt = 1 'le fichier de stock existe dans le fichier de destination
            Else
            compt = 0 'le fichier de stock n existe pas dans le fichier de destination
        End If
    End With
     
    If FichierEstOuvert("G:\STOCK\" & fichierachercher) Then  
       MsgBox ("fichier ouvert") ' le fichier de stock est ouvert --> on s arrete la
    Else
        If compt = 1 Then 'le fichier de stock n est pas ouvert, mais il existe dans le
                            'fichier de destination --> on l ouvre automatiquement
        ChDir "G:\STOCK"
        Workbooks.Open FileName:=fichierachercher
        MsgBox ("le fichier vient d etre ouvert")
        End If
        If compt = 0 Then 'le fichier de stock n est pas ouvert, mais il n existe pas dans le
                            'fichier de destination --> on l ouvre manuellement
            MsgBox ("Open the current Stock file")
            Reponse = Application.Dialogs(xlDialogOpen).Show("C:\Repertoire\sous-repertoire\...\")
            If Reponse = 0 Then 'si l utilisateur annule la recherche de fichier
                 MsgBox ("le fichier de stock n a pas ete ouvert")
            Else
                 MsgBox ("c est ok : fichier ouvert")
            End If
        End If
     
    End If
    End Sub
    Mon code fonctionne (enfin pas de bug dans la compilation).
    Mon probleme est le suivant :
    FichierEstOuvert("G:\STOCK\" & fichierachercher) me retourne true si le fichier est ouvert, mais aussi si le fichier n est pas dans le repertoire.
    J ai bien essaye de mettre un test pour savoir si le fichier etait dans le repertoire dans ma fonction FichierEstOuvert, mais dans tous les cas, elle me retourne toujours la meme chose si :
    - le fichier est ouvert mais n existe pas dans le repertoire
    - le fichier n est pas ouvert mais n existe pas dans le repertoire.

    Au final, je suis bloquee si le fichier n est pas dans le repertoire, et mon test pour savoir si le fichier est ouvert ne fonctionne donc pas dans tous les cas.

    J espere que j ai ete claire, car je commence a avoir les idees un peu embrouillees a force de tourner en rond.

    J aimerais avoir vos avis car la je n y vois plus rien !!

    Merci !
    Cecile

  2. #2
    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,en partant de http://excel.developpez.com/faq/?pag...ClasseurOuvert , à adapter à ton contexte
    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
    Option Explicit
     
    Sub Test()
    Dim i As Integer
        i = VerifClasseur("C:\Transfert\Test.xls")
        Select Case i
            Case 0: MsgBox "Classeur fermé."
            Case 53: MsgBox "Fichier introuvable"
            Case 70: MsgBox "Classeur déja ouvert."
            Case Else: MsgBox "Erreur : " & i
        End Select
    End Sub
     
    Private Function VerifClasseur(Fichier As String) As Integer
    Dim x As Integer
     
        On Error Resume Next
        x = FreeFile()
     
        Open Fichier For Input Lock Read As #x
        Close x
     
        VerifClasseur = Err.Number
     
        On Error GoTo 0
    End Function

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2010
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 28
    Points : 24
    Points
    24
    Par défaut
    En effet, j y vois beaucoup plus clair avec la separation des erreurs !

    J avais aussi penser a utiliser une fonction du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Function FichierExiste(NomFichier As String) As Boolean
        FichierExiste = Dir(NomFichier) <> "" And NomFichier <> ""
    End Function
    pour tester l existence du fichier dans le repertoire de destination, mais ca m a l air plus simple avec ta methode.

    J adapte tout ca a la suite de mon code pour voir si ca marche bien dans tous les cas.

    Merci !

  4. #4
    Membre à l'essai
    Inscrit en
    Juin 2010
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 28
    Points : 24
    Points
    24
    Par défaut
    eh ben ca c est de l efficacite !!
    Mon code qui faisait 500 lignes avant (bon j exagere un peu) n en fait plus que quelques unes, c est beaucoup plus propre, et surtout ca marche !
    Merci !

    J ecris le code si ca peut servir a d autres

    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
    Private Function VerifClasseur(Fichier As String) As Integer
    Dim x As Integer
        On Error Resume Next
        x = FreeFile()
        Open Fichier For Input Lock Read As #x
        Close x
        VerifClasseur = Err.Number
        On Error GoTo 0
    End Function
     
    Sub Test4()
    Dim i As Integer
    i = VerifClasseur("G:\STOCK\" & fichierachercher)
    Select Case i
     
    Case 0: MsgBox "Classeur fermé."
    ChDir "G:\STOCK"
    Workbooks.Open filename:=fichierachercher
     
    Case 53: MsgBox "Fichier introuvable"
    MsgBox ("Open the current Stock file")
    Reponse = Application.Dialogs(xlDialogOpen).Show("C:\Repertoire\sous-repertoire\...\")
    If Reponse = 0 Then 'si l utilisateur annule la recherche de fichier
    MsgBox ("le fichier n a pas ete ouvert")
    Else
    NomStock = ActiveWorkbook.Name
    MsgBox (NomStock)
    End If
     
    Case 70: MsgBox "Classeur déja ouvert."
    'on ne fait rien
     
    Case Else: MsgBox "Erreur : " & i
    End Select
    End Sub

  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2010
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 28
    Points : 24
    Points
    24
    Par défaut
    Aaaaargh ! j ai encore un cas ou ca ne marche pas !
    Si mon classeur est deja ouvert, mais qu il n est pas enregistre dans le bon fichier de destination, ma macro me retourne l erreur 53, c est a dire celle du fichier introuvable, et me propose donc d ouvrir le fichier manuellement comme ecrit dans mon code... or le fichier est deja ouvert !

    Or si mon fichier est deja ouvert, ke veux juste pouvoir poursuivre mon code sans qu il me propose d ouvrir a nouveau ce fichier deja ouvert !

  6. #6
    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
    Re,à adapter
    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
    Option Explicit
     
    Sub Test()
    Dim i As Integer
    Dim sNomWkb As String
        sNomWkb = "Test.xls"
     
        i = VerifClasseur("C:\Transfert\" & sNomWkb)
        Select Case i
            Case 0: MsgBox "Classeur fermé."
            Case 53:
                If WOuvert(sNomWkb) = False Then
                    MsgBox "Fichier introuvable"
                Else
                    MsgBox "Classeur déja ouvert."
                End If
            Case 70: MsgBox "Classeur déja ouvert."
            Case Else: MsgBox "Erreur : " & i
        End Select
    End Sub
     
    Private Function VerifClasseur(Fichier As String) As Integer
    Dim x As Integer
     
        On Error Resume Next
        x = FreeFile()
     
        Open Fichier For Input Lock Read As #x
        Close x
     
        VerifClasseur = Err.Number
     
        On Error GoTo 0
    End Function
     
    Private Function WOuvert(sNom As String) As Boolean
    Dim Wkb As Workbook
        WOuvert = False
        For Each Wkb In Workbooks
            If Wkb.Name = sNom Then
                WOuvert = True
                Exit For
            End If
        Next Wkb
    End Function

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Datacenter
    Inscrit en
    Octobre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Datacenter
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 8
    Points : 9
    Points
    9
    Par défaut
    Bonjour,

    Je me permet de vous poser une question malgré le fait que le sujet soit résolu car votre code est vraiment top!
    Malheureusement il ne gere pas les chemins web (http://xxx/xx/)
    (erreur 52)

    Et ce que c'est moi qui maitrise mal le code (les paramettres) ou est ce qu'il y a qqch a changer ?
    (je vous avoue pas trop voir la différence entre c:\ et http:// vu que c'est sensé etre la meme variable string )
    Merci

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 24/11/2011, 08h20
  2. [XL-2000] Comment fermer un fichier excel si il est ouvert mais sans bug s'il n'est pas ouvert
    Par Avinetor dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 05/06/2009, 14h09
  3. [VB6] (Pilote Isam) Tester si un fichier excel est ouvert
    Par Requin15 dans le forum VB 6 et antérieur
    Réponses: 30
    Dernier message: 20/03/2006, 17h57
  4. Tester si un fichier X est ouvert
    Par James64 dans le forum API, COM et SDKs
    Réponses: 5
    Dernier message: 06/10/2004, 15h48
  5. Comment tester si fichier est ouvert ?
    Par fusef dans le forum Langage
    Réponses: 7
    Dernier message: 11/08/2004, 18h51

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