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 :

[VBA-E] Masquage de feuille et macro...


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2004
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 137
    Points : 63
    Points
    63
    Par défaut [VBA-E] Masquage de feuille et macro...
    Bonjour,

    Je suis un total newbie en VBA mais je dois modifier une petite application Excel pour ma boîte.

    J'ai un classeur composé de 3 feuilles, mais la 2ème ne doit pas être vue par les utilisateurs. Une macro fait le lien entre les 3 feuilles.
    Pour l'instant, tout marche mais je n'arrive pas à masquer la feuille qui doit l'être. Avec Format->Feuille->Masquer, la macro ne tourne plus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Erreur d'exécution '1004':
    La méthode Select de la classe Worksheet a échoué.
    Si je place ma 2ème feuille dans un autre classeur, afin qu'elle n'apparaisse plus dans le 1er, j'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Erreur d'exécution '9' :
    L'indice n'appartient pas à la sélection
    Mon code à cet endroit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("matrice.xls!matrice").Select
    où le classeur Matrice.xls n'est composé que de la feuille Matrice...

    Comment donc masquer une feuille en faisant en sorte qu'une macro qui lui fasse référence fonctionne ? Ou comment faire en sorte que "l'indice appartienne à la sélection" ?

    Merci d'avance !

  2. #2
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Tu nous donnes les erreurs mais pas le code qui les génère.

    Dur de pouvoir te répondre sans jouer aux devinettes.

    Déjà, évite le .Select d'une feuille cachée.

    Petit exemple qui fonctionne en utilisant l'instanciation de la feuille cachée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      Dim ws As Worksheet
      Set ws = Sheets("Sheet2")
      MsgBox ws.Cells(1, 1)
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  3. #3
    Membre du Club
    Inscrit en
    Juillet 2004
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 137
    Points : 63
    Points
    63
    Par défaut
    Bon, voici le code qui me génère les erreurs lorsque la feuille est cachée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ' copie matrice et renomme suivant i
     
       Sheets("matrice").Select
     
        If i = 1 Then
            Sheets("matrice").Copy After:=Sheets("listing")
            Sheets("matrice (2)").Select
            Sheets("matrice (2)").Name = sh
     
        Else
            Sheets("matrice").Copy After:=Sheets("listing")
            Sheets("matrice (2)").Select
            Sheets("matrice (2)").Name = sh
        End If
    J'ai mis dans la déclaration des variables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Dim mat As Worksheet
      Set mat = Sheets("matrice")
    Comment dois-je faire pour transformer mon code d'origine en accord ?

    Merci d'avance !

  4. #4
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Pouquoi veux-tu faire une copie de "matrice" alors que tu peux y manipuler tout ce que tu veux sans qu'elle soit visible?

    Le problème, quand tu la copies, c'est que la copie est cachée aussi.
    Il faudra donc utiliser des ruses de sioux (telles que "matrice (2)", ce qui n'est pas très élégant) pour la rendre visible.

    Travaille directement dans ton objet "mat" exactement comme si tu mettais ActiveSheet à la place.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  5. #5
    Membre du Club
    Inscrit en
    Juillet 2004
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 137
    Points : 63
    Points
    63
    Par défaut
    En fait, je ne fais pas de copie de matrice telle quelle. Je m'explique :
    Cette application a pour but, à partir d'un listing de produits (index, codes articles, prix, références...) de créer des affichettes correspondantes qui seront affichées dans un magasin.
    - La 1ère feuille, d'où est lancée la macro par un bouton de formulaire, propose à l'utilisateur de rentrer le n° de la 1ère et de la dernière affiche (index).
    - La 2ème feuille du classeur (matrice) est le masque suivant lequel seront créées les affiches. Ce masque ne doit être vu ni modifié.
    - La 3ème feuille est le listing (BdD) à partir duquel sont créées les affiches.

    La macro créée autant de feuilles qu'il y a d'affiches à réaliser, ce sont les copies de matrice...

    Maintenant la macro complète qui me sert à faire cela :
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    Sub CréationPublishers()
     
     
    ' declaration des variables
        Dim i, debut, fin As Integer
        Dim sh As String
        Dim titre, dates, produit, code, libelle, euro, cent, franc, unite As String
     
    ' debut de boucle
        Range("G11").Select
        debut = ActiveCell.Value
        Range("G13").Select
        fin = ActiveCell.Value
     
        i = debut
     
        While i <= fin
     
    ' debut de procedure
     
        sh = "n°" & i
        Sheets("listing").Select
        ActiveSheet.Unprotect
        If Range("L" & (i + 1)).Value = "Oui" Then
    '        Sheets(sh).Activate
    '        ActiveWindow.SelectedSheets.Delete
        Else
        End If
     
    ' copie matrice et renomme suivant i
     
       Sheets("matrice").Select
     
        If i = 1 Then
            Sheets("matrice").Copy After:=Sheets("listing")
            Sheets("matrice (2)").Select
            Sheets("matrice (2)").Name = sh
     
        Else
            Sheets("matrice").Copy After:=Sheets("listing")
            Sheets("matrice (2)").Select
            Sheets("matrice (2)").Name = sh
        End If
     
    ' changement texte suivant listing
        Sheets("listing").Select
        Range("B" & (i + 1)).Select
        titre = ActiveCell.Value
        Sheets(sh).Select
        ActiveSheet.Unprotect
        ActiveSheet.Shapes("WordArt 1").Select
        Selection.ShapeRange.TextEffect.Text = titre
     
        Sheets("listing").Select
        Range("C" & (i + 1)).Select
        dates = ActiveCell.Value
        Sheets(sh).Select
        ActiveSheet.Shapes("WordArt 2").Select
        Selection.ShapeRange.TextEffect.Text = dates
     
        Sheets("listing").Select
        Range("D" & (i + 1)).Select
        produit = ActiveCell.Value
        Sheets(sh).Select
        ActiveSheet.Shapes("WordArt 3").Select
        Selection.ShapeRange.TextEffect.Text = produit
     
        Sheets("listing").Select
        Range("E" & (i + 1)).Select
        code = ActiveCell.Value
        Sheets(sh).Select
        ActiveSheet.Shapes("WordArt 9").Select
        Selection.ShapeRange.TextEffect.Text = code
     
        Sheets("listing").Select
        Range("F" & (i + 1)).Select
        libelle = ActiveCell.Value
        Sheets(sh).Select
        ActiveSheet.Shapes("WordArt 4").Select
        Selection.ShapeRange.TextEffect.Text = libelle
     
        Sheets("listing").Select
        Range("H" & (i + 1)).Select
        euro = ActiveCell.Value
        Sheets(sh).Select
        ActiveSheet.Shapes("WordArt 5").Select
        Selection.ShapeRange.TextEffect.Text = euro
     
        Sheets("listing").Select
        Range("I" & (i + 1)).Select
        cent = ActiveCell.Value
        Sheets(sh).Select
        ActiveSheet.Shapes("WordArt 6").Select
        Selection.ShapeRange.TextEffect.Text = cent
     
        Sheets("listing").Select
        Range("J" & (i + 1)).Select
        franc = ActiveCell.Value
        Sheets(sh).Select
        ActiveSheet.Shapes("WordArt 8").Select
        Selection.ShapeRange.TextEffect.Text = franc
     
        Sheets("listing").Select
        Range("K" & (i + 1)).Select
        unite = ActiveCell.Value
        Sheets(sh).Select
        ActiveSheet.Shapes("WordArt 27").Select
        Selection.ShapeRange.TextEffect.Text = unite
     
        ' Protège le publisher
        ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
     
        Sheets("listing").Select
        Range("L" & (i + 1)).Value = "Oui"
     
    ' FIN changement texte suivant listing
        i = i + 1
        Wend
     
    'Protège la feuille de données
        Sheets("listing").Select
        ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
     
    ' FIN de boucle
    End Sub
     
    ' FIN de procedure
    Des idées ?

  6. #6
    Membre du Club
    Inscrit en
    Juillet 2004
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 137
    Points : 63
    Points
    63
    Par défaut
    Je ne sais pas si j'ai fait l'adaptation qu'il fallait, mais du moment que je mets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("matrice").Visible = False
    ça ne marche plus, étant donné que la feuille est masqué, j'obtiens le même message d'erreur.

    Ne serait-il pas plus facile, au lieu de masquer la feuille, de la déplacer dans un autre classeur et d'y faire appel par la suite. Classeur qui serait ensuite fermé dès la fin de la macro ?

  7. #7
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Montre ton code. Je ne comprends pas ton problème.
    Si tu actives ta feuille même masquée, elle devient accessible.
    Si tu mets Application.screenupdating =false, avant, tu ne la vois pas avant la fin de ta macro.
    Si elle était cachée avant ta macro, elle le sera à la fin après la ligne Application.screenupdating = true

    Testé et utilisé depuis des années

    Si ça ne fonctionne pas alors j'échange ma version de VB97 contre la tienne

    A+

    PS - Essaie mon code sur un classeur vierge et regarde le résultat

  8. #8
    Membre du Club
    Inscrit en
    Juillet 2004
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 137
    Points : 63
    Points
    63
    Par défaut
    J'ai testé le code sur un classeur vierge, il marche parfaitement. Seulement, je ne sais pas comment l'adapter à mon code existant (quoté plus haut).
    En fait, dans cette partie du 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
    ' copie matrice et renomme suivant i
     
       Sheets("matrice").Select
     
        If i = 1 Then
            Sheets("matrice").Copy After:=Sheets("listing")
            Sheets("matrice (2)").Select
            Sheets("matrice (2)").Name = sh
     
        Else
            Sheets("matrice").Copy After:=Sheets("listing")
            Sheets("matrice (2)").Select
            Sheets("matrice (2)").Name = sh
        End If
    J'ai remplacé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("matrice").Select
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sheets("matrice").Visible = False
        Application.ScreenUpdating = False
        Sheets("matrice").Activate
        Range("A1").Select
    J'obtient une erreur 1004, la méthode Select de la classe Worksheet a échoué. Par contre, ma feuille matrice et ma feuille matrice (2) sont bien masquées. Les données ne sont pas encore remplacées dans la feuille matrice (2).

    En fait, ça serait sympa si tu pouvais me corriger le code d'origine...

    Merci d'avance !

  9. #9
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Vérifie mais pour nommer ta matrice, es-tu pas obligé de la sélectionner ?
    Essaie ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sheets("matrice").Visible = False 
        Application.ScreenUpdating = False 
        Sheets("matrice").Activate 
        Sheets("matrice (2)").Name = sh
    ou ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        Application.ScreenUpdating = False 
        Sheets("matrice").Visible = True
        Sheets("matrice").Select
        Range("A1").Select
        Sheets("matrice (2)").Name = sh
        Sheets("matrice").Visible = False
        Application.ScreenUpdating = True
    C'est le select qui provoque l'erreur. Pour sélectionner une cellule ta feuille doit être sélectionnée Apparemment, l'activation ne suffit pas puisque tu as une erreur (!)

    Tu dis

    A+

  10. #10
    Expert confirmé
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Points : 4 085
    Points
    4 085
    Par défaut
    Salut

    Bon j'avoue, je n'ai pas tout lu le fil de la discussion...

    Une chose à éviter: les Select et les Activate sur une feuille masquée.
    Pour les copies, les ajouts, les suppressions de données sur une feuille masquée, allez-y directement par l'adresse du Range voulu sur cette feuille.

    Je reprend juste le bout de code du début pour démo:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ' copie matrice et renomme suivant i 
     
       Sheets("matrice").Select 
     
        If i = 1 Then 
            Sheets("matrice").Copy After:=Sheets("listing") 
            Sheets("matrice (2)").Name = sh 
     
        Else 
            Sheets("matrice").Copy After:=Sheets("listing") 
            Sheets("matrice (2)").Name = sh 
        End If
    ici, on assigne directement un nouveau nom à la feuille sans la sélectionner.

  11. #11
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    tiens un truc de Faignant ... tu bloque l'affichage , rend la feuille visible.. tu peu alors exécuter ta macro..puis masquer à nouveau la feuille et libérer l'affichage ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Sub CréationPublishers()
      Application.ScreenUpdating = False
      Sheets("matrice").Visible = True
     
     
    ' declaration des variables
    (..)
    ' FIN de boucle
    Sheets("matrice").Visible = False
     Application.ScreenUpdating = True
    End Sub

  12. #12
    Membre du Club
    Inscrit en
    Juillet 2004
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 137
    Points : 63
    Points
    63
    Par défaut
    Tou d'abord, merci pour vos tentatives...

    Donc le Select provoque l'erreur là où vous m'avez proposé du code, car la feuillematrice est masquée. Du coup, plus de blocage à cet endroit là quand je place le code de Zazaraignée ou de Ouskel'n'or, mais l'erreur revient à chaque fois que l'on a dans le reste du code. Les feuilles nouvellement créées étant masquées également.
    D'ailleurs, il faut que les feuilles nouvellement créées (copies de matrice) soient visibles.

    Du coup, la solution de Bbil semble être la bonne. Cela fonctionne correctement...

    Par contre, comment faire en sorte qu'un utilisateur n'affiche pas la feuille matrice par le menu ? Si on protège le classeur, la macro ne fonctionne plus (ça bloque à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("matrice").Visible = True
    . Si on ne protège pas le classeur, la macro fonctionne mais n'importe qui peut réafficher la feuille...

    De nouvelles idées ?

  13. #13
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Je vais insister lourdement.

    EVITEZ LES SELECT ET ACTIVATE.

    Créez toujours des instances pour manipuler tous vos objets: Feuilles, Ranges, Workbooks, Shapes...

    C'est d'ailleurs la meilleure façon de commencer à apprendre à "penser objet" et se préparer aux technologies .NET, par exemple.

    Il est toujours possible de travailler sans Select.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  14. #14
    Membre du Club
    Inscrit en
    Juillet 2004
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 137
    Points : 63
    Points
    63
    Par défaut
    J'ai essayé de comprendre le code (langage qui m'était inconnu jusqu'alors).
    Effectivement, l'instanciation (mettre la feuille en viariable via Set ?) ne me paraît pas le plus simple en tant que newbie. Lorsque j'ai tenté en adaptant le code d'AlainTech, ça n'avait pas fonctionner. Je retenterai et me plongerai plus dedans quand j'aurai plus de temps...
    Par contre, si certains veulent me parler "instances" et me proposer quelquechose pas à pas, je suis toutes ouïes (pas sur de l'orthographe, là), mais je doute que vous n'ayez que ça à faire...
    Encore merci pour vos conseils !

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

Discussions similaires

  1. Problème lors de la 1ère utilisation d'une macro VBA pour copie de feuille
    Par youp_youp_ dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 27/06/2014, 10h54
  2. Exécution Macro VBA et actualisation des feuilles
    Par DjJEJ83 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 23/07/2007, 10h08
  3. [VBA-E] Protéger une feuille- contenant des macros
    Par nkhalidy dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 07/03/2007, 10h32
  4. [VBA-E] formule sur feuille ou par macro
    Par lio62 dans le forum Macros et VBA Excel
    Réponses: 22
    Dernier message: 14/02/2007, 17h13
  5. Réponses: 7
    Dernier message: 19/07/2005, 08h31

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