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 :

Avis sur une idée de conception pour éviter, entre autre, la répétion de code.


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 407
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 407
    Par défaut Avis sur une idée de conception pour éviter, entre autre, la répétion de code.
    Bonjour à toutes et tous et merci de votre temps et de votre aide.

    Je suis en train de développer un classeur ou je vais avoir des feuilles identiques (seules les données affichées diffèrent et c'est une demande explicite de mon client donc non négociable).

    J'ai pas mal de code VBA associé dans mes feuilles.

    Actuellement je fais les modifs dans une page, puis je recopie le code de la feuille dans sa sœur jumelle mais sincèrement je n'aime pas cela.
    Mon code comporte des procédures et des propriétés, notamment des propriétés pour accéder aux zones nommées.
    Cela à l'avantage de me permettre d'utiliser IntelliSense au lieu de devoir me souvenir de l'orthographe exact des noms.

    Ici un exemple pour accéder à une zone nommée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Property Get Colonne_LigneACacher() As Range
        Set Colonne_LigneACacher = Me.Range("Colonne_LigneACacher")
    End Property
    et de code adapté à ma page

    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
     
    Private Sub Test_HideTechnicalInformation()
        Call HideTechnicalInformation("")
        MsgBox "Fini !"
    End Sub
     
    Public Sub HideTechnicalInformation(prmDummy As String) 'prmDummy sert juste à cacher la procédure à l'utilisateur
        'Cache les lignes et colonnes techniques et fige les volets
        Call mdlVBAFunction.HideUnhide_TechnicalInformation(True, Me.Colonne_LigneACacher, Me.Ligne_ColonneACacher) 'Cette ligne varie avec chaque feuille.
     
        If Not wsInfo.EstModeImpression Then
                Call mdlVBAFunction.CustomFreezePan(Me.FigeageVolet) 'Cette ligne varie avec chaque feuille.
            Else
                Call mdlVBAFunction.CustomUnFreezePan(Me)
        End If
     
    End Sub
    Quand je dois traiter mes feuilles, il me faut une ligne par feuille.
    J'aimerai plutôt avoir une liste des feuilles et les appeler en rafale via une boucle du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    dim listeFeuille as new collection
     
    call listeFeuille.add(Feuille1)
    call listeFeuille.add(Feuille2)
    call listeFeuille.add(Feuille3)
     
    dim feuille as'ici est le problème
     
    for each feuille in listeFeuille
       call feuile.UneMethodePerso()
    next feuille
    sur la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dim feuille as'ici est le problème
    Je peux mettre as Object ce qui fait que ma rafale fonctionne mais que je perd l'IntelliSense mais surtout les vérifs du compilateur … pas cool.
    Si je mets As Worksheet, là c'est la rafale qui ne marche pas puisque que une worksheet n'ont pas de méthode UneMethodePerso.

    Donc j'ai pensé à créer un module de classe clsMaFeuillePerso qui aurait un objet Worksheet et toutes mes méthodes et propriétés personnelles définies là.

    Ce qui donnerai un code du genre :

    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
     
    dim listeFeuille as new collection
     
    dim feuille as clsFeuille
     
    set feuille=new clsFeuille:call feuille.Assigner(feuille1) 'feuille1 est une Worksheet
    call listeFeuille.add(feuille):set feuille=nothing
     
    set feuille=new clsFeuille:call feuille.Assigner(feuille2) 'feuille2 est une Worksheet
    call listeFeuille.add(feuille):set feuille=nothing
     
    set feuille=new clsFeuille:call feuille.Assigner(feuille3) 'feuille2 est une Worksheet
    call listeFeuille.add(feuille):set feuille=nothing
     
    for each feuille in listeFeuille
       call feuille.UneMethodePerso()
    next feuille
    Quelqu'un a-t'il déjà fait cela et en a-t'il été statisfait ?

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 194
    Par défaut
    Bonjour,

    je suis pas certain d'avoir tous compris mais je vais tenter de te proposer quelque chose de plus simple qu'une classe et pourtant dieu sait que je suis un fervent utilisateur des classes.

    pourquoi ne pas utiliser 2 variables une dimensionnée object et une autre dimensionnée worksheet ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Dim objFeuille As Object, Feuille As Worksheet
     
    For Each Feuille In ThisWorkbook.Worksheets
        Set objFeuille = Feuille
        Call objFeuille.UneMethodePerso 'pour la methode perso
        'et ici la variable Feuille pour l'IntelliSense
    Next

  3. #3
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 407
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 407
    Par défaut
    Bonjour Phil Free et merci de ton intérêt.

    Le problème avec le type Object c'est qu'on perd la vérif par le compilateur que la propriété existe bien (et aussi l'IntelliSense).
    Donc on peut se retrouver à appeler des procédures ou des propriétés qui n'existent plus ou avec un nom mal orthographié.

    L'exemple que j'ai donné n'appelle qu'une seule méthode mais dans ma réalité j'appelle plusieurs méthodes sur une même feuille d'où l'intérêt de la boucle.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

Discussions similaires

  1. Réponses: 0
    Dernier message: 26/05/2014, 17h47
  2. Réponses: 13
    Dernier message: 27/07/2011, 13h08
  3. Cherche avis sur une idée d'IA pour un rpg...
    Par Neolander dans le forum Intelligence artificielle
    Réponses: 12
    Dernier message: 31/03/2008, 07h19

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