Tester si un fichier texte est déjà ouvert

Bonjour,

Dans un Userform, j'ai un bouton pour créer un fichier texte avec les informations demandées

J'ai également un bouton pour afficher ce fichier texte

Le problème, c'est que si l'utilisateur relance le traitement alors que le fichier texte est déjà ouvert (affiché) un deuxième fichier est créé

Comment tester en VBA si le fichier texte est déjà ouvert ?

Merci d'avance

Bonjour Sauveur,

Peux-tu fournir un échantillon du userform?

Bonjour,

Sans te pose de question, tu peux le fermer d'office avec une gestion d'erreur au cas où il n'est pas ouvert.

eric

Bonjour à vous,

Au bouton OK, voici le traitement

Création du fichier (Si déjà existant, je contenu de celui qui est dans le dossier est remplacé Dossier = celui du classeur)

    Open wFicAdresse For Output As #1  
    wCejour = Now
    Print #1, "Liste des adresses mail " & wCejour
   Print #1, ""

J'écris les information

  wLigne = Left(wLigne, Len(wLigne) - 2)
  Print #1, wLigne
  Print #1, ""

Je ferme le fichier (Aucun message d'erreur, même si un est déjà ouvert)

Close #1

Au bouton VISUALISER

On Error GoTo ErrorOuvListe
    Shell ("C:\WINDOWS\system32\notepad.exe " & wFicAdresse)
    GoTo Fin
ErrorOuvListe:
    wOK = False
    MsgBox "Erreur à la visualisation de la liste des adresses " & vbCrLf & Err.Number & vbLf & Err.Description, vbInformation, "ERREUR"
    GoTo Fin
Fin:

Le problème :

L'utilisateur lance une création, et demande à visualiser le fichier Ce premier fichier ouvert mais réduit dans la barre des tâches

Il ne ferme pas ce premier fichier, et lance une deuxième création, et demande a le visualiser, idem que le premier

Quel que soit l'ordre dont on ferme ensuite ces fichiers, c'est toujours le dernier créé qui est dans le dossier

Donc, avant de lancer une création de fichier, j'aimerais pourvoir tester si un ficher de ce nom a déjà été ouvert

Bonjour,

Une solution pourrait-être de tester si la fenêtre du fichier concerné est ouverte.

Code ci-dessous à copier dans un module (Ne pas oublier les déclarations, constantes et fonctions API)

Exemple d'appel: If FenOuverte("Monfichier.txt") then

En espérant que cela puisse solutionner ton problème,

Cordialement,

Public Declare Function GetDesktopWindow Lib "user32" () As Long
Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Public Declare Function IsWindowVisible Lib "user32" (ByVal hwnd As Long) As Long

'***********************************
'* Constantes Gestion des fenêtres *
'***********************************
Public Const GW_CHILD = 5
Public Const GW_HWNDFIRST = 0
Public Const GW_HWNDLAST = 1
Public Const GW_HWNDNEXT = 2
Public Const GW_HWNDPREV = 3
Public Const GW_OWNER = 4

Function FenOuverte(NomFic As String) As Boolean
    Dim hwnd As Long
    Dim Titre_Fenetre As String
    Dim TitreFen As String
    Dim Ret As Long
    Dim i As Integer

    hwnd = GetDesktopWindow()
    hwnd = GetWindow(hwnd, GW_CHILD)

    FenOuverte = False
    Do While (Not IsNull(hwnd)) And (hwnd <> 0) 'Passe en revue chaque fenêtre
        Titre_Fenetre = String(255, 0)
        Ret = GetWindowText(hwnd, Titre_Fenetre, 255)
        If Titre_Fenetre <> String(255, 0) Then
            If IsWindowVisible(hwnd) = 1 Then
                TitreFen = Titre_Fenetre
                TitreFen = Left(TitreFen, Ret)
                If InStr(TitreFen, NomFic) > 0 Then
                    FenOuverte = True
                End If
            End If
        End If
        hwnd = GetWindow(hwnd, GW_HWNDNEXT)
    Loop
End Function

Bonjour,

le même style :

Sub Test()
    Dim i As Integer
    i = VerifClasseur("E:\Téléchargement Chrome\Classeur1.xlsx")
    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

Tu peux te contenter de tester i=0 pour dire qu'il est fermé.

eric

Bonjour,

Hélas, aucune de ces propositions réagissent sur le fichier texte !

Elles sont peut être utile dans le cas d'un classeur

J'ai bien peur de ne jamais trouver ...

Bonjour,

Voir fichier joint:

J'ai créé un fichier que j'ai nommé Compta.txt.

Dans la feuille1 du classeur, il y a un bouton de test.

En cliquant sur ce bouton, on obtient un message indiquant si le fichier est ouvert ou pas.

Tu peux essayer en ouvrant et en fermant successivement le fichier "Compta.txt" (ou autre).

If FenOuverte("Compta.txt") Then....

C'est une fonction système qui liste les fenêtres ouvertes (Excel ou autres).

Il y a peut-être dans ton cas un problème de casse concernant le paramètre passé à la fonction FenOuverte()

Le système fait une différence entre "Compta.txt" et "COMPTA.TXT" par exemple.

Dans ce cas, pour s'affranchir du problème de casse, il faut placer la directive suivante en entête de module:

Option Compare text

(je l'ai rajoutée dans le fichier joint)

En espérant que cela puisse régler ton problème,

Bon courage,

Bonjour,

Encore merci de tous ces efforts !

J'ai mit du temps, mais j'ai finit par réaliser qu'il ne fallait envoyer que le nom du fichier, et non le nom complet

Je vais pouvoir faire ce teste, et demander à l'utilisateur de fermer avant de lancer un autre traitement

Alors bien sure une autre demande ! Peut on le fermer par macro ?

Bien cordialement

Sauveur

Rechercher des sujets similaires à "tester fichier texte deja ouvert"