VBA verifier si fichier ouvert

P

Phaumesser

Guest
Bonjour,

j'ai fait un code dans lequel il doit ouvrir une feuille excel existante.
Je souhaiterais qu'il verifie avant de l'ouvrir si elle n'est pas déja ouverte.

Merci
 
M

michel_M

Guest
Bonjour,

Si le classeur est déjà ouvert, lorsque tu demanderas l'ouverture, La macro se plante. C'est bien çà?

Si oui, il faut faire précéder la ligne "workbooks open etc."

de: On error resume next

et faire suivre cette ligne "workbooks open etc."
de: on error goto0

Si le classeur est ouvert VBA te le signale par le message classique mais ne plante pas ta macro

voilà, voilà

à +

Michel.béziers
 
S

stef

Guest
bonjour,

avec ca ca doit aider

Dim Class As Workbook
Dim cstNomClasseur As String
Dim ReponseFichier
Dim FullChemin As String

'------------Trouve si un NomFichier.xls est ouvert-----------
cstNomClasseur = "nomfichier.xls" ' en minuscule
For Each Class In Workbooks
If LCase(Class.Name) = cstNomClasseur Then
Workbooks(Class.Name).Activate
FullChemin = ActiveWorkbook.FullName
ReponseFichier = MsgBox("Le fichier 'NomFichier.xls' suivant est ouvert, souhaitez vous l'utiliser ?" _
& Chr(13) & Chr(13) & FullChemin, vbYesNo, "Confirmation")
'traiter eventuellement la reponse....
Else
Workbook.Open cstNomClasseur
End If
Next

'-----------------------------------------------------------------------


pour les message d'erreur il y a bien le :

Application.DisplayAlerts = false 'pour desactiver
Application.DisplayAlerts = True 'pour réactiver IMPERATIF !!! car danger !!!

@+
stef
 

needz

XLDnaute Nouveau
Re : VBA verifier si fichier ouvert

Bonjour,

Le code de Stef m'interesse aussi pour le developpement d'un programme.
Par contre il ne marche pas pour moi. L'explication provient peut-être du fait que dans mon cas il s'agit d'un fichier en lecture seule, et en plus en réseau.

Quelqu'un peut m'aider ? Je n'arrive pas à l'adapter en tenant compte de ces facteurs.

Merci d'avance.
Cordialement.

Guillaume

Code:
Sub Finalextractpluserreur()
Dim Class As Workbook
Dim cstNomClasseur As String
Dim ReponseFichier
Dim FullChemin As String

'------------Trouve si un NomFichier.xls est ouvert-----------
cstNomClasseur = "MonFichier.xls" ' en minuscule
For Each Class In Workbooks
If LCase(Class.Name) = cstNomClasseur Then
Workbooks(Class.Name).Activate
FullChemin = ActiveWorkbook.FullName
ReponseFichier = MsgBox("Le fichier MonFichier.xls est ouvert, souhaitez vous l'utiliser ?" _
& Chr(13) & Chr(13) & FullChemin, vbYesNo, "Confirmation")
'traiter eventuellement la reponse....
Else
Application.Workbooks.Open "R:\dossier1\dossier2\MonFichier"
End If
Next
End Sub
 

needz

XLDnaute Nouveau
Re : VBA verifier si fichier ouvert

Merci pour ta réponse mais ça ne me convient pas :D Le fait que le fichier soit en lecture seule ou pas m'importe peu vu que je recupere j'en extrais juste des informations. Ce qui m'embêtait c'était que la macro n'arrivait pas à "lire" le nom du fichier excel, mon hypothèse de novice étant que le fait qu'un [Lecture Seule] à la fin du nom de classeur soit fautif.

Au final un autre code a répondu à mes attentes :
Code:
Sub test()
On Error Resume Next
Workbooks("Mon CLasseur.xls").Activate
If Err <> 0 Then
MsgBox "Le classeur Mon Classeur.xls n'est pas ouvert"
Else: MsgBox "Le classeur Mon CLasseur.xls est ouvert"
End If
End Sub

Le plus dur dans Excel c'est de penser logiquement. xD
 

Trounk

XLDnaute Nouveau
Re : VBA verifier si fichier ouvert

Salut,

En fait le bout de code ci-dessus ne permet pas de savoir si le fichier est ouvert ou non, il permet juste de savoir si tu arrives à l'ouvrir ou non.

En faisant quelques tests, j'ai identifier deux cas où le code "Err" est différent de zéro : il vaut 1004 si le fichier est déjà ouvert, mais aussi si le fichier est inaccessible (cas d'un fichier situé sur le réseau auquel tu n'as pas les droits d'accès).

En fait lorsque j'avais le besoin consistant à exploiter les données dans divers fichiers situés sur un réseau ET sans planter lamentablement si l'utilisateur n'a pas certains droits, j'ai combiné les deux techniques décrites dans les messages ici présents :
1) un open dans une fonction avec "On Error Resume Next" et je teste s'il vaut 0, 1004 ou autre chose
2) dans le cas où j'ai 1004, je balaye les fichiers ouverts avec un "For Each wkb In Workbooks" et je teste les noms

:)

En espérant ce message utile et si qqun à besoin du code je pourrai le retrouver...
 

Barnes

XLDnaute Nouveau
Bonjour,

j'ai fait un code dans lequel il doit ouvrir une feuille excel existante.
Je souhaiterais qu'il verifie avant de l'ouvrir si elle n'est pas déja ouverte.

Merci
Re : VBA verifier si fichier ouvert

Salut,

En fait le bout de code ci-dessus ne permet pas de savoir si le fichier est ouvert ou non, il permet juste de savoir si tu arrives à l'ouvrir ou non.

En faisant quelques tests, j'ai identifier deux cas où le code "Err" est différent de zéro : il vaut 1004 si le fichier est déjà ouvert, mais aussi si le fichier est inaccessible (cas d'un fichier situé sur le réseau auquel tu n'as pas les droits d'accès).

En fait lorsque j'avais le besoin consistant à exploiter les données dans divers fichiers situés sur un réseau ET sans planter lamentablement si l'utilisateur n'a pas certains droits, j'ai combiné les deux techniques décrites dans les messages ici présents :
1) un open dans une fonction avec "On Error Resume Next" et je teste s'il vaut 0, 1004 ou autre chose
2) dans le cas où j'ai 1004, je balaye les fichiers ouverts avec un "For Each wkb In Workbooks" et je teste les noms

:)

En espérant ce message utile et si qqun à besoin du code je pourrai le retrouver...

Bonjour,

j'ai fait un code dans lequel il doit ouvrir une feuille excel existante.
Je souhaiterais qu'il verifie avant de l'ouvrir si elle n'est pas déja ouverte.

Merci
En retard mais qui sait, des retardataires peuvent découvrir une autre vision de la programmation en VBA tout du moins l'un des pragmatismes conceptuels

Sub Activer_Classeur() ' Activer _classeur c'est une Macro permanente et non en Fonction : 10 lignes de code composées de quelques mots
'Et l'ouvrir s'il n'est pas existant quel que soit le Classeur, avant que la macro se termine (A placer avec un Call dans la Macro)
'Maquette VBA Avant compilation VB :
'Une méthode logique comme d'autres, pour ouvrir un classeur s'il est absent dans tous ceux pouvant être ouverts ou ouverts et Cachés quelque soit le classeur sous réserve qu'il soit référencé sur des variables perpétuellement en changement dès qu'une action est demandée
'Exemple : Sauter d'un classeur à un autre, ou d'une feuille classeur à une autre feuille classeur ou encore de n'importe qu'elle feuille à n'importe qu'elle feuille... Appelé ou non d'une macro. Les variables sont automatiquement sur un log spécifique. Généralement dans les Paramètres fondamentaux du Programme (La plate forme d'échanges entre tout classeur, dossier, feuilles, cellules au besoin... aux fins d'y retrouver ses petits)
'CECI reste une information pouvant répondre à quelques interrogations pour trouver ce qui cloche dans les articulaires d'Excel... Pourtant tout est bien programmé et cherchons qu'est-ce qui nous énerve ...
'
'Un avis avec Huit variables pour tout un programme,
'Tous les répertoires : Tous les classeurs : Toutes les feuilles : Toutes les infos parents : Toutes les infos Enfants
'Distinction des écritures : Sur feuille [A1].Select aucun Range en cellule unique voir, en sélection et leurs noms [Toto].
' Reconnaissance dans le Classement des noms Préfixe : Cal = Calculer Eff = Effacement, Col = Collection, la collection interprète quoi ? nous sommes en accord.
' Les mouvements curseur, qu'avec offset et utilisation de Cells, les boucles maximum 5 variables ET Vider les variables après chaque boucle
'si possible définir une boucle avec une variables toujours à la même place ou ailleurs si traitement particulier
'Coordination des toutes les boucles ET POUR VOUS, rien à chercher tout est TOUJOURS au même endroit ...
'Par effet toute donnée peuvent être de 1 à x, la variable changera automatiquement la boucle selon le For, le For Each ou diverses
'Aucun Select pour les feuilles ou les classeurs : Activate seulement et si possible que le N° de sheets() pas de nom de feuille pourquoi ?
'Quand la réponse attendue doit être VRAI ou FAUX ou OUI ou NON ou REFUS ou ACCEPTER ... la distinction d'un mot dans un code c'est "OUI" si vous couplez Le Nom d'une Feuille, selon le nombre de MOTS, cela peut prêter à confusion. Si nom de Feuille Faites : Toto_mâlin ou lieu de toto mâlin. La distinction est très avantageuse
'Dans une Recherche ou modifications et ne pas perdre de temps à savoir si le mot doit être écrit comme cela ou cela ...
'La Première feuille d'un classeur sans vous souciez de quoi que ce soit : "Nom = Base (PAS BD ! Vous attribué une référence implicite de colonne [BD] soit sheets(1) lors de la rédaction sur plusieurs classeurs à la fois, Votre mémoire redondante vous fera gagner un temps précieux dans la rédaction mais surtout dans la recherche Vous comprendrez quand des centaines de codes seront à réviser lors d'un changement. Toute référence à une macro même dans le même module : Call
'Aucun calcul "Automatic" etc, etc .. Tri et duplicate en 4 mots. Le Zéro ou le " " aucun des 2 ne troublent les actions ou résultats pour toutes autres actions avant pendant ou après exécution d'une macro et d'un comparer, SURTOUT pas de Tableaux dynamiques préformatés (Construisez-vous même ces tableaux)....
'Pour universaliser les objets fondamentaux servant aux macros du programme :
'Disque : Programme : Répertoire : Classeur : Extension : Nom_Feuille : Type_Info_parents : Type_Traitement_Info_enfants ... Et plus si cela est nécessaire
'Ceci permet des interactions croisées entre données sans utiliser de mémoires d'échanges. Un temps d'éxécution précieux de gagner ...
On Error Resume Next 'Tout peut se greffer ou se modifier, la réflexion doit être comme la construction, Théorie des Dominos ou, Se servir intrinsèquement des méthodes utilisant très peu d'échanges de mémoire vive
Classeur = Workbooks("Toto.xlsm").Sheets(1).[Classeur].Value
Extension = Workbooks("Toto.xlsm").Sheets(1).[Extension].Value
Workbooks(Classeur & Extension).Activate
If Err <> 0 Then
'Un macro ouvrant les classeurs non présents selon l'architecture des codes du Programme
Call Ouvrir_Classeur 'La Macro qui ouvrira le classeur ou activera la feuille désirée (2 lignes) : Soit créer une cascade (Auto-assemblage) de l'User jusqu'à la cellule à Traiter si besoin et assembler son code, par exemple : workbooks.open:=(dudule & toto & tata & tete & riri ...) etc, etc et la mocro s'exécute immédiatement (Si un peu compliqué, pas s'affoler le DOEvent d'échange gère tout seul le problème pas de code à ajouter. Réinitialiser l'objet Err à défaut, plus rien ne fonctionne correctement dans votre programme : Attention
'S'il est désiré une fonction, cela n'est pas obligatoirement stable avec celle-ci et tout est relatif à l'architecture du Programme
' Pas d'importance : 1 répertoire, 1 dossier, une dizaine de classeurs et une centaine de feuilles ...
' Compliqué à faire fonctionner dynamiquement : 1 répertoire, 100 dossiers, 1500 classeurs et quelques 5000 feuilles vous allez mieux comprendre comment une fonction créée peut poser question : Opter pour une macro des quelques lignes n'est pas si imbécile : Temps de réponse : immédiat quand c'est parfaitement construit
'Pas de fioriture de tabulation lors des constructions de codes (Tout à gauche pas de vide entre ligne ou '), le temps est gaspillé en lecture. Calcul manuel tout le temps et activation du calcul à la précision de l'horloger
'et de surcroît, des erreurs sont possibles lors des calculs en premier lancement. Tout est relatif : une opération codée se calcule toute seule automatiquement, une opération posée par avance doit se recalculer : Faire le pour ou le contre
'selon la grandeur des calculs néanmoins, la redondance s'est réduire plus du double la vitesse d'exécution, et laisser les échanges gérer par windows peuvent allègrement planter : Échanges par gestion windows, à décocher (C'est un Avis, selon votre matériel : ne pas comprendre ce principe laissez windows gérer les échanges)
'C'est pourquoi, avant de faire le plus petit programme écrivez comment vous souhaitez que cela se déroule (1 heure de réflexion et de recherches d'informations = 10 minutes de codage)
On Error GoTo 0
End If
'Dernier avis avec les listView : Éviter de mettre les Headers (Colonne) dans l'activation de votre formulaire, ni les items, les transformer le tout en Macros distinctes
'La facilité vous allez comprendre quand vous devrez tenir compte de certains paramètres dans une listView
'aucune perte de temps, c'est identique et de plus, bien architecturé, de la 2ème à la 1048576 lignes avec les boucles ordonnancées, c'est instantané. Vous pouvez régler exactement ce que vous désirez ... CECI n'est pas obligatoirement adaptable à tout le monde mais dans ces constructions les soucis sont rares
'pour construire une maquette de programme en VBA, ce n'est pas obligatoirement simple MAIS PRAGMATIQUE c'est certain... Une fois assimilé.
'Les causes d'une incompréhension est la lecture d'un didacticiel et le professorat souvent en marge des réalités des utilisations professionnelles.
'Des bons conseils sont donnés mais loin d'être réellement pragmatique en application professionnelle alors qu'excel est capable de sortir des programmes très complexes à la rapidite d'une construction en VB compilée
'Tous ne courent pas le 100 mètres à la même vitesse
'C'est pourquoi, il ne suffit pas de dire je suis novice, même le grand expert ou l'expert de l'expert, l'est aussi dans ce domaine
'Quand nous sommes novices il faut commencer par exécuter la simplicité et non d'essayer d'écrire une complexité qui nous échappe. A défaut, c'est du temps de perdu pour ceux essayant de résoudre une problmatique que le novice ne comprend pas, de toute façon, même résolue, il ne comprendra toujours pas
'Rien n'est péjoratif dans ce qui est exprimé mais soyons réalistes, si un minimum intellectuel n'est pas entrepris sur chaque problématique, de singer ne fera pas progresser le schmilblick mais plutôt l'inverse et nous aurons plus de novices à s'identifier experts demain ....
'J'ai lu un Banzaï de Jurançon, dommage, on ne le lit plus ....
End Sub

Cordialement ... Un amateur singeant les professionnels, cherchant désespérément un professionnel dans sa période de maitrise du langage et de l'environnement informatique, internet et traitement des informations ...
 

Discussions similaires

Réponses
1
Affichages
165
Réponses
8
Affichages
381
Réponses
3
Affichages
277

Statistiques des forums

Discussions
312 100
Messages
2 085 294
Membres
102 854
dernier inscrit
ADRIENVR