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 :

Amélioration d'un module de classe [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de GeoTrouvePas
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Juin 2010
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Contrôleur de gestion
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2010
    Messages : 185
    Par défaut Amélioration d'un module de classe
    Bonjour tout le monde,

    Dans le cadre d'un gros chantier, je dispose d'un classeur qui fait office de base de données.
    Pour effectuer mes calculs, j'ai besoin de déterminer le numéro de chaque colonne en me basant sur un code indicateur.

    Pour cela, j'avais décidé de passer par un module de classe (que je maîtrise encore très mal) dont voici un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    'Module de classe "cDATA_PERSONNEL"
    Property Get LOGIN() As Long
        LOGIN = ThisWorkbook.Sheets("DATA_PERSONNEL").Rows(Const_General_Lig_CodeIndic).Find("LOGIN", LookAt:=xlWhole).Column
    End Property
    Property Get NOM() As Long
        NOM = ThisWorkbook.Sheets("DATA_PERSONNEL").Rows(Const_General_Lig_CodeIndic).Find("NOM", LookAt:=xlWhole).Column
    End Property
    ...
    Cela fonctionne très bien sauf que je me suis rendu compte que la valeur de ces propriétés est recalculée à chaque fois que j'y fais appel dans une macro. Cela ralenti donc considérablement l'exécution de mon code.

    Existerait - il une solution ?

    Je vous remercie par avance de votre aide.

    Edit : J'ai bien évidemment pensé à passer par des constantes mais cette base de données est appelée à évoluer (ajout / suppression de colonnes) et vu que j'ai une quinzaines d'onglets comportant des dizaines de colonnes, ça sera très rapidement le foutoir dans les déclarations.

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Bonjour,

    Pourquoi ne pas mettre ces 2 variables en Public dans un module ?
    Tu les calcules au Workbook_Open() ou ailleurs et tu as leurs valeurs durant ta session...

  3. #3
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Un numéro de colonne suite à un Find : ce que tu as fait là ressemble beaucoup à ce que fait la fonction EQUIV().
    https://support.office.com/fr-FR/art...9-533f4a37673a

    Ne serait-il pas plus simple et moins lourd d'utiliser cette fonction ?

  4. #4
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Question surement idiote, mais pourquoi ne pas nommer tes colonnes?
    Onglet Formules/gestionnaire de noms.

    Avec des colonnes nommées, tu peux ajouter ou supprimer des colonnes et toujours les "retrouver" en les appelant dans ton code par leur nom.

  5. #5
    Membre éclairé Avatar de GeoTrouvePas
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Juin 2010
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Contrôleur de gestion
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2010
    Messages : 185
    Par défaut
    Citation Envoyé par pijaku Voir le message
    Question surement idiote, mais pourquoi ne pas nommer tes colonnes?
    Pour deux raisons :
    - Pour ne pas éparpiller les éléments de mon code. Cela obligerait, lors de la maintenance, à jongler entre VBE et Excel pour identifier les soucis, modifier les paramètres etc...
    - Il me paraît difficile de gérer autant de variables via le gestionnaire de noms. Ça serait très vite illisible.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    L'intérêt d'un module de classe est d'avoir 1000 instance avec une variable LOGIN pour chaque et avec des valeurs différentes

    Mais effectivement une variable publique en l'espèces ferait l'affaire!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Private LOGIN_ as long 
    Property Get LOGIN() As Long
    If LOGIN_=0 then   LOGIN_= ThisWorkbook.Sheets("DATA_PERSONNEL").Rows(Const_General_Lig_CodeIndic).Find("LOGIN", LookAt:=xlWhole).Column
    LOGIN=LOGIN_
    End Property
    Une Property peut être en lecture écriture ce que ne fait pas un fonction!
    Dernière modification par Invité ; 04/07/2017 à 18h35.

  7. #7
    Membre éclairé Avatar de GeoTrouvePas
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Juin 2010
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Contrôleur de gestion
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2010
    Messages : 185
    Par défaut
    Citation Envoyé par parmi Voir le message
    Pourquoi ne pas mettre ces 2 variables en Public dans un module ?
    Tu les calcules au Workbook_Open() ou ailleurs et tu as leurs valeurs durant ta session...
    C'est ce que j'avais fait au départ. Le soucis c'est que mon classeur devient conséquent. J'ai plusieurs dizaines de numéro de colonnes à définir sur plusieurs dizaines d'onglets. Du coup je me retrouve avec plus d'une centaine de variables à calculer. Ça me fait une macro imbuvable et pénible à maintenir, ça doit bouffer de la mémoire pour rien etc....

    Du coup je me suis dit que ça serait peut être plus pratique, léger et mieux organisé de créer un module de classe par onglet et d'y définir mes variables.

    Citation Envoyé par Menhir Voir le message
    Ne serait-il pas plus simple et moins lourd d'utiliser cette fonction ?
    Si ça fait exactement la même chose qu'un Equiv. Le soucis n'est pas la formule en elle même. Le soucis est de stocker les résultats et de les réutiliser ces valeurs dans le code

    Citation Envoyé par dysorthographie Voir le message
    Bonjour,
    L'intérêt d'un module de classe est d'avoir 1000 instance avec une variable LOGIN pour chaque et avec des valeurs différentes

    Mais effectivement une variable publique en l'espèces ferait l'affaire!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Private LOGIN_ as long 
    Property Get LOGIN() As Long
    If LOGIN_=0 then   LOGIN_= ThisWorkbook.Sheets("DATA_PERSONNEL").Rows(Const_General_Lig_CodeIndic).Find("LOGIN", LookAt:=xlWhole).Column
    LOGIN=LOGIN_
    End Property
    Une Property peut être en lecture écriture ce que ne fait pas un fonction!
    Si je comprends bien ton code, tu sors de la routine si une valeur a déjà été attribuée. Je vais modifier mon code pour voir si cela à un impact intéressant en temps d'exécution.

    Merci à tous les trois

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 22/08/2016, 07h19
  2. [XL-2003] Clic droit de la souris sur un userform piloté par un module de classe
    Par mormic dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 07/11/2014, 09h58
  3. [XL-2007] Nom propre en passant par un Module de classe
    Par maxval18 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 24/01/2013, 05h31
  4. Faut-il passer par la création d'un module ou pas
    Par taka10 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 0
    Dernier message: 08/12/2012, 20h19
  5. [Kylix] Débrider Kylix sans passer par le Net
    Par BXDSPORT dans le forum EDI
    Réponses: 1
    Dernier message: 23/03/2003, 10h52

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