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 :

Déplacer code feuille(s) vers ThisWorkbook


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 593
    Points : 153
    Points
    153
    Par défaut Déplacer code feuille(s) vers ThisWorkbook
    Bonjour,

    Comment puis-je déplacer le code de "feuille(s)" vers ThisWorkbook, sachant que le code en question est exécuté à partir de deux boutons sur chaque feuille ?
    Merci d'avance pour votre aide,

    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
    Option Explicit
    Private Sub Fermer_Click()
     
        Application.EnableCancelKey = xlDisabled
     
        If MsgBox("Voulez-vous sauvegarder les modifications ?", vbYesNo) = vbNo Then
            Call AnnulePleinEcran
            ThisWorkbook.Close savechanges:=False
            Exit Sub
        End If
     
        With ActiveWorkbook
            ChDrive "C"
            ChDir .Path
                  .SaveCopyAs Format(Now, "yyyymmdd-hh""h""nn") & " " & .Name
        End With
        Call AnnulePleinEcran
        ThisWorkbook.Close True
        Exit Sub
    End Sub
    Private Sub Imprime_Click()
     
        printclick = True  'cf. procédure dans ThisWorkbook pour forcer l'impression à partir du bouton de la feuille
     
        ActiveSheet.PageSetup.PrintArea = "A1:N25"
        With ActiveSheet.PageSetup
            .CenterHorizontally = True
            .CenterVertically = True
            .Orientation = xlLandscape
            .FitToPagesWide = 1
            .FitToPagesTall = 1
            .Zoom = 140
        End With
     
        ActiveWindow.SelectedSheets.PrintPreview
        printclick = False
        ActiveSheet.Protect
    End Sub

  2. #2
    Membre expérimenté Avatar de Gado2600
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Mai 2013
    Messages
    903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Office VBA

    Informations forums :
    Inscription : Mai 2013
    Messages : 903
    Points : 1 364
    Points
    1 364
    Par défaut
    Bonjour,

    Ta question n'est pas très claire...

    Tu veux simplement déplacé ce code et conserver tes boutons ? Ou le faire exécuter automatiquement par Excel ?

    Cordialement,
    Le sabre est une arme. Le kendo est un art de tuer. Quelles que soient les belles paroles pour l'expliquer, telle est sa vérité.

  3. #3
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 767
    Points : 28 626
    Points
    28 626
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Au stade de mes connaissances, il n'est pas possible d'associer la procédure événementielle d'un contrôle ActiveX dans le module ThisWorkbook.
    En revanche il est possible d'associer un bouton formulaire à une procédure se trouvant dans ce module mais à la condition que celle-ci ne soit pas indiquée comme Private
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 593
    Points : 153
    Points
    153
    Par défaut
    Bonjour,
    Pour être plus clair, ma question posait sur la possibilité de mettre le code de feuille dans ThisWorkbook (avec les "liens" vers chaque feuille) plutôt que l'intégralité du code dans chaque feuille du classeur.
    Outre cet exemple, j'ai un autre classeur avec 52 feuilles (une pour chaque semaine de l'année), et lorsque je dois modifier le code "de feuille", je dois le recopier 52 fois...
    Il semble que ça ne soit guère possible d'optimiser la chose, en l'état.
    Merci quand même pour ta réponse et celle de Gado,
    Bien à vous,

  5. #5
    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,

    Le ThisWorkook et les modules de feuilles servent essentiellement à réagir à des événements, et pas à concentrer du code.

    Ceci dit, rien ne t'empêche de mettre une procédure quelconque dans un module ordinaire et de l'appeler à partir d'autant de modules de feuilles que tu veux, ou du module de classeur.

    Par Exemple:

    Dans au moins 1 module de feuille:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        Dim NomFeuille As String
        Dim Plage As String
        NomFeuille = ActiveSheet.Name
        Plage = Target.Address
        Call message(NomFeuille, Plage)
    End Sub
    Dans un module Standard:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Public Sub message(feuille As String, adresse As String)
        Dim phrase As String
        phrase = "Vous êtes sur la feuille : " & feuille & vbNewLine _
                 & "et vous avez cliqué sur la cellule " & adresse
        MsgBox (phrase)
    End Sub
    À 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.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Salut,

    @clementmarcotte,
    Le problème avec ce code est que tu es obligé de mettre autant de procédure <ControlName>_<EventName> (par exemple CommandButton1_Click...CommandButton15_Click) que tu as de contrôles ActiveX dans une feuille et cela dans autant de feuille que tu n'as de feuille contenant des contrôles ActiveX.
    50 feuilles avec 5 CommandButton/Feuille demanderait 5 x 50 = 250 sous-routine événementielle.
    Même si chacune d'entre elle ne gère qu'un seul appel, ça fait 4 lignes de codes/sous-routine événementielle soit 1000 lignes de code dans notre exemple.

    Normalement, il faut gérer ce genre de cas en instanciant un module de classe qui contient un champs déclaré avec le mot clé WithEvents.
    Ce champs est censé représenter un object qui contient au moins un Event (CommandButton par exemple).

    Ce n'est pas simple à comprendre par contre. Je ne l'ai compris que lorsque j'ai fait du Visual Basic.
    Le compilateur déclare la variable en tant que Propriété (en interne). C'est notamment pour ça que l'on ne peut pas modifier ce genre de pseudo-variable au travers d'un paramètre ByRef ou que l'on ne peut pas la déclarer en tant que tableau.
    L'assesseur Set de cette propriété permet de s'abonner et de désabonner à un gestionnaire d'événement (caché pour nous) en utilisant la signature de la fonction <VariableName>_<EventName> si celle-ci existe dans le Module où la variable est déclaré.
    L'abonnement se fait en lui assignant une variable object qui possède un jeu d'événement (comme c'est le cas avec un CommandButton).
    Le désabonnement se fait en lui assignant un Nothing.
    L'assesseur Get permet simplement de renvoyer l'object stocké.

    Un code conceptuellement équivalent à une variable WithEvents
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Private WithEvents x As ClassWithEvents
     
    Private Sub x_Event1()
    End Sub
    serait équivalent à celui-ci:
    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
     
    Private _x As ClassWithEvents
     
    Public Property Get x() As ClassWithEvents
        Return _x
    End Property
     
    Public Property Set x(Value As ClassWithEvents)
        ' Désabonnement.
        If Not _x Is Nothing Then
            RemoveEventHandler _x.Event1, AddressOf x_Event1
        End If
     
        ' Stockage de Value.
        Set _x = Value
     
        ' Abonnement.
        If Not _x Is Nothing Then
            AddEventHandler _x.Event1, AddressOf x_Event1
        End If
    End Property
     
    Private Sub x_Event1()
    End Sub
    La Classe ClassWithEvents serait hypothétiquement équivalente à celle-ci dans l'exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Public Event Event1()

    Sinon, il y a plusieurs exemple sur le forum de classe qui utilise les variable Withevents, en cherchant un peu, une solution sera trouvé.
    Dernière modification par Invité ; 28/01/2016 à 15h12.

  7. #7
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 593
    Points : 153
    Points
    153
    Par défaut
    Merci à ClémentMarcotte pour sa suggestion et à "invité" pour ses explications complémentaires qui je dois l'avouer me dépassent totalement, eu égard à mes connaissance très basiques (sans jeu de mots) du VBA.

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

Discussions similaires

  1. déplacer une ligne entière vers une autre feuille
    Par isodoro dans le forum Excel
    Réponses: 15
    Dernier message: 06/07/2015, 13h59
  2. Réponses: 2
    Dernier message: 16/02/2014, 16h07
  3. [XL-2003] copier en automatique le code d'un module d'une feuille EXCEL vers une autre feuille
    Par MichaSarah dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 30/05/2009, 00h13
  4. Déplacer une feuille vers un classeur fermé
    Par kedas dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 05/10/2007, 17h06
  5. [Linux]différence de code de windows vers unix sous eclipse
    Par skywalker3 dans le forum Eclipse Java
    Réponses: 6
    Dernier message: 05/01/2005, 14h11

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