VBA: vérifier si un Classeur est ouvert 11


Lors de l'automatisation d'Excel, il est souvent nécessaire de vérifier si un Classeur est ouvert (déjà). Cette information peut servir pour savoir si le fichier est disponible ou non pour être "manipulé". Il n'est par exemple pas possible de supprimer un fichier ouvert. Tout comme un Classeur déjà ouvert ne peut être ré-ouvert par un autre utilisateur qu'en "lecture seule". Ces événements peuvent facilement perturber le bon fonctionnement de vos macros – autant donc les gérer en amont.

Ceci est d'autant plus important si vous travaillez en réseau et que les fichiers sont partagés par plusieurs utilisateurs.

Voici donc une fonction qui vérifie si un fichier est ouvert ou non – ou plus précisément si le Classeur est disponible à l'utilisation ou non.  Un Classeur ouvert en "lecture seule" par un autre utilisateur reste disponible à l'utilisation et est donc considéré comme "fermé".

Cette fonction retourne une valeur "Vrai" ou "Faux" (= True ou False) selon si le fichier est déjà ouvert ("occupé") ou non.

La fonction utilise un argument: MonClasseur de type String qui contient le chemin complet du Classeur (par ex.: "C:\Test\MonClasseur.xlsx" ).

Voici donc le code VBA de la fonction prêt à l'emploi ainsi qu'un exemple pratique de son utilisation.

Code VBA de la fonction qui vérifie si un Classeur est (déjà) ouvert

Function EstClasseurOuvert(MonClasseur As String)
'par: https://excel-malin.com

Dim NumeroFichier As Long, NumeroErreur As Long

    On Error Resume Next
    NumeroFichier = FreeFile()
    Open MonClasseur For Input Lock Read As #NumeroFichier
    Close NumeroFichier
    NumeroErreur = Err
    On Error GoTo 0

    Select Case NumeroErreur
    Case 0:    EstClasseurOuvert = False
    Case 70:   EstClasseurOuvert = True
    Case Else: Error NumeroErreur
    End Select
End Function

Exemple de l'utilisation en tant que Procédure (Sub)

Et voici comment l'utiliser en pratique

La procédure qui suit vérifie si le classeur "C:\Test\MonClasseur.xlsx" est ouvert. Comme résultat, un message pop-up est affiché informant l'utilisateur si oui ou non le fichier est déjà ouvert.

Sub ExempleTestOuvertureClasseur()
'par: https://excel-malin.com
    Dim Verification As Boolean
    Dim MonClasseur As String
    
    MonClasseur = "C:\Test\MonClasseur.xlsx"
    
    'd'abord le test si le fichier existe
    If Len(Dir(MonClasseur)) = 0 Then 's'il n'existe pas, montrer un avertissement et quitter la macro
        MsgBox "ERREUR: Le Classeur: [" & MonClasseur & "] n'existe pas..."
        Exit Sub
    Else
    End If
    
    'si le Classeur existe, vérifier s'il est déjà ouvert
    Verification = EstClasseurOuvert(MonClasseur)

    If Verification = True Then
        MsgBox "Le Classeur: [" & MonClasseur & "] est déjà ouvert..."
    Else
        MsgBox "Le Classeur: [" & MonClasseur & "] n'est pas ouvert..."
    End If
End Sub

Attention: cette fonction ne fonctionne que pour les Classeurs Excel (.xls, .xlsx, .xlsm etc.). Elle ne fonctionnera pas pour d'autres types de fichiers (vidéos, fichiers texte,…).

Pour aller plus loin…

Voici d'autres articles qui ont pour sujet la gestion des classeurs en VBA et qui pourraient vous intéresser…

Vous pouvez également jeter un coup d’œil à la Liste complète des fonctions VBA et également au Référentiel VBA disponible en PDF…

47 0




Laissez un commentaire

Votre adresse de messagerie ne sera pas publiée.

11 commentaires sur “VBA: vérifier si un Classeur est ouvert

    • excel-malin.com Auteur de l’article

      Bonjour ABD,

      "EstClasseurOuvert" est une fonction. Vous y indiquez, via l'unique argument de cette fonction, le chemin complet vers le Classeur (Workbook) qui doit être vérifié, et la fonction renvoie comme résultat un boolean (Vrai/Faux). "Vrai" ("True") si le Classeur en question est ouvert et "Faux" ("False") si le Classeur est fermé.

      J'espère que cela répond à votre question. Bàv, Martin

  • Laurent

    Bonjour,

    Ce code est parfait si les fichiers sont ouverts en lecture/Ecriture.
    Si un fichier est ouvert en lecture seule, la fonction renvoie systématique "0" puisqu'elle arrive à l'ouvrir.

    J'ai une application que je laisse ouverte longtemps. Elle vient consulter (Sans avoir besoin de les modifier) des fichiers partager.
    D'où le fait que j'ouvre les fichiers en lecture seule.

    Mais j'aimerai faire le test d'ouverture pour ne pas à réouvrir les fichiers régulièrement.

    Comment faire s'il vous plait?

    • excel-malin.com Auteur de l’article

      Bonjour Laurent,
      d'après ce que je sais, et d'après les recherches que je viens de faire, il n'y a pas de moyen fiable de vérifier si un fichier en lecture seule est ouvert.
      Donc là, je ne vais malheureusement pas pouvoir vous aider.
      Cordialement, Martin

  • William

    Bonjour,
    J'aurai souhaité savoir pourquoi cette fonction est utile puisque, quand il est demandé l'ouverture d'un classeur et qu'il est ouvert, cela renvoi faux.donc ça passe et il ne l'ouvre pas (Logique de sauvegarde). s'il est fermé, il l'ouvre, s'il n'existe pas, no fount. Il suffit de mettre uniquement ouverture classeur qu'il existe ou pas, les réponses seront automatiquement apportées, d'une programmation de plusieurs lignes, une ligne suffit dans un module personnel d'ouverture classeur, enclenché par open workbook.

    Parfois c'est idiot mais la simplicité du pragmatisme résout beaucoup de problèmes dans les légions d'ingénieurs.

    • excel-malin.com Auteur de l’article

      Bonojour William,
      l'avantage de ce code est qu'il vous renseigne sur l'état du classeur en question SANS l'ouvrir. Donc si vous voulez uniquement savoir si le classeur est ouvert ou pas, vous utilisez mon code.
      Si le Classeur en question contient du code dans Workbook_Open, avec votre proposition il sera d'office exécuté. Mais ce n'est peut-être pas ce que l'utilisateur veut.

      Donc en gros, le code que je propose ici répond Vrai ou Faux à la question "Le classeur xxxxxx est-il ouvert?".
      Ni plus, ni moins. Pas de fichiers ouverts (ce n'est pas l'objet de la question), ni des erreurs qui traînent, ni un code exécuté involontairement…

      Vous savez, le nombre de lignes est rarement un signe de la qualité de code…
      De plus, utilisateur n'a qu'à prendre mon code et le copier & coller dans son projet tel quel. Ensuite, il appelle la fonction par une ligne. Donc quelle importance pour lui si le code a 5 ou 10 lignes tant qu'il effectue exactement ce qu'il faut en un minimum de temps?

      Je ne suis pas un ingénieur et je me considère moi-même comme pragmatique. Mais cela n'empêche pas de faire des choses précisément et consciencieusement…

      Et si vous tenez tant au nombre de lignes de code, voici mon code en une seule ligne:

      Function EstClasseurOuvert(MonClasseur As String): Dim NumeroFichier As Long, NumeroErreur As Long: On Error Resume Next: NumeroFichier = FreeFile(): Open MonClasseur For Input Lock Read As #NumeroFichier: Close NumeroFichier: NumeroErreur = Err: On Error GoTo 0: Select Case NumeroErreur: Case 0: EstClasseurOuvert = False:    Case 70:   EstClasseurOuvert = True:    Case Else: Error NumeroErreur:    End Select: End Function

      😉
      Cordialement, Martin