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 :

Tester si un classeur est ouvert. Si non, l'ouvrir.


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Assistan Process
    Inscrit en
    Octobre 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Assistan Process
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2013
    Messages : 26
    Points : 14
    Points
    14
    Par défaut Tester si un classeur est ouvert. Si non, l'ouvrir.
    Bonjour à tous,

    J'ai lu cette discussion et j'aimerai faire la même chose que LaMite.
    Après quelques recherches dans la FAQ sans résultats, je me suis tourné vers Google et j'ai trouvé ce code :

    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
    Sub Bouton_1()
     
     Dim Dossier As String, Fichier As String, Chemin As String
     Dossier = "Chemin du dossier"
     Fichier = "NomFichier.xlsx"
     Chemin = "Chemin du dossier + nom du fichier"
     
     Dim Presence As Boolean
      Presence = False
     
     For Each w In Workbooks
     
     If w.Name = Fichier Then Presence = True
     Next w
     
     If Presence = True Then
     Workbooks(Fichier).Activate
     Else
     Workbooks.Open Filename:=Chemin
     End If
     End Sub
    Bon, je n'ai jamais eu de cours en VBA, certains aspects sont compréhensible et d'autres non.
    Boolean, String ok, je vois le principe.
    le For each, le w et le W.Name etc... je vois pas trop :/

    Aussi, je comprends plus ou moins le fonctionnement du code.
    Et ce code fonctionne, mais une seule fois. Je m'explique :

    Quand j'appuye sur le bouton du fichier Excel source, il ouvre effectivement le fichier Excel cible. Quand j'appuye dessus une deuxième fois alors qu'il est déjà ouvert, il me l'affiche à nouveau.
    Mais si je le ferme (en sauvant ou non le fichier cible), et que je souhaite l'ouvrir peu après avec le bouton du fichier source, il me met une erreur :
    Erreur d'éxecution "1004". La méthode "Open" de l'objet "Workbooks" à échoué
    Quand j'ouvre le mode Débogage, VBA me surligne en jaune la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Workbooks.Open Filename:=Chemin
    Ce que je ne comprends pas, c'est pourquoi ça fonctionne plus après une première ouverture de ce fichier?
    Surtout que dans le code, on remet la valeur False à la valeur boléenne Présence?

    Aussi, une fois que je ferme le fichier source, et que je l'ouvre après, le bouton fonctionne à nouveau.

    Edit:
    En attendant une réponse, je me suis permis de continuer mon idée et donc créer plusieurs boutons avec chaque fois la même macro pour un fichier cible différent (Un bouton par fichier pour chaque fournisseur différent)

    Ca s'empire:
    Quand j'appuye sur le bouton 1, il ouvre le fichier 1. Je le ferme.
    J'appuye sur le bouton 2, il me met la même erreur cité plus haut (Erreur 1004)


    Mais! Quand j'appuie sur le bouton 1, il ouvre le fichier 1. Je ne le ferme pas.
    Et quand j'appuie sur le bouton 2 de suite, il ouvre le fichier 2.


    Mais ce n'est pas pratique, car dans une utilisation future, j'aimerais ne pas avoir tous les fichiers cible des boutons ouvert... j'en ai 17 au total


    Merci d'avance pour vos réponse.
    Désolé de m'introduire mais je pensais plus juste de venir ici que d'ouvrir un autre sujet.

    Je suis en Excel 2010...

    Phouky.

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    Ça arrive souvent que, lorsque tu fermes un fichier, tu ne puisse l'ouvrir avant quelques secondes, quelquefois 10-15 secondes.
    Il est "occupé" par le système.

    Tu peux faire le test manuellement.
    Ouvre un fichier dans l'explorateur, ferme-le et essaie de le rouvrir immédiatement.
    Message ?

    Si tu n'as pas à faire de modifications sur le fichier que tu ouvres, ajoute ReadOnly
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Workbooks.Open Filename:=Chemin, ReadOnly:=True
    MPi²

  3. #3
    Membre à l'essai
    Homme Profil pro
    Assistan Process
    Inscrit en
    Octobre 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Assistan Process
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2013
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Merci de ta réponse.


    Citation Envoyé par parmi Voir le message
    Ça arrive souvent que, lorsque tu fermes un fichier, tu ne puisse l'ouvrir avant quelques secondes, quelquefois 10-15 secondes.
    Il est "occupé" par le système.

    Tu peux faire le test manuellement.
    Ouvre un fichier dans l'explorateur, ferme-le et essaie de le rouvrir immédiatement.
    Message ?
    J'ai essayé et... à ma grande surprise je n'ai rien eu...
    Mais je vois ce que tu veux dire, j'ai déjà eu le cas avec d'autres fichiers mais ils étaient protégés par code et c'était un autre utilisateur qui voulait l'ouvrir peu après mois...

    Aussi, je me suis mal exprimé.
    Quand j'appuie sur le bouton 1, il ouvre le fichier 1 ensuite après modifications ou pas, je le ferme.
    J'appuie ensuite sur le bouton 2 (qui devrait ouvrir le fichier 2), et là, il me met la même erreur cité plus haut (Erreur 1004)

    Mais quand j'appuie sur le bouton 1, il ouvre le fichier 1 ensuite après modifications ou pas, je ne le ferme pas.
    J'appuie ensuite sur le bouton 2 et là, il m'ouvre le fichier 2. Et c'est là toute mon incompréhention :/

    Citation Envoyé par parmi Voir le message
    Si tu n'as pas à faire de modifications sur le fichier que tu ouvres, ajoute ReadOnly
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Workbooks.Open Filename:=Chemin, ReadOnly:=True
    Justement, je dois pouvoir le(s) modifier(s).

    Encore merci

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    Est-ce que tu peux mettre tout le code que tu utilises pour ouvrir tes fichiers (pas le traitement des fichiers) ?
    Dans le code que tu as trouvé plus haut, For each w in Workbooks signifie que la macro regarde chaque classeur ouvert pour voir s'il est déjà là. Si oui (presence) il l'affiche sinon il l'ouvre. Mais ça se termine là pour un seul fichier.

    C'est pourquoi il faudrait voir comment tu as géré l'ouverture de plusieurs fichiers.
    MPi²

  5. #5
    Membre à l'essai
    Homme Profil pro
    Assistan Process
    Inscrit en
    Octobre 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Assistan Process
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2013
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Merci, je comprends mieux le For each w in Workbooks !

    Pour le code, je suis désolé, je risque de te décevoir... Mais je t'ai déjà copié tout le code que j'ai trouvé ... :/

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    Crée un onglet "Fichiers" dans lequel tu inscris le nom des fichiers à traiter en colonne A de la ligne 1 à 17
    Ensuite tu boucles ces fichiers, les ouvres, les traites et les fermes.

    Un peu comme ceci

    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
    24
    25
    26
    27
    28
    Sub Traitement()
        Dim I As Long
        Dim Chemin As String, Fichier As String
     
        Chemin = "Le chemin du fichier"
        If Right(Chemin, 1) <> "\" Then Chemin = Chemin & "\"
     
        For I = 1 To 17
            Fichier = Sheets("Fichiers").Range("A" & I)
            If Not IsOpen(Fichier) Then
                Workbooks.Open Chemin & Fichier
            Else
                Windows(Fichier).Activate
            End If
     
            'Traitement du fichier
     
            'Fermeture du fichier
            Windows(Fichier).Close SaveChanges:=False  ' ou True si enregistrement
        Next
     
    End Sub
     
    Function IsOpen(Nom As String) As Boolean
        On Error Resume Next
        If IsObject(Workbooks(Nom)) Then IsOpen = IsObject(Workbooks(Nom))
        On Error GoTo 0
    End Function
    MPi²

  7. #7
    Membre à l'essai
    Homme Profil pro
    Assistan Process
    Inscrit en
    Octobre 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Assistan Process
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2013
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Merci Parmi,

    Mais je suis désolé, ton code fonctionne aussi qu'une seule fois, ensuite il y a une erreur...

    De mon côté, j'ai été lire quelques cours sur le net... Ca ne m'a pas beaucoup aidé...
    J'ai aussi essayé d'enregistrer une Macro avec la procédure à suivre pour ouvrir un des 17 fichiers... :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub Ouverture_B()
    '
    ' Ouverture Macro
    '
    ' Touche de raccourci du clavier: Ctrl+Shift+B
    '
        ChDir _
            "Chemin du dossier"
        Workbooks.Open Filename:= _
            "Chemin du fichier" _
            , UpdateLinks:=0
    End Sub
    Et là, idem, ça fonctionne qu'une seule fois, dès que je ferme et que je souhaite ouvrir le même par après, erreur.

    Le mode Débogagge de VBA me surligne le chemin d'accès du fichier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Workbooks.Open Filename:= _
             "Chemin du fichier" _
            , UpdateLinks:=0
    Alors, j'ai voulu essayer avec un fichier vierge.
    Miracle ça fonctionne... Je peux l'ouvrir et le fermer à l'infini avec le bouton avec le même code que j'ai trouvé sur le net que j'ai posté plus haut...

    Je pense que c'est la structure même des fichiers Excel qui pose problème :
    Ils sont tous liés à une seule et même base de donnée Access qui comporte 2 tables dédiés pour chaque fichier Excel (Donc au total 2*17 =34 tables).

    Ces mêmes fichiers excel comportent chacun 20 graphiques...

    Je pense que je vais laisser tomber ce système de bouton et me débrouiller autrement

    Merci encore pour ton aide Parmi !!

    Phouky

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    Sans voir ce que tu fais avec tes fichiers c'est difficile de t'aider plus loin...
    MPi²

  9. #9
    Membre à l'essai
    Homme Profil pro
    Assistan Process
    Inscrit en
    Octobre 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Assistan Process
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2013
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Effectivement, sans plus de précision de ma part vous n'allez pas savoir imager ce que je fais...

    En gros, nous avons mis en place un tableau de bord qui permet de côter certains de nos fournisseurs en fonctions d'indicateurs que nous relevons sur le terrain.
    Toutes ces données sont regroupés dans un fichier Access.
    Une fois que nous avons calculé tous les résultas, ils sont injectés dans différents fichiers Excel : 1 qui permet de calculer la côte global de chaque fournisseurs et les 17 autes, permettent de créer le bulletin de chaque fournisseur.

    Mais pour plus de facilité et éviter que les gens se balladent sur les serveurs à la recherche de ses 17 bulletins, j'aurais vouli créer un fichier Excel avec 17 boutons qui ouvre chacun de ses 17 fichiers Excel.

    Il est certain qu'après chaque ouverture, il y aie des modifications à faire, mais manuelles.
    J'ai cru comprendre à l'exécution de ton code, que celui-ci attendait des instructions à exécuter avant la fermeture... J'ai du mal m'exprimer jusqu'ici .

    J'ai demandé à un collègue qui a un peu touché à la programmation VBA. Il me dit que c'est p-e le Filename qui pose problème car, une fois que l'on ouvre le fichier une 2e fois, il n'a pas été mis à zéro... Et que donc, il comporte un chemin érroné (car le chemin s'ajoute au chemin déjà existant dans la variable Filename)... Est ce exacte? Si oui, comment remettre à zéro cette variable?

    Merci

  10. #10
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    Est-ce que tous les fichiers sont dans le même répertoire ?
    Sinon, il faudrait créer 2 colonnes dans l'onglet Fichiers et lire le chemin en plus du nom du fichier.
    Ou encore écrire le chemin complet avec le nom du fichier dans une seule colonne.

    Dans le cas du bout de code que j'ai mis, chemin est le nom du répertoire où se trouvent les fichiers
    MPi²

  11. #11
    Membre à l'essai
    Homme Profil pro
    Assistan Process
    Inscrit en
    Octobre 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Assistan Process
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2013
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Tous les fichiers se trouvent sur un serveur:
    Le ou les fichiers Access se trouvent dans : ...\SuiviFournisseur
    Idem pour le fichier Excel des résultats global: ...\Suivi Fournisseur
    Et enfin, les 17 fichiers des bulletins se trouvent dans ...\Suivi Fournisseur\Bulletins

    Et le fichier avec les boutons d'accès que j'aimerai créer se trouverai : ...\Suivi Fournisseur

    Donc, si je comprends bien ta dernière réponse, je devrai mettre le chemin complet dans le classeur Fichiers que si les différents fichiers Excel étaient dans différents dossiers. Ce n'est pas le cas, donc pas besoin de le faire...

    J'ai repris ton code et j'ai supprimé la partie qui permet de fermer et sauver automatiquement...
    J'ai aussi, pour le For donné à la variable I une destination de 1 à 1 car pour le test, je n'avais qu'un seul fichier à ouvrir : test.xlsx qui ne contient absolument rien.

    Là, ton code fonctionne à merveille, il ouvre le fichier et ce même après l'avoir fermer une première fois... etc.

    Une fois que je remplace test.xlsx par un vrai fichier Fournisseur1.xlsx qui lui contient, 2 sources Access et 20 graphiques. Le code ne fonctionne qu'une seule fois. Après la fermeture du fichier Fournisseur1.xlsx il ne l'ouvre plus et m'affiche l'erreur :

    Erreur d'éxecution "1004". La méthode "Open" de l'objet "Workbooks" à échoué
    Et VBA me surligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     If Not IsOpen(Fichier) Then
                Workbooks.Open Chemin & Fichier
    Je pense donc que ce sont mes fichiers qui est sont à l'origine de ce bug, et non les codes utilisés :/ !

    Encore merci Parmi

  12. #12
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 617
    Points : 5 912
    Points
    5 912
    Par défaut
    Si tu veux ouvrir un seul fichier sur demande, alors c'est différent.
    Oublie a boucle.

    Le chemin du programme est ThisWorkbook.Path
    Le chemin des 17 fichiers est ThisWorkbook.Path & "\Bulletins"

    Tu pourrais ajouter une listbox ou combobox qui afficherait les noms des fichiers à ouvrir.
    Sur Click, tu ouvres le fichier après validation avec IsOpen

    S'il ne peut s'ouvrir une 2e fois, c'est qu'il y a un problème avec les liaisons Access, je pense... (?)
    Mais pas certain de ça...
    MPi²

  13. #13
    Membre à l'essai
    Homme Profil pro
    Assistan Process
    Inscrit en
    Octobre 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Assistan Process
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2013
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Oui, un fichier à la fois... Encore une fois, j'ai oublier de le précisier ^_^' !

    Je risque d'avoir difficil de faire ce que tu me dis mais je vais essayer

    Mais oui, je pense effectivement que les liens entre Excel/Access doivent rester "en cache" et une fois que je veux ouvrir le fichier une 2e fois, les liens rentrent en conflit ou quoi... :/

    'Fin, pas de soucis, si je n'y arrive pas, je le ferai archaïquement, ouverture à partir de l'explorateur de fichiers ^^...
    C'était juste pour rendre tout ça "User friendly" !

  14. #14
    Membre à l'essai
    Homme Profil pro
    Assistan Process
    Inscrit en
    Octobre 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Assistan Process
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2013
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par parmi Voir le message
    Ça arrive souvent que, lorsque tu fermes un fichier, tu ne puisse l'ouvrir avant quelques secondes, quelquefois 10-15 secondes.
    Il est "occupé" par le système.

    Tu peux faire le test manuellement.
    Ouvre un fichier dans l'explorateur, ferme-le et essaie de le rouvrir immédiatement.
    Message ?

    Si tu n'as pas à faire de modifications sur le fichier que tu ouvres, ajoute ReadOnly
    Je reviens avec ce que tu as dis au tout début.
    A ce problème, je t'avais répondu que non, ça ne faisait pas se problème...

    Mais en faite, oui !

    Avant je fermais complètement Excel et le rallumait avec le même fichier et effectivement je n'avais pas le problème de fichier "occupé"...

    Ici, j'ai fait le test avec un classeur ouvert (mon fichier test comprenant les boutons) et un fichier cible:

    A la première ouverture, il s'ouvre, je ferme le classeur mais pas Excel. Je l'ouvre directement ensuite et là, erreur :
    Excel à rencontré un contenu illisible dans "Fichier cible". Voulez-vous récupérer le contenu de ce classeur? Si la source de ce classeur est fiable, cliquez sur oui.
    Et quand j'appuie sur Oui, il me supprime tous les graphiques...

    C'est bien un problème venant de mes fichiers... :'( !

    Tant pis ^-^

    Merci encore pour ton aide Parmi

Discussions similaires

  1. [XL-2003] tester si un classeur est ouvert
    Par anfernus dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 22/07/2010, 18h21
  2. tester si une JFrame est ouverte ou non?
    Par nadia22 dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 12/06/2009, 18h35
  3. Tester si Outlook 2003 est ouvert ou non
    Par Fredo67 dans le forum VBA Access
    Réponses: 1
    Dernier message: 05/12/2007, 21h17
  4. Tester si une page est ouverte
    Par Osmani dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 13/11/2005, 13h47
  5. Tester si une popup est ouverte si oui en ouvrir une autre
    Par Prue dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 17/08/2005, 09h32

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