IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Liste des classeurs ouverts


Sujet :

Macros et VBA Excel

  1. #1
    Invité
    Invité(e)
    Par défaut Liste des classeurs ouverts
    Bonjour,

    j'aimerais vérifier (lors d'un lancement de macro) si un fichier Excel bien particulier est déjà ouvert ou non.
    NB:j'aimerais éviter d'utiliser les approches du type "on error resume next" en raisonnant avec l'apparition des éventuelles erreurs.

    le code ci dessous me semble correct, il ne plante pas mais quel que soit le nombre de classeurs ouvert il ne m'en détecte toujours qu'un... ma boucle for ne boucle donc pas... je ne vérifie que la condition sur le classeur actif et non sur l'ensemble des classeur pourtant 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
    Sub test()
    Dim fichier_excel As Workbook
    Dim fichier_ouvert As Boolean
     
    fichier_ouvert = False
    For Each fichier_excel In Workbooks
        If fichier_excel.Name = "moi" Then
            fichiers_excel = True
            Exit For
        End If
    Next fichier_excel
     
    If fichier_ouvert = True Then
        MsgBox "Le fichier est ouvert", vbOKOnly
    Else
        MsgBox "Le fichier n'est pas ouvert", vbOKOnly
    End If
     
    End Sub
    Est-ce que quelqu'un peut m'expliquer ce qui ne va pas?
    Merci!

  2. #2
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    As-tu essayé de mettre un espion sur fichier_excel.Name et d'exécuter au pas-à-pas pour être sur que le nom en VBA est bien identique (casse, extensions etc) au nom que tu indiques pour la recherche ?
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    un espion? en fait je ne sais pas vraiment ce que c'est...

    Par contre, j'ai bien essayé de faire fonctionner la chose en "pas à pas" pour vérifier le contenu/format de "fichier_excel.Name". Aussi, j'ai pu vérifié l'étape de contrôle (relatif au if) pour savoir si je rentrais dedans ou non...

    résultat:
    le "fichier_excel.Name" me renvoie bien le nom de mon fichier "actif" (en gros le nom du fichier à partir duquel je lance ma macro). Cette chaine de cararctère contient aussi l'extension ".xlsm" de ce même fichier actif (jusque là rien d'anormal donc... enfin je crois).
    le contrôle dans le if marche bien aussi (puisque vba saute le contenu du if)....

    Par la suite, je m'attendais à ce que le "next" renvoie au début de mon "for" pour vérifier la condition du if sur les autres classeur ouverts (chose qui n'arrive pas)... Et pourtant je sais bien que d'autres classeurs sont bel et bien ouverts (je les vois dans ma barre d'outils!).

  4. #4
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Points : 11 274
    Points
    11 274
    Par défaut
    Salut, peut-être via Code de macro pour vérifier si un fichier est déjà ouvert ou une version allégée dans la FAQ, à adapter à ton contexte.

  5. #5
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour
    La collection WorkBooks est celle des classeurs ouverts par l'instance excel en cours ****(+ voir mon EDIT). Elle ne contient pas les classeurs ouverts par d'autres instances
    La solution proposée par Microsoft sur le lien présenté kiki29, que je salue, est donc celle à mettre en oeuvre si tu veux vérifier que ce classeur est ou non ouvert, depuis l'instance en cours ou depuis une autre instance
    Le seul reproche que je fais à la méthode proposée est celui du choix fait de gérer à la hussarde (et un Goto) l'erreur provoquée par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Open filename For Input Lock Read As #filenum
    si le classeur est déjà ouvert.
    Je préfère généralement utiliser personnellement les fonctions de l'Api de Windows, qui permettent une interception et utilisation moins inélégantes de l'erreur.
    Voici comment je le fais (exemple) :
    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
    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 hF As Long, erreur As Long
        hF = lOpen(FileName, &H10)
        If hF = -1 Then
            erreur = Err.LastDllError
        Else
            lClose (hF)
        End If
        dejaouvert = (hF = -1) And (erreur = 32)
    End Function
     
    Private Sub CommandButton1_Click()
       MsgBox dejaouvert("d:\patatipatata.xlsm")
    End Sub
    EDIT **** :
    Attention par ailleurs au piège de l'utilisation de la propriété Name des objets de la collection WorkBooks. Un classeur de la collection peut très bien posséder le même nom que celui dont on veut savoir s'il a été ouvert, sans toutefois être celui-là (dossier autre).
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Personnellement je suis de ceux qui préconisent de ne pas utiliser le on error, pour la simple raison c'est qu'il faut savoir le gérer!

    Dans d'autres langues dans le Sql de procédure Stocké, il est incontournable pour évaluer des propositions!

    En .Net il peut êtres généré par programme dans de conditions normalement d'utilisation et pas pour informer d'un problème.

    Ce que je veux dire , c'est que le On Error est bien utile dans certains cas, voir parfois la seule solution.

    Et qu'il ne faut pas tomber dans l'excès inverse!

    Par exemple charger dans un collection plusieurs fois la même clé génère une erreur. L'interception de cette erreur permet d'identifier les doublons . Bien sur il y a. Le dictionnaire mais c'était juste à titre d'exemple.

    Moi dans les cas comme le tien je ne me prend pas la tête, le on error c'est son travail, car si ton fichier est ouvert dans une autre session d'Excel, à moins d'interroger le système via les Api, tu ne le trouve pas dans la collection WorkBooks.

    Certe le on error consomme des cycles machine mais beaucoup moins qu'un boucle d'évaluation!
    Dernière modification par Invité ; 02/09/2016 à 08h20.

  7. #7
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour durupt
    Je déplore simplement que MS ait "bâti" tous ses modules de code VB comme il l'a fait (si erreur présente, sortie au debug à moins d'un resume next à gérer). Alors que l'équipe de développement aurait pu laisser filer et permettre simplement une vérification d'existence d'erreur et laisser ainsi au développeur le choix de l'action la mieux adaptée. C'est dommage, c'est tout.

    EDIT : ils auraient pu au moins mettre cela (comportement A ou comportement B) en option de leurs applis VB5, VB6 et VBA.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bonjour unparia,
    Tu as raison (c'estun peut l'idée des exceptions.net), mais comme sur tous les forum et je suis le premier, on dénigre utilisation du On Error, c'était une forme de de réhabilitation!

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    grand merci à tous pour vos réponses!
    j'ai maintenant de quoi choisir l'approche la plus élégante/viable concernant mon pb.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Obtenir la liste des fenêtres ouvertes
    Par Cartouche dans le forum GTK+ avec C & C++
    Réponses: 12
    Dernier message: 29/12/2007, 19h16
  2. Liste des applications ouvertes ?
    Par budhax dans le forum Général Python
    Réponses: 1
    Dernier message: 27/07/2007, 03h11
  3. Réponses: 17
    Dernier message: 07/02/2007, 14h39
  4. liste des ports ouverts
    Par nutix2003 dans le forum Windows Serveur
    Réponses: 2
    Dernier message: 17/10/2006, 14h38
  5. Liste des fenêtres ouvertes de IE
    Par Trash dans le forum C++Builder
    Réponses: 4
    Dernier message: 09/11/2003, 16h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo