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 :

Sheet.Visible qui ne fonctionne pas depuis UserForm.


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Homme Profil pro
    Ingénieur Industrialisation
    Inscrit en
    Mai 2015
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Industrialisation
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2015
    Messages : 222
    Par défaut Sheet.Visible qui ne fonctionne pas depuis UserForm.
    Bonsoir à tous,

    J'ai un problème qui me turlupine, je ne vois vraiment pas d'où ça pourrait venir :

    J'ai un classeur qui nécessite impérativement que les macros soient activées pour fonctionner, et une fois que c'est le cas, Application.Visible = False et on fait tout en UserForms...
    Dans les événements Workbook_BeforeSave et WorkBook_AfterSave, j'ai respectivement :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Dim ShActive As Worksheet
    Dim sheet As Worksheet
     
    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Set ShActive = ThisWorkbook.ActiveSheet
    Call PageAccueil(True)
    End Sub
     
    Private Sub Workbook_AfterSave(ByVal Success As Boolean)
    Call PageAccueil(False)
    ShActive.Activate
    End Sub
    Et la macro PageAccueil cache toutes les pages sauf l'accueil (page comprenant uniquement "activez les macros sinon ça marche pas"... en gros) ou les affiche toutes sauf l'accueil suivant la valeur de "Afficher".

    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 PageAccueil(Afficher As Boolean)
     
    Select Case Afficher
        Case True
            Sheets("Accueil").Visible = xlSheetVisible
            Sheets("Accueil").Activate
            For Each sheet In ThisWorkbook.Sheets
                If sheet.Name <> "Accueil" Then sheet.Visible = xlSheetVeryHidden
            Next sheet
     
        Case False
            For Each sheet In ThisWorkbook.Sheets
                sheet.Visible = xlSheetVisible
            Next sheet
            Sheets("Accueil").Visible = xlSheetVeryHidden
     
    End Select
     
    End Sub
    Mon étonnement provient du fait que la macro fonctionne parfaitement si je fais Ctrl+S, mais quand je ferme mon userform principal qui contient un Workbook.Save, alors cela ne fonctionne pas... plus curieux encore, le code est lu comme il faut (pas à pas, voire si je remplace les sheet.visible par un msgbox, ça marche !)!
    J'ai essayé de déplacer le code dans un module, de glisser des doevents, sleep, wait, Application.EnableEvents = True... Rien n'y fait.

    Je rappelle juste que le code est bien lu mais les sheets ne se masquent (ni apparait, pour la cas de la sheet("Accueil") absolument pas, pas d'erreur, rien.
    Du coup, si j'ouvre le fichier sur un autre PC ou si les macros ne sont pas activées par défaut, alors au lieu de tomber sur la page d'accueil, on tombe sur la dernière page active ce qui est critique pour moi car les sheets sont uniquement des bases de données...

    Si vous avez une idée ou une solution, je suis très preneur !!

    Merci d'avance.

    Quentin

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    les feuilles ne seront jamais consultées par les utilisateurs ?

    peut-on voir le contenu de ton userform via lequel tu tente de réaliser l'action ?

  3. #3
    Membre chevronné
    Homme Profil pro
    Ingénieur Industrialisation
    Inscrit en
    Mai 2015
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Industrialisation
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2015
    Messages : 222
    Par défaut
    Salut Joe,

    Le UserForm qui est supposé enclencher l'action de sauvegarde (et donc de cacher/afficher les pages) se ferme ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    Application.EnableEvents = True
    If CloseMode <> 0 Then Exit Sub 'ceci évite de poser la question si je ne le ferme pas par la croix (quand je le masque pour passer sur un autre formulaire, par ex)
     
    If MsgBox("Êtes-vous sûr de vouloir quitter ?", vbYesNoCancel + vbQuestion, "Confirmation") = vbYes Then
        Me.Hide
        ThisWorkbook.Save 'Envoie bien dans le Workbook_BeforeSave et AfterSave qui lancent bien ma macro cachant/affichant les pages... sans le faire.
        If Workbooks.Count = 1 Then Application.Quit Else Application.Visible = True
        ThisWorkbook.Close False
        Unload Me
    Else
        Cancel = 1
    End If
    End Sub
    Mes pages ne sont pas visibles normalement par l'utilisateur, mais j'aimerais que si, si l'utilisateur a un mdp administrateur (pas encore mis en place).

    Pour l'instant, mon formulaire gère les ranges de la feuille active, je vais optimiser et faire que toutes les ranges soient rattachées à une variable worksheet.

    Ce n'est pas vraiment une alternative que je cherche mais plutôt à comprendre pourquoi les feuilles ne se masquent/s'affichent pas alors que le code semble bien les lire.

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur Industrialisation
    Inscrit en
    Mai 2015
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Industrialisation
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2015
    Messages : 222
    Par défaut
    Resalut,

    J'ai réessayé avec un formulaire tout neuf et tout vide ainsi qu'un fichier tout beau tout neuf. Constat : le même.
    Le Workbook.Save déclenche les événements before et aftersave mais la feuille ne se cache pas (j'ai essayé sur plusieurs PC).

    Par contre, avant de faire workbook.Save, j'appelle ma procédure pour masquer puis ensuite j'appelle celle pour afficher de nouveau et là ça marche.

    En gros :

    Dans le ThisWorkbook :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub Workbook_AfterSave(ByVal Success As Boolean)
    Call Test(True)
    End Sub
     
    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Call Test(False)
    End Sub
     
    Sub Test(variable As Boolean)
    Sheets(3).Visible = variable
    End Sub

    Dans mon formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
     
    Call ThisWorkbook.Test(False)
    ThisWorkbook.Save
    Call ThisWorkbook.Test(True)
     
    End Sub
    Là ça fonctionne, d'ailleurs... ce qui est ironique c'est que le ThisWorkbook.Test(False) fonctionne, puis le ThisWorkbook.Save appelle de nouveau la procédure Test via le BeforeSave sans résultat, la rappelle pour afficher la page via le AfterSave sans résultat, puis je la rappelle avec le ThisWorkbook.Test(True) qui fonctionne.

    Cette solution va me servir pour l'instant mais si quelqu'un a une explication, je suis largement preneur !

  5. #5
    Invité
    Invité(e)
    Par défaut
    bonjour,

    tu quitte l'avion avant l'arrêt complet de l'appareil!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub Workbook_Open()
    MonUsf.Show vbModal
    ThisWorkbook.Close False
    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
    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    Application.EnableEvents = True
    If CloseMode <> 0 Then Exit Sub 'ceci évite de poser la question si je ne le ferme pas par la croix (quand je le masque pour passer sur un autre formulaire, par ex)
     
    If MsgBox("Êtes-vous sûr de vouloir quitter ?", vbYesNoCancel + vbQuestion, "Confirmation") = vbYes Then
        Me.Hide
        ThisWorkbook.Save 'Envoie bien dans le Workbook_BeforeSave et AfterSave qui lancent bien ma macro cachant/affichant les pages... sans le faire.
        If Workbooks.Count = 1 Then Application.Quit Else Application.Visible = True
        Unload Me
    Else
        Cancel = 1
    End If
    End Sub

  6. #6
    Membre chevronné
    Homme Profil pro
    Ingénieur Industrialisation
    Inscrit en
    Mai 2015
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Industrialisation
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2015
    Messages : 222
    Par défaut
    Bonsoir rdurupt,

    J'aurais bien voulu faire ce genre de manip, mais ça ne peut pas fonctionner car j'ai plusieurs formulaires qui s'affichent/se masquent et s'affichent en même temps. Impossible de les utiliser en vbModal...

    Et quand bien même, je n'arrive pas à comprendre pourquoi les feuilles ne se masquent pas en passant par les événements before et aftersave qui sont lus... Franchement je ne comprends pas. sheets(3).visible = false fonctionne depuis le userform ou dans un module ou autre même si la sub est appelée par le formulaire... Mais pas si elle est appelée par le beforesave via l'userform.

    Surtout que la macro en question est quand même lue et peu importe ce que je lui demande (value, format, msgbox...) elle le fait, mais pas cacher les pages.

    Merci quand-même pour l'idée !

Discussions similaires

  1. Réponses: 3
    Dernier message: 28/08/2009, 13h30
  2. [SQL] Requête à jointure qui ne fonctionne pas
    Par Bensor dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/12/2004, 16h10
  3. Jointure externe qui ne fonctionne pas
    Par Guizz dans le forum Langage SQL
    Réponses: 3
    Dernier message: 05/02/2004, 12h26
  4. CREATEFILEMAPPING qui ne fonctionne pas???
    Par Jasmine dans le forum MFC
    Réponses: 2
    Dernier message: 06/01/2004, 19h33
  5. UNION qui ne fonctionne pas
    Par r-zo dans le forum Langage SQL
    Réponses: 7
    Dernier message: 21/07/2003, 10h04

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