vérifier si un fichier est déja ouvert

darkspoilt

Expert
Bonjour,
Je voudrais savoir comment vérifier qu'un fichier est ouvert.
En effet, j'aimerais lancer une macro d'export vers un fichier précis(D:\toto.xls) mais si celui est déja ouvert ou utilisé ma macro d'export ne fonctionne pas et mon logiciel plante

Le bur de savoir si ce fichier est ouvert est de pouvoir le fermer l'application Excel qui lui correspond (car fichier masqué) si l'utilisateur ouvre un autre fichier excel bah il aura un fenpere vide.

Merci de votre aide
 

zeb

Modérateur
Utilise la fonction GetObject.
Ne t'ai-je pas déjà parlé de cette fonction ? ...... [:patch] ...... ;)
 

kiki29

Habitué
Bonsoir
[fixed]Function VerifOuvertureClasseur(Fichier As String) As Boolean
Dim n As Integer
On Error Resume Next
n = FreeFile()
Open Fichier For Input Lock Read As #n
Close n
If Err.Number = 0 Then VerifOuvertureClasseur = False
If Err.Number = 70 Then VerifOuvertureClasseur = True
On Error GoTo 0
End Function
[/fixed]
 

zeb

Modérateur
Mais quelle horreur !!!!!!!!!! Kiki, ton code fonctionne, et tu réponds exactement à la question de darksoilt. C'est ça le pire.

Mais bon sang, apprenez à coder proprement. Quand on ouvre une session, un fichier, on en garde un descripteur pour pouvoir le fermer proprement.

Pour vérifier si Excel tient un fichier, on parcourt toutes les sessions pour trouver laquelle.

En plus, GetObject() le fait pour nous.
 

zeb

Modérateur
:lol:

Me voilà catalogué 'gestapo du code' ? :(
kiki, un vrai mutawa aurait censuré ton code. :o
 

kiki29

Habitué
j'ai retrouvé l'origine de ce code, dans la FAQ de Developpez.com , donc va le leur dire, à mon avis ils ont un autre niveau que ce forum avec son mutawa ( police religieuse en Arabie Saoudite ).Tu peux me rayer des cadres, je quitte définitivement ce forum
 

zeb

Modérateur
Tant pis pour toi, tant pis pour nous.
Bye. Bye.

Je le répète, un mutawa aurait non seulement supprimé ton message mais en plus, il t'aurait banni. Il ne me semble pas que j'ai fait l'un ou l'autre.

___________________________


Taper au petit bonheur la chance en espérant provoquer une erreur ou pas est une façon de programmer particulièrement crade.

Par ailleurs, VB possède de grosses lacunes. De nombreux cas doivent donc être traités par des astuces plus ou moins sales. La FAQ de développez.com propose de telles astuces et il n'est pas malsain de s'en inspirer, ni même de les exploiter telle quelles.

En revanche, quand une solution propre et efficace existe, c'est elle qu'il faut implémenter.

Coder propre, c'est un ensemble de principes qui permettent d'obtenir des applications efficientes, facile à maintenir, facile à débugger. Les virus et autres malwares ne prolifèrent que parce que les programmes sont vite faits, mal faits, sans aucune précaution, ni réflexion. Au niveau d'une petite macro en VBA, cela peut sembler anodin, c'est un tel état d'esprit que je ne peux m'empêcher de le signaler.

Mais bon sang, apprenez à coder proprement
En m'insurgeant ainsi, je ne m'attaquais pas à Kiki en particulier, mais à la tendance générale. Si certains se sentent visés, qu'ils y réfléchissent plutôt que de fuir.
 

darkspoilt

Expert
Dommage que kiki le prenne comme ca

Sinon j'ai essayé son code cela fonctionne

[cpp] If ouvert Then
' Workbooks("C:\Temp\e_analyse_croisée.xls").Close SaveChanges:=False
Set utilise = GetObject("C:\Temp\e_analyse_croisée.xls") utilise.Close
End If[/cpp]

le probleme c'est que mon classeur se ferme et pas mon appli
comment mettre le getobcject en lien avec appli
appli est déclaré comme suivant
[cpp]dim appli as Excel.application[/cpp]
 

zeb

Modérateur
[fixed]Set utilise = GetObject("C:\Temp\e_analyse_croisée.xls" )[/fixed]
Comment as-tu déclaré ton objet utilise ?
[ ] Pas de déclaration, je n'utilise pas l'Option Explicit
[ ] Dim utilise As Variant
[ ] Dim utilise As Workbook

(Si jamais tu me coches la première case, je boycotte tes questions :fou: )

Dans les autre cas, voici un exercice :
Code:
Dim utilise As Variant
Stop
Set utilise = GetObject("C:\Temp\e_analyse_croisée.xls" )
Stop

Ouvre dans une autre session Excel le fichier e_analyse_croisée.
Puis exécuter ce petit code. Le debugger devrait s'arrêter sur la ligne 2.
Ajoute utilise aux espions. (Affichage > Fenêtre Espions)
Tu devrais voir une variable vide de type Variant.
Appuie sur F5, la ligne 3 s'exécute, puis le débugger s'arrête de nouveau, ligne 4. Observe ta variable utilise dans la fenêtre Espions. Elle est de type Workbook. On aurait donc pu commencer par là !! :)

Clique sur le + et parcours les propriétés de ton objet. Comme tout objet de type Workbook, utilise pointe vers l'instance d'Excel qui l'a chargé. Donc pour fermer :
Code:
Dim xl_a_fermer As Excel.application
Dim wk_a_fermer As Workbook
Dim wb As Workbook
Dim OnFerme As Boolean

On Error Resume Next
Set wk_a_fermer = GetObject("chemin/fichier.xls")
If IsEmpty(wk_a_fermer) Then MsgBox "Pas trouvé. Faut faire quelque chose là !"
On Error Goto 0

Set xl_a_fermer = wk_a_fermer.Application
wk_a_fermer.Close

' // A priori
OnFerme = True
' // Mais vérifier s'il ne reste pas un autre classeur ouvert dans cette instance d'Excel !!!!
For Each wb In xl_a_fermer.Workbooks
    Debug.Print wb.Name
    ' // Il reste des trucs ouverts !!!
    ' // Vérifier de quoi il s'agit (PERSO.XLS par exemple) et décider si on peut fermer ou pas
    OnFerme = False
Next
If OnFerme Then xl_a_fermer.Quit
 

darkspoilt

Expert
j'ai déclaré utilise comme suivant

[cpp]Dim utilise as Workbook[/cpp]

Je veux bien etre des fois crade mais il y a des limites

Sinon je ne sais pas pkoi mais il ne rentre pas ds ta boucle each

en tout cas c'était la ligne

[cpp] set appli = utilise.application[/cpp]

mais ta méthode each ne fonctionne pas ca ne veut pas rentrer ds la boucle j'essai de voir pkoi mais je ne voit pas
 

zeb

Modérateur
Code:
Dim utilise as Variant
Set utilise = GetObject("chemin/fichier.xls" )
Ce n'est pas forcément crade. Pour une fois.
Cela dépend du contexte.
Imagine que l'utilisateur choisisse un classeur nommé fichier.doc !
(Quel con cet utilisateur :pfff:)

Donc le fichier pourra être ouvert et on pourra ensuite vérifier qu'il s'agit bien d'un classeur Excel.

-----------------------

Une instance d'Excel peut contenir plusieurs classeurs.
S'il ne rentre pas dans la boucle, c'est que tout va bien, il n'y a avait que le classeur à fermer dans cette instance d'Excel.

En regardant mieux le code proposé, j'aperçois un ptit bug. Il faut sortir la ligne 19 de la boucle et la mettre avant la ligne 14. Ben, oui, sinon la variable n'est pas initialisée :/
(Quel con ce zeb :pfff:)
 

darkspoilt

Expert
oui et remplacer wk_a_fermer par xl_a_fermer
dans la boucle car si tu as testé ca plante!! lol (j'ai fais la modif avant de lancer le prog) j'esssai de comprendre ce que j'écris :)
 

darkspoilt

Expert
oui
et tu as oublier
[cpp]For Each wb In wk_a_fermer.Workbooks[/cpp]
de de le remplacer par
[cpp]For Each wb In xl_a_fermer.Workbooks[/cpp]
 

zeb

Modérateur
[:patch]

Au choix :

■ Je le fais exprès pour voir si tu suis :o

■ En fonction de l'heure à laquelle je réponds, je peux tester, sinon, je le fais de mémoire :(

J'édite...
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 098
Messages
6 717 103
Membres
1 586 287
Dernier membre
lucilleguffey
Partager cette page
Haut