Excel VBA : test fichier nom variable ouvert

Résolu
Bonjour,

J'essaie vainement de trouver si un fichier est ouvert et s"il est ouvert de le sauvegarder avant de lancer une macro.

j'ai donc trouvé a cet effet sur un autre forum :

Function FichOuvert(F As String) As Boolean
'Auteur: Didier_mdf  sur forum www.Excel-downloads.com (merci)
Dim Wk As Workbook
On Error Resume Next
Set Wk = Workbooks(F)
On Error GoTo 0
FichOuvert = Not Wk Is Nothing
End Function

mais ça ne semble pas fonctionner dans mon cas car le nom de mon fichier est variable d'un mois sur l'autre (utilisation_octobre.xlsx, utilisation_novembre.xlsx, etc.)
j'ai donc tenté d'appeler cette fonction en utilisant :

FichOuvert ("utilisation_*.xlsx") 

sachant qu'un seul fichier de ce type est ouvert à la fois. Mais le fichier n'est pas détecté ouvert (alors qu'il l'est :) )
Auriez vous la syntaxe correcte svp ?

Merci d'avance pour votre aide

5 réponses

  1. Effectivement.. je vais être plus précis : le fichier a toujours le même nom hormis le nom du mois en fin de chaîne de caractères, il s'agit toujours du mois précédent.
    Pour la session Excel ... je ne connais pas le principe de session. Mais voici ce qui peut arriver. La personne ouvre le fichier, effectue des modifications à l'intérieur puis ouvre le fichier contenant la macro de mise à jour. Suivant cette description, je dirais que ce n'est pas dans la même session (?).
    La notion d'année n'est pas prise en compte.

    j'ai bien inclus l'ouverture du fichier dans la macro (juste pour la mise à jour auto après modif), c'est ce qui leur fait perdre leurs modifications lors des mise a jour.
    sinon, effectivement je pourrais aussi leur faire ouvrir ce fichier pour effectuer les modifications....
    Merci en tout cas pour toutes vos pistes (que je vais essayer :) )
    1. Merci a vous pour toutes ces réponses. Je vais regarder comment je peux utiliser tout cela pour résoudre mon problème.

      Le cas d'utilisation est en fait, un fichier contenant une extraction de données d'une base de données, que j'envoie, formé dans des tableaux issues d'une macro, a d'autres utilisateur qui vont analyser ces tableaux.
      Parfois certaines erreurs nécessite de basculer des information d'un tableau a un autre en basculant des lignes sur des onglets et la, les utilisateurs dispose d'un macro qui permet de mettre a jour les tableaux.
      Le problème étant que certains font tout le travail et ne sauvegarde pas avant de lancer la mise a jour, hors ma macro ouvre le fichier du disque (qu'il doivent sélectionner) et du coup écrase toutes leurs modifications.

      Pour éviter ça, il suffirait d'enregistrer le fichier s'il est déjà ouvert, d'ou ma question :)
      les paramètres supplémentaires sont :
      - le nom du fichier varie d'un mois sur l'autre
      - les utilisateurs utilisent chacun leur répertoire local pour stocker le fichier donc je ne connais pas le chemin

      J'espère avoir été clair dans mes explications
      1. Contributeur
        Re,

        Il va falloir être un peu plus précis car si tu ne connais ni le nom du fichier, ni son chemin ça fait beaucoup à contrôler...
        Est-ce que ton fichier est obligatoirement celui du mois en cours ? Ou éventuellement en plus celui du mois précédent et/ou suivant ?
        Est-que c'est obligatoirement dans la même session excel ?
        Quand on sera en janvier 2012 il écrasera celui de janvier 2011 ? ou bien il y a des sous-répertoires ?

        Tu pourrais inclure l'ouverture du fichier dans ta macro. Comme ça tu auras le nom, le chemin, tu seras sûr d'être dans la même session et tu pourras contrôler facilement s'il est déjà ouvert.
        Et tant pis pour ceux qui ouvrent hors macro, ils recommencent...

        eric
    2. Modérateur
      Bonjour,
      Pourquoi pas avec une fonction qui boucle sur tous les classeurs ouverts dans l'application...

      Function ClasseurOuvert(ExtraitNom As String) As Boolean  
      Dim Wb As Workbook  
      
      ClasseurOuvert = False  
      For Each Wb In Application.Workbooks  
          If Wb.Name Like ExtraitNom & "*" Then  
              ClasseurOuvert = True 
              Exit For 
          End If  
      Next Wb  
      End Function

      Et l'appel dans la procédure :
      Sub test()  
      ClasseurOuvert "utilisation_"  
      End Sub


      Edit : mes excuses : Bonjour à tous les deux et bonne journée!...
      Cordialement,
      Franck P
      1. Contributeur
        Bonjour tout le monde,

        Je pense que cette solution ne marche que si le fichier est ouvert dans la même session d'excel.
        C'est peut-être pour ça que la solution de MDF ne marche pas non plus dans son cas.

        eric
      2. Contributeur
        edit :
        à relire c'est sans doute plus parce qu'il ne connait pas le nom exact du fichier...
        Donc je retire :-)

        eric
    3. Contributeur
      Bon, là ça fonctionne
      Function FichOuvert(Optional Mois As Integer = 0) As Boolean   
      Dim fich As Integer   
      Dim F As String   
      dim TB   
          TB = Array(" ", "Janvier", "Fevrier", "Mars") 'Etc..   
          If Mois = 0 Then   
          'Le fichier du mois actuel   
              F = "C:\monRepertoire1\utilisation_" & TB(Month(Now)) & ".xlsx"   
          Else   
              'Le fichier du mois sélectionner   
              F = "C:\monRepertoire1\utilisation_" & TB(Mois) & ".xlsx"   
          End If   
          On Error Resume Next   
          fich = FreeFile   
          Open F For Input Lock Read As #fich   
          Close #fich   
          If Err <> 0 Then FichOuvert = True   
      End Function

      A+
      Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
      NOTE : Je ne répond pas aux MP pour les questions techniques.
      1. Contributeur
        Bonjour,
        1°) il faut renseigner le chemin complet du fichier, par exemple...
        C:\monRepertoire1\monRepertoire2\utilisation_novembre.xlsx

        Function FichOuvert(Optional Mois As Integer = 0) As Boolean
        Dim TB
        Dim F As String
        Dim Wk As Workbook
            TB = Array("Janvier", "Fevrier", "Mars") 'Etc..
            If Mois = 0 Then
            'Le fichier du mois actuel
                F = "C:\monRepertoire1\utilisation_" & TB(Month(Now)) & ".xlsx"
            Else
                'Le fichier du mois sélectionner
                F = "C:\monRepertoire1\utilisation_" & TB(Mois) & ".xlsx"
            End If
        
            On Error Resume Next
            Set Wk = Workbooks(F)
            On Error GoTo 0
            FichOuvert = Not Wk Is Nothing
        End Function

        Nous somme en novembre, si tu veux avoir le mois de novembre tu met
        MaVar = FichOuvert()
        Mais si tu veux avoir par exemple février tu met
        MaVar = FichOuvert(2)
        Bien sur tu dois continuer l'énumération des mois et mettre le ou les répertoire(s) pour avoir le chemin complet.
        A+
        1. Contributeur
          Mais même avec la bonne syntaxe ce système ne fonctionne pas.
          Explique ce que tu veux exactement.