Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Findwindow ou comment savoir si un fichier est ouvert

6 réponses
Avatar
berkowil
Bonjour Tous
ma question est a la fin de ce bout de code qui permet de savoir si une
application est ouverte peut servir a d'autres

******
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal
lpClassName As String, ByVal lpWindowName As String) As Long

Private Function FB_fichierDejaOuvert(ClassName As String, Titre As String)
As Boolean
Dim ProcessHandle As Long
Dim ProcessId As Long
Dim Appli As Long
Titre = "Microsoft Excel - " & Titre 'a enlever pour une autre appli
Appli = 0
Appli = FindWindow(ClassName, Titre)
GetWindowThreadProcessId Appli, ProcessId
If Appli > 0 Then
FB_fichierDejaOuvert = True
Else
FB_fichierDejaOuvert = False
End If
End Function

dans le code
If FB_fichierDejaOuvert(vbNullString, fichier) Then
avec fichier le titre exact de l'application : ex si le ficier toto.xls a
été ouvert alors fichier c'est: Microsoft Excel - toto.xls (le titre exact
de l'appli)
***************

Mon probleme est de rafraichier la liste des applications ouvertes car le
programme rafraichit cette liste 1 fois par minute

Merci

6 réponses

Avatar
MichDenis
Quel est l'objectif que tu poursuis ?
Si tu veux savoir si un fichier excel est déjà ouvert :

Dim Wk as Worksheet
On Error Resume next
Set Wk = Workbooks("NomDuFichierÀTester.xls")
if err.number <>0 then
err.clear
Msgbox "Fichier non ouvert"
else
Msgbox "Fichier ouvert
End if



"berkowil" a écrit dans le message de groupe de discussion :

Bonjour Tous
ma question est a la fin de ce bout de code qui permet de savoir si une
application est ouverte peut servir a d'autres

******
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal
lpClassName As String, ByVal lpWindowName As String) As Long

Private Function FB_fichierDejaOuvert(ClassName As String, Titre As String)
As Boolean
Dim ProcessHandle As Long
Dim ProcessId As Long
Dim Appli As Long
Titre = "Microsoft Excel - " & Titre 'a enlever pour une autre appli
Appli = 0
Appli = FindWindow(ClassName, Titre)
GetWindowThreadProcessId Appli, ProcessId
If Appli > 0 Then
FB_fichierDejaOuvert = True
Else
FB_fichierDejaOuvert = False
End If
End Function

dans le code
If FB_fichierDejaOuvert(vbNullString, fichier) Then
avec fichier le titre exact de l'application : ex si le ficier toto.xls a
été ouvert alors fichier c'est: Microsoft Excel - toto.xls (le titre exact
de l'appli)
***************

Mon probleme est de rafraichier la liste des applications ouvertes car le
programme rafraichit cette liste 1 fois par minute

Merci
Avatar
berkowil
J'ai ouvert 2 fois excel et l'un des fichiers doit etre envoyé par outlook
en fichier joint
Je dois donc m'assurer que ce fichier est bien fermé
Ce fichier contient des macros et je veux qu'il soit totalement independant
du mien qui contient aussi des macros, c'est pour cette raison que j'ouvre 2
fois excell


"MichDenis" a écrit dans le message de
news:
Quel est l'objectif que tu poursuis ?
Si tu veux savoir si un fichier excel est déjà ouvert :

Dim Wk as Worksheet
On Error Resume next
Set Wk = Workbooks("NomDuFichierÀTester.xls")
if err.number <>0 then
err.clear
Msgbox "Fichier non ouvert"
else
Msgbox "Fichier ouvert
End if



"berkowil" a écrit dans le message de groupe de
discussion :

Bonjour Tous
ma question est a la fin de ce bout de code qui permet de savoir si une
application est ouverte peut servir a d'autres

******
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA"
(ByVal
lpClassName As String, ByVal lpWindowName As String) As Long

Private Function FB_fichierDejaOuvert(ClassName As String, Titre As
String)
As Boolean
Dim ProcessHandle As Long
Dim ProcessId As Long
Dim Appli As Long
Titre = "Microsoft Excel - " & Titre 'a enlever pour une autre appli
Appli = 0
Appli = FindWindow(ClassName, Titre)
GetWindowThreadProcessId Appli, ProcessId
If Appli > 0 Then
FB_fichierDejaOuvert = True
Else
FB_fichierDejaOuvert = False
End If
End Function

dans le code
If FB_fichierDejaOuvert(vbNullString, fichier) Then
avec fichier le titre exact de l'application : ex si le ficier toto.xls a
été ouvert alors fichier c'est: Microsoft Excel - toto.xls (le titre exact
de l'appli)
***************

Mon probleme est de rafraichier la liste des applications ouvertes car le
programme rafraichit cette liste 1 fois par minute

Merci



Avatar
MichDenis
La question : Pourquoi 2 instances te sont-ils obligatoires ?
Qu'est-ce qui justifie que tu te compliques la vie ?

Si à partir d'une macro, tu veux ouvrir un fichier dans un
autre instance d'excel pour des raisons encore obscures ...

Dim Xl As New Excel.Application
Xl.Visible = True
Dim Wk As Workbook
Set Wk = Xl.Workbooks.Open("NomDuclasseur.xls")

L'avantage de cette façon de faire, et que tu peux contrôler
par les variables objets, l'instance d'excel que tu viens d'ouvrir
ainsi que le fichier ou les fichiers ouvert dans cette instance.

Et pour conserver la main mise sur cette instance et fichier, tu peux
déclarer comme Public tes variables dans un module standard...
et leur référence aux objets vont durer le temps que tu voudras !

Ce n'est pas suffisant ?



"berkowil" a écrit dans le message de groupe de discussion :

J'ai ouvert 2 fois excel et l'un des fichiers doit etre envoyé par outlook
en fichier joint
Je dois donc m'assurer que ce fichier est bien fermé
Ce fichier contient des macros et je veux qu'il soit totalement independant
du mien qui contient aussi des macros, c'est pour cette raison que j'ouvre 2
fois excell


"MichDenis" a écrit dans le message de
news:
Quel est l'objectif que tu poursuis ?
Si tu veux savoir si un fichier excel est déjà ouvert :

Dim Wk as Worksheet
On Error Resume next
Set Wk = Workbooks("NomDuFichierÀTester.xls")
if err.number <>0 then
err.clear
Msgbox "Fichier non ouvert"
else
Msgbox "Fichier ouvert
End if



"berkowil" a écrit dans le message de groupe de
discussion :

Bonjour Tous
ma question est a la fin de ce bout de code qui permet de savoir si une
application est ouverte peut servir a d'autres

******
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA"
(ByVal
lpClassName As String, ByVal lpWindowName As String) As Long

Private Function FB_fichierDejaOuvert(ClassName As String, Titre As
String)
As Boolean
Dim ProcessHandle As Long
Dim ProcessId As Long
Dim Appli As Long
Titre = "Microsoft Excel - " & Titre 'a enlever pour une autre appli
Appli = 0
Appli = FindWindow(ClassName, Titre)
GetWindowThreadProcessId Appli, ProcessId
If Appli > 0 Then
FB_fichierDejaOuvert = True
Else
FB_fichierDejaOuvert = False
End If
End Function

dans le code
If FB_fichierDejaOuvert(vbNullString, fichier) Then
avec fichier le titre exact de l'application : ex si le ficier toto.xls a
été ouvert alors fichier c'est: Microsoft Excel - toto.xls (le titre exact
de l'appli)
***************

Mon probleme est de rafraichier la liste des applications ouvertes car le
programme rafraichit cette liste 1 fois par minute

Merci



Avatar
berkowil
C'est vrai mais j'aurais besoin de la meme chose avec une apllication Word
qui sera envoyé sur outlook grace a une aplli excel
me manque simplement la fonction qui me permet de mettre a jour la liste des
appli ouvertes car celle ci se met a jour environ 1 fois par mn
peut etre via l'api kernell32 mais la cela devient tres egnimatique pour
moi


"MichDenis" a écrit dans le message de
news:
La question : Pourquoi 2 instances te sont-ils obligatoires ?
Qu'est-ce qui justifie que tu te compliques la vie ?

Si à partir d'une macro, tu veux ouvrir un fichier dans un
autre instance d'excel pour des raisons encore obscures ...

Dim Xl As New Excel.Application
Xl.Visible = True
Dim Wk As Workbook
Set Wk = Xl.Workbooks.Open("NomDuclasseur.xls")

L'avantage de cette façon de faire, et que tu peux contrôler
par les variables objets, l'instance d'excel que tu viens d'ouvrir
ainsi que le fichier ou les fichiers ouvert dans cette instance.

Et pour conserver la main mise sur cette instance et fichier, tu peux
déclarer comme Public tes variables dans un module standard...
et leur référence aux objets vont durer le temps que tu voudras !

Ce n'est pas suffisant ?



"berkowil" a écrit dans le message de groupe de
discussion :

J'ai ouvert 2 fois excel et l'un des fichiers doit etre envoyé par outlook
en fichier joint
Je dois donc m'assurer que ce fichier est bien fermé
Ce fichier contient des macros et je veux qu'il soit totalement
independant
du mien qui contient aussi des macros, c'est pour cette raison que j'ouvre
2
fois excell


"MichDenis" a écrit dans le message de
news:
Quel est l'objectif que tu poursuis ?
Si tu veux savoir si un fichier excel est déjà ouvert :

Dim Wk as Worksheet
On Error Resume next
Set Wk = Workbooks("NomDuFichierÀTester.xls")
if err.number <>0 then
err.clear
Msgbox "Fichier non ouvert"
else
Msgbox "Fichier ouvert
End if



"berkowil" a écrit dans le message de groupe de
discussion :

Bonjour Tous
ma question est a la fin de ce bout de code qui permet de savoir si une
application est ouverte peut servir a d'autres

******
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA"
(ByVal
lpClassName As String, ByVal lpWindowName As String) As Long

Private Function FB_fichierDejaOuvert(ClassName As String, Titre As
String)
As Boolean
Dim ProcessHandle As Long
Dim ProcessId As Long
Dim Appli As Long
Titre = "Microsoft Excel - " & Titre 'a enlever pour une autre
appli
Appli = 0
Appli = FindWindow(ClassName, Titre)
GetWindowThreadProcessId Appli, ProcessId
If Appli > 0 Then
FB_fichierDejaOuvert = True
Else
FB_fichierDejaOuvert = False
End If
End Function

dans le code
If FB_fichierDejaOuvert(vbNullString, fichier) Then
avec fichier le titre exact de l'application : ex si le ficier toto.xls a
été ouvert alors fichier c'est: Microsoft Excel - toto.xls (le titre
exact
de l'appli)
***************

Mon probleme est de rafraichier la liste des applications ouvertes car le
programme rafraichit cette liste 1 fois par minute

Merci






Avatar
MichDenis
La seule chose à laquelle je pense, c'est
l'utilisation de :

Application.OnTime Now + TimeValue("00:00:05"), "TaSub"

que tu peux faire tourner en boucle. Il soit y avoir un exemple
dans l'aide d'excel sur "OnTime"


"berkowil" a écrit dans le message de groupe de discussion :

C'est vrai mais j'aurais besoin de la meme chose avec une apllication Word
qui sera envoyé sur outlook grace a une aplli excel
me manque simplement la fonction qui me permet de mettre a jour la liste des
appli ouvertes car celle ci se met a jour environ 1 fois par mn
peut etre via l'api kernell32 mais la cela devient tres egnimatique pour
moi


"MichDenis" a écrit dans le message de
news:
La question : Pourquoi 2 instances te sont-ils obligatoires ?
Qu'est-ce qui justifie que tu te compliques la vie ?

Si à partir d'une macro, tu veux ouvrir un fichier dans un
autre instance d'excel pour des raisons encore obscures ...

Dim Xl As New Excel.Application
Xl.Visible = True
Dim Wk As Workbook
Set Wk = Xl.Workbooks.Open("NomDuclasseur.xls")

L'avantage de cette façon de faire, et que tu peux contrôler
par les variables objets, l'instance d'excel que tu viens d'ouvrir
ainsi que le fichier ou les fichiers ouvert dans cette instance.

Et pour conserver la main mise sur cette instance et fichier, tu peux
déclarer comme Public tes variables dans un module standard...
et leur référence aux objets vont durer le temps que tu voudras !

Ce n'est pas suffisant ?



"berkowil" a écrit dans le message de groupe de
discussion :

J'ai ouvert 2 fois excel et l'un des fichiers doit etre envoyé par outlook
en fichier joint
Je dois donc m'assurer que ce fichier est bien fermé
Ce fichier contient des macros et je veux qu'il soit totalement
independant
du mien qui contient aussi des macros, c'est pour cette raison que j'ouvre
2
fois excell


"MichDenis" a écrit dans le message de
news:
Quel est l'objectif que tu poursuis ?
Si tu veux savoir si un fichier excel est déjà ouvert :

Dim Wk as Worksheet
On Error Resume next
Set Wk = Workbooks("NomDuFichierÀTester.xls")
if err.number <>0 then
err.clear
Msgbox "Fichier non ouvert"
else
Msgbox "Fichier ouvert
End if



"berkowil" a écrit dans le message de groupe de
discussion :

Bonjour Tous
ma question est a la fin de ce bout de code qui permet de savoir si une
application est ouverte peut servir a d'autres

******
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA"
(ByVal
lpClassName As String, ByVal lpWindowName As String) As Long

Private Function FB_fichierDejaOuvert(ClassName As String, Titre As
String)
As Boolean
Dim ProcessHandle As Long
Dim ProcessId As Long
Dim Appli As Long
Titre = "Microsoft Excel - " & Titre 'a enlever pour une autre
appli
Appli = 0
Appli = FindWindow(ClassName, Titre)
GetWindowThreadProcessId Appli, ProcessId
If Appli > 0 Then
FB_fichierDejaOuvert = True
Else
FB_fichierDejaOuvert = False
End If
End Function

dans le code
If FB_fichierDejaOuvert(vbNullString, fichier) Then
avec fichier le titre exact de l'application : ex si le ficier toto.xls a
été ouvert alors fichier c'est: Microsoft Excel - toto.xls (le titre
exact
de l'appli)
***************

Mon probleme est de rafraichier la liste des applications ouvertes car le
programme rafraichit cette liste 1 fois par minute

Merci






Avatar
berkowil
Merci de ton aide !
berkowil