Bonjour,
Je sais détecter si un fichier est déjà ouvert si c'est dans la même instance d'Excel, mais comment le faire si c'est dans une instance différente?
Merci
Bonjour,
Je sais détecter si un fichier est déjà ouvert si c'est dans la même instance d'Excel, mais comment le faire si c'est dans une instance différente?
Merci
Salut, voir http://excel.developpez.com/faq/?pag...ClasseurOuvert et adapter
Bonjour.
Tu as une réponse d'AlainTech ici.
Je peux te proposer aussi une fonction qui utilise la bibli Windows host script object modelLa fonction renvoie -1 si le fichier n'existe pas, 0 s'il n'est pas ouvert, 1 s'il est ouvert.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 Function fctIsOpen(ByVal sPath As String) As Integer Dim fso As IWshRuntimeLibrary.FileSystemObject Dim fle As IWshRuntimeLibrary.File Set fso = New IWshRuntimeLibrary.FileSystemObject On Error Resume Next Set fle = fso.GetFile(sPath) If Err.Number <> 0 Then fctIsOpen = -1 Exit Function Else fle.Move sPath fctIsOpen = IIf(Err.Number <> 0, 1, 0) End If On Error GoTo 0 Set fso = Nothing Set fle = Nothing End Function
Sinon on doit pouvoir faire avec une ou deux API.
Une fois que tu sais s'il est ouvert, si tu veux l'instancier, tu peux utiliser GetObject.
En espérant que cela t'aide,
PGZ
réessaie, lien corrigé
Bonjour,
ou tout simplement en utilisant la fonction FindWindow de la librairie User32 de l'Api de Windows.
Car, si l'on cherche un classeur, on en connait la classe et le nom...
Si le classeur est ouvert, la fonction retourne son hwnd. Dans le cas contraire, elle retourne un Null
EDIT :
Illustrons donc notre assertion par un exemple (où le classeur se nomme Class1.xls)
XLMAIN est la classe Excel
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Sub Form_Load() If FindWindow("XLMAIN", "Microsoft Excel - Class1.xls") > 0 Then MsgBox "classeur déjà ouvert" End Sub
Microsoft Excel - Class1.xls est le titre de la fenêtre à rechercher.
Et c'est tout.
Bonsoir
Il faut noter que si plusieurs fenêtres du classeur sont ouvertes, ou que l'on est en groupe de travail, ou que l'on est en lecture seule, le code de ucfoutu devra être adapté, car les noms des fenêtres sont modifiés dans ces cas de figure, et la recherche ne renverra pas le résultat souhaité
Bien vu, en effet...
Parade alors (pas d'adaptation mais stratégie différente) :
Utilisation des fonctions EnumWindows et GetWindowText de la librairie User32 de l'Api de Windows. Pour chaque élément : utilisation de la fonction Like de VBA pour comparer te résultat de GetWindowText avec le nom ou une partie du nom (celle restant fixe) du classeur recherché ...
ok merci
titre de la fenêtre? il peut y avoir des titres personnalisés suivant les postes
on ne peut pas avoir le nom du fichier tout simplement?
Je vois après coup que c'est écrit plus haut :
Comment écrire le code correspondant?Utilisation des fonctions EnumWindows et GetWindowText de la librairie User32 de l'Api de Windows. Pour chaque élément : utilisation de la fonction Like de VBA pour comparer te résultat de GetWindowText avec le nom ou une partie du nom (celle restant fixe) du classeur recherché
Merci
Bon...
Je suppose que tu veux dire "utiliser le chemin du fichier" ?
Bon...
Et pourquoi pas ? Exerçons nous avec un exemple succinct mais parlant :
J'espère que l'on va maintenant s'arrêter ici, hein ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 Private Declare Function lOpen Lib "kernel32" Alias "_lopen" (ByVal lpPathName As String, ByVal iReadWrite As Long) As Long Private Declare Function lClose Lib "kernel32" Alias "_lclose" (ByVal hFile As Long) As Long Private Function dejaouvert(FileName As String) As Boolean Dim lfic As Long, erreur As Long lfic = -1: erreur = 0 lfic = lOpen(FileName, &H10) If lfic = -1 Then erreur = Err.LastDllError Else lClose (lfic) End If dejaouvert = (lfic = -1) And (erreur = 32) End Function Private Sub Command1_Click() MsgBox dejaouvert("d:\ucfoutu\class1.xls") ' mets ici TON chemin End Sub
je veux dire que le titre de la fenêtre n'est pas forcément "Microsoft Excel - Class1.xls " mais peut aussi bien être "toto - Class1.xls " ou "tutu - Class1.xls " (et le classeur peut être masqué aussi).
EDIT :
1) ce code par API est la traduction "en direct" du lien donné dans la FAQ et utilisant la gestion d'erreur
2) on pourrait faire la même chose en tentant simplement de modifier l'attribut du fichier considéré....(et en le rétablissant si non ouvert)
Rome est unique mais les chemins qui y conduisent sont pléthoriques...
3)
OPn ne s'en préoccupe même plus, de ce titre ....!!!
Ok merci ca marche
même si je ne comprends pas la foonction, ce qui est dommage (enfin pour moi!)
ca marche aussi en ne mettant que le nom du fichier, sans le chemin, apparemment
NON ...
Mets le chemin complet. Celà tévitera des désagréments le jour où il s'agira d'un classeur ouvert dans un autre répertoire !
Tu peux toujours utiliser au besoin Application.Path (si même répertoire) pour ne pas avoir à écrire le chemin "en dur"....
bonjour
Oui la solution de Kiki fonctionne, et si tu avais testé par toi même tu n'aurais pas eu besoin de poser la question ...ok mais cela vérifie si plusieurs instances?Envoyé par kiki29
Salut, voir http://excel.developpez.com/faq/?pag...ClasseurOuvert et adapter
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 Sub Test() If VerifOuvertureClasseur("C:\Dossier\nom classeur.xls") Then MsgBox "Classeur déja ouvert." Else MsgBox "Classeur fermé." End If End Sub Function VerifOuvertureClasseur(Fichier As String) As Boolean Dim x As Integer On Error Resume Next x = FreeFile() Open Fichier For Input Lock Read As #x Close x If Err.Number = 0 Then VerifOuvertureClasseur = False If Err.Number = 70 Then VerifOuvertureClasseur = True On Error GoTo 0 End Function
bonne journée
michel
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager