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 :

Accéder à un classeur caché [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juillet 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Juillet 2015
    Messages : 22
    Par défaut Accéder à un classeur caché
    Bonjour à tous,

    Je suis en train de créer une macro excel qui tourne un certain temps pendant qu'elle réalise de très nombreux calculs. Au lieu de laisser le classeur excel affiché pendant tout le temps de calcul, je cache l'application (Application.Visible = False), et affiche un UserForm.

    Cependant, je souhaiterais maintenant améliorer la macro et ne cacher QUE mon classeur lorsque j'exécute ma macro (Workbooks("Nom_du_classeur").Visible=False) de manière à ce que si l'utilisateur avait d'autres fichiers Excel ouverts, ils ne soient pas cachés eux aussi.

    Mon problème (qui apparait même lorsque je n'ai pas d'userform) est que lorsque je cache juste mon classeur (et non pas l'application entière) j'ai une erreur. Lorsque j'essaie de tester ou de rentrer une valeur dans une cellulle de ce fameux classeur caché, j'obtiens le message suivant: "La méthode Worksheets de l'objet global a échoué".

    La solution d'ajouter " Workbooks("Nom_du_classeur") " devant toutes mes lignes de code de lecture et d'écriture fonctionne à priori sur un exemple (en pièce jointe, on comprend aisément le problème en utilisant F8)... Mais ma macro entière faisant plus de 5000 lignes, j'ai très peu envie de modifier toutes les lignes une à une pour ajouter ce " Workbooks("Nom_du_classeur") ". Et étant plutôt novice sur VBA, je suis toujours motivé pour découvrir de nouvelles structures et méthodes.

    Savez-vous pourquoi j'obtiens cette erreur seulement lorsque je cache le classeur et non pas l'application? Y a-t-il un moyen de remédier à ce problème d'une autre façon que celle mentionnée? J'ai par exemple pensé à inclure une ligne au début du code pour définir une sorte de "Workbooks" par défaut pour m'éviter de devoir le mettre à chaque ligne :/

    Merci beaucoup pour votre aide.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Par défaut
    Savez-vous pourquoi j'obtiens cette erreur seulement lorsque je cache le classeur et non pas l'application?
    Bonjour,

    Le code suivant explique la raison de l'erreur mais ce n'est pas cela qui va solutionner votre problème de fond.
    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
    Dim i As Integer
     
    Sub test()
    Application.Visible = True
    Windows(1).Visible = True
    For i = 1 To 4
        Worksheets("Feuil1").Cells(i, 1).ClearContents
    Next i
    Dim S As Window
    Set S = Windows(1)
    Worksheets("Feuil1").Range("A1").Value = "Ok"
     
    Application.Visible = False
     
    Worksheets("Feuil1").Range("A2").Value = "Ok"
     
    Application.Visible = True
     
    Worksheets("Feuil1").Range("A3").Value = "Ok"
     
    Windows(1).Visible = False
     
    '///ajout/modif
    Windows(1).ActiveSheet.Range("A4").Value = "Ok avec Windows(1).Visible = False"
    MsgBox "La fenêtre va redevenir visible"
    Windows(1).Visible = True
    '///
    End Sub

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juillet 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Juillet 2015
    Messages : 22
    Par défaut
    Bonjour PMO2017,

    merci pour votre aide

    C'est vrai que cela ne solutionne pas le problème. Au final cela revient à utiliser la méthode que j'ai décrite dans mon premier message: ajouter "Workbooks("Nom_du_classeur")" mais en un peu plus simple

    Personne n'a la solution (à savoir comment accéder à un classeur caché sans devoir le nommer à chaque ligne de code) ?

    Merci d'avance.

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Personne n'a la solution (à savoir comment accéder à un classeur caché sans devoir le nommer à chaque ligne de code) ?
    Tu n'as pas le choix, il te faut "parenter" les "Range" ! Exécute les procédures. "Test1" et ensuite "Test2" et tu verras :
    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 Test1()
     
        Windows("Test_hidden.xlsm").Visible = False
     
        With Workbooks("Test_hidden.xlsm").Worksheets("Feuil1")
     
            .Range(.Cells(1, 1), .Cells(4, 1)).ClearContents
            .Range("A1").Value = "Ok"
     
            .Range("A2").Value = "Ok"
     
            .Range("A3").Value = "Ok"
     
            .Range("A4").Value = "Ok"
     
        End With
     
        Windows("Test_hidden.xlsm").Visible = True
     
    End Sub
    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 Test2()
     
        Windows("Test_hidden.xlsm").Visible = False
     
     
            Range(Cells(1, 1), Cells(4, 1)).ClearContents
            Range("A1").Value = "Ok"
     
            Range("A2").Value = "Ok"
     
            Range("A3").Value = "Ok"
     
            Range("A4").Value = "Ok"
     
     
        Windows("Test_hidden.xlsm").Visible = True
     
    End Sub
    L'instruction "With -End With" est là pour ça, pour ne pas avoir à réécrire la chaîne complète.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Quand un code n'est pas bien ficelé, je ne vois pas d'autre solution que de le reprendre,quite ligne par ligne!

    C'est la rançon de la gloire!

    Il faut apprendre à utiliser la programmation Object!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    set wb= Workbooks("Test_hidden.xlsm")
    Set wh=wb.Worksheets("Feuil1")
    With wh
    Maintenant c'est toi qui vois, comme l'a dit Theze , je ne suis pas sur que tu ais vraiment le choix, et ça proposition est certainement la moins coûteuse!

  6. #6
    Inactif  

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

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Citation Envoyé par petitchti Voir le message
    Personne n'a la solution (à savoir comment accéder à un classeur caché sans devoir le nommer à chaque ligne de code) ?

    Merci d'avance.
    Arrêter de prendre les utilisateurs pour des imbéciles patentés et ne rien cacher. Laisser l'utilisateur décider s'il veut cliquer sur la ligne en haut à droite pour que Windows s'en charge lui-même. Au besoin, on se contente d'avertir la victime qu'il peut continuer.

    Ou bien, tu exportes ton module en fichier texte. Ensuite tu l'ouvres dans Word et tu fais une opération de recherche et de remplacement. Ensuite tu réenregistres ton fichier au format texte et tu le réimportes dans ton projet.

  7. #7
    Membre averti
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juillet 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Juillet 2015
    Messages : 22
    Par défaut
    Merci à tous, vos réflexions me permettent d'avancer

    Oui je programme un peu, mais j'utilise pas vraiment la programmation objet. Mais je pense que je vais m'y mettre

    Bon en tout cas, je suis contraint à reprendre ligne par ligne mon programme. Il est préférable de le cacher car je crée un "logiciel" à base d'userform, et il est plus esthétique/convivial/user-friendly de cacher la fenêtre et de n'afficher que le userform

    J'avais pensé à la solution de tout basculer sur word pour faire un rechercher/remplacer. Je vais voir si je peux pas essayer de tourner le problème autrement, et si c'est pas possible, je ferai comme cela

    Et sinon, question bonus (pour contourner mon problème): Y a-t-il un moyen d'empêcher l'utilisateur d'ouvrir une fenêtre Excel qui est réduite (xlMinimized)? Je n'ai pas trouvé d'occurence sur google :/

    Merci encore à vous

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Par défaut
    Y a-t-il un moyen d'empêcher l'utilisateur d'ouvrir une fenêtre Excel qui est réduite (xlMinimized)?
    Bonjour,

    Peut être avec cette grosse bidouille

    1) Copiez le code suivant dans la fenêtre de code de ThisWorkbook du classeur qu'on veut garder minimisé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub Workbook_WindowActivate(ByVal Wn As Window)
    If GARDER_MINIMISE And Application.Workbooks.Count > 1 Then
      Application.ScreenUpdating = False
      ThisWorkbook.Windows(1).WindowState = xlMinimized
      ActiveWorkbook.Windows(1).WindowState = xlMaximized
      Application.ScreenUpdating = True
    End If
    End Sub
    2) Copiez le code suivant (à adapter selon votre traitement) dans un module Standard du classeur qu'on veut garder minimisé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Public GARDER_MINIMISE As Boolean
     
    Sub Debut()
    GARDER_MINIMISE = True
    ThisWorkbook.Windows(1).WindowState = xlMinimized
    ActiveWorkbook.Windows(1).WindowState = xlMaximized
    '... votre traitement
    End Sub
     
    Sub fin()
    '... Sub appelée à la fin de votre traitement
    GARDER_MINIMISE = False
    ThisWorkbook.Windows(1).WindowState = xlMaximized
    End Sub
    Chaque fois qu'un autre classeur est ouvert, le classeur (qu'on veut garder minimisé) se minimise et le reste tant que la procédure "Sub Debut" est en cours et qu'on n'a pas fait appel à la procédure "Sub fin".

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

Discussions similaires

  1. [XL-2003] DAO accéder à un classeur fermé crypté
    Par Daniel.C dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 02/02/2012, 12h38
  2. Réponses: 2
    Dernier message: 26/03/2009, 10h21
  3. Comment accéder à une partition cachée
    Par sterus dans le forum Applications et environnements graphiques
    Réponses: 10
    Dernier message: 18/12/2007, 21h52
  4. Comment accéder à un classeur Excel
    Par nicolas2603 dans le forum VB.NET
    Réponses: 5
    Dernier message: 21/09/2007, 23h33
  5. [VBA-E ] pb de classeur caché
    Par radi3 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 23/12/2006, 16h49

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