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