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 :

Instanciation module de classe


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2012
    Messages : 18
    Par défaut Instanciation module de classe
    Bonjour,

    Inscrit récemment, je passe régulièrement ici pour lire les tuto et suivre les topics qui m'interessent. Le problème que je vous soumet à déjà été traité, retraité, re-re-traité...mais je dois fatigué il y a un truc qui ne passe plus (alors qu'il y a quelques heures, avant plusieurs modifs... :fail

    Le problème réside sur la portée de mon module de classe instancié.

    Extrait de mon module de classe Initialisation :
    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
    Option Explicit
     
    Public Nom_de_la_Simulation As String
    Public Repertoire_de_travail As String
    Public Racine_import_S_fonctions As String
    Public Racine_export_données_scenario As String
    Public Racine_export_Courbe As String
    Public Racine_librairie_SAO_1 As String
    Public Racine_librairie_SAO_2 As String
    Public Racine_données_scenario As String
    Public Racine_Rapport As String
    Public Racine_modèle_avion As String
    Public Repertoire_cosimulation As String
    Public Repertoire_tables_perfo As String
    Public Repertoire_Templates_Courbes As String
    Public Nom_du_fichier_de_parametre As String
     
     
    Public MaxProcess As Single
    Public sleepTimeMS As Single
     
    Public Actual_ListFichier As Collection    
     
     
    ' Méthode permettant d'initialiser les chemins et repertoires (MENU)
    ' afin de les rendre accessible dans tout le fichier gestion_test
    Sub Init_Path()
     
        Nom_de_la_Simulation = Worksheets("MENU").Range("B1")
        Repertoire_de_travail = Worksheets("MENU").Range("B2")
        Racine_import_S_fonctions = Worksheets("MENU").Range("B3")
        Racine_export_données_scenario = Worksheets("MENU").Range("B4")
        Racine_export_Courbe = Worksheets("MENU").Range("B5")
        Racine_librairie_SAO_1 = Worksheets("MENU").Range("B6")
        Racine_librairie_SAO_2 = Worksheets("MENU").Range("B7")
        Racine_données_scenario = Worksheets("MENU").Range("B8")
        Racine_Rapport = Worksheets("MENU").Range("B9")
        Racine_modèle_avion = Worksheets("MENU").Range("B10")
        Repertoire_cosimulation = Worksheets("MENU").Range("B11")
        Repertoire_tables_perfo = Worksheets("MENU").Range("B12")
        Repertoire_Templates_Courbes = Worksheets("MENU").Range("B13")
        Nom_du_fichier_de_parametre = Worksheets("MENU").Range("E1")
     
        MsgBox "Init_Path() => " & Nom_de_la_Simulation
     
    End Sub
    Extrait de ma feuille MENU

    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
    Option Explicit
     
    Public myInit As Initialisation
     
    Public Function GetInitialisation() As Initialisation
        Set GetInitialisation = New Initialisation
    End Function
     
    ' ----------------------------------------------------------------------------------------------------
    ' Méthode permettant de lancer l'initialisation
    Public Sub RaZ_Init()
     
        If myInit Is Nothing Then
            Set myInit = GetInitialisation
        End If
     
        MsgBox "Sub RaZ_Init()"
        myInit.Init_Path
        myInit.Init_Shell
        myInit.MAJ_Testjouables
     
        Worksheets("MENU").Range("B14:B25") = ""
     
        ' VERIFICATION
        If myInit Is Nothing Then
            MsgBox "Mauvaise Initialisation"
        Else
            Worksheets("MENU").Range("D14") = "Initialisation de " & myInit.Nom_de_la_Simulation & " : DONE"
        End If
     
    End Sub
     
     
    ' ----------------------------------------------------------------------------------------------------
    ' Méthode permettant d'afficher un MsgBox avec le nombre de scenarios à simuler
    Public Sub Info_nbScenarios()
     
        If myInit Is Nothing Then
            MsgBox "Mauvaise Initialisation"
        Else
            myInit.Calcul_NombreScenarios
        End If
     
    End Sub
    J'ai un bouton initialisation qui appelle Public Sub RaZ_Init(). Pas de soucis, le test de fin (et d'autres) me ressortent les bonnes infos issus des différents attributs de myInit.

    Le bouton qui appelle Sub Info_nbScenarios()...fail à chaque fois par contre. "Mauvaise initialisation" qu'il me dit.

    GetInitialisation est un ajout récent pour essayer de corriger le soucis. J'ai aussi essayé d'instancier par un Dim ... As New ... mais ça me clean la valeur de mes attributs de classes.

    'fin bref, ça a marché avec un truc semblable.
    Si quelqu'un peut m'aider je prends !

    Merci d'avance,
    Julien

  2. #2
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2012
    Messages : 18
    Par défaut
    Il s'agit bien de rendre mon objet myInit accessible à plusieurs sub dans mon module.

    Une déclaration Dim .. As New ... a la facheuse tendance à me déclencher l'initialize de mon module de classe à chaque appelle dudit module. Et si je fais un simple dim ... As ... et ensuite dans mon sub RaZ_Init un Set/New mes autres subs n'accèdent pas à l'objet (Is Nothing).

    (en espérant avoir été plus clair)

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2012
    Messages : 18
    Par défaut
    Pour ceux qui se poseraient la question :

    Module1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Dim myClass As Classe1
     
    Sub Bouton1_Cliquer()
     
        Set myClass = New Classe1
        myClass.var01 = "titi"
        Module2.var02 = "toto"
         myClass.init
     
    End Sub
    Sub Bouton2_Cliquer()
        MsgBox "var01 contient " & myClass.var01
        MsgBox "var02 contient " & Module2.var02
    End Sub
    Module2 (module classique)
    Classe1 (module de classe)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public var01 As String
     
    Public Sub init()
        var01 = "tutu"
    End Sub
    ...marche très bien. que ce soit avec ou sans myClass.init

    Bref, je ne sais pas ce qui mer** dans mon code précédent et pourquoi j'ai
    le droit à une initialization l'instance de mon module à chaque appel mais...
    fin voila. En Instancing 1-Private avec un Dim ... As ... puis un Set ... = new ...
    pas de soucis.

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2012
    Messages : 18
    Par défaut
    (le multipost c'est le mal mais..des fois que quelqu'un suive...)

    Après avoir passivé un a un tout ce qui ressemble de près ou de loin à
    une suite de caractère j'en suis venu à la conclusion suivante : le code
    qui merdouille c'est une sombre histoire de OlEObjects, loin de mes considérations initiales.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MsgBox ActiveSheet.OLEObjects.Count & " OLEObject presents"
        'Do While (i_control < ActiveSheet.OLEObjects.Count + 1)
        '    ActiveSheet.OLEObjects(ActiveSheet.OLEObjects.Count).Delete
        'Loop
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim Template_control As Object
                Set Template_control = ActiveSheet.OLEObjects.Add(ClassType:="Forms.Combobox.1", Link:=False, DisplayAsIcon:=False, Left:=Worksheets("MENU").Range("F" & i_ligne).Left, Top:=Worksheets("MENU").Range("F" & i_ligne).Top, Width:=Worksheets("MENU").Range("F" & i_ligne).Width, Height:=Worksheets("MENU").Range("F" & i_ligne).Height)
                'ActiveSheet.OLEObjects(ActiveSheet.OLEObjects.Count).Name = Sheets(i_feuille).Name '
     
                Dim i_fichier As Single
                i_fichier = 1
     
                Do While i_fichier <= Actual_ListFichier.Count
                '    ActiveSheet.OLEObjects(ActiveSheet.OLEObjects.Count).Object.AddItem Actual_ListFichier.Item(i_fichier)
                    i_fichier = i_fichier + 1
                Loop
    Les trucs passivés sont ceux qui me font "tomber" mon objet myInit du départ.

    La problème ne se situe donc pas dans l'instanciation de mon module de classe, ce dernier n'étant qu'un symptome de mon problème.

    Sujet presque résolu !

  5. #5
    Membre Expert Avatar de ZebreLoup
    Homme Profil pro
    Ingénieur Financier
    Inscrit en
    Mars 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Financier
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 994
    Par défaut
    J'avoue que je n'ai pas eu le courage de tout lire, mais en diagonale ma première réponse serait : Si tu veux un objet accessible partout, il faut qu'il soit déclaré dans un module et non dans une feuille...

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2012
    Messages : 18
    Par défaut
    D'où l'idée de balader mes variables dans un objet myInit.

    Après, finalement, le module de classe était peut être pas le meilleur
    truc à faire dans le sens où un module simple suffit amplement.


    Je suis entrain de vérifier ce qui déconne réelement, pour le moment
    ce serait au niveau de mes Set sur mes OLEObjects. Bref, plus trop à
    voir avec la problématique initiale. Par contre... je reste dubitatif quand
    au fait que ça me "désintancie/détruit ?" mon objet myInit.

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2012
    Messages : 18
    Par défaut
    Je viens de tout passer en module classique.
    Même soucis avec les OLEObjects.

    Le soucis ne vient donc vraiment pas de l'instanciation.



    Sujet à fermer



    (je pars relire la FAQ sur les OLEObjects ^^)

  8. #8
    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 : 71
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Par défaut
    Bonjour,

    Sans aller plus loin, je m'interroge sur l'intérêt d'un module de classe si toutes ses variables sont publiques...
    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!

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2012
    Messages : 18
    Par défaut
    J'en suis venu à la même conclusion.

    A l'origine l'idée était un peu plus ambitieuse mais vu en
    j'en suis bloqué je suis repassé aux modules simples.


    La problématique a divergé le soucis venant des OLEObjects
    (ou du truc situé entre l'écran ,et la chaise...)

    => voir ici
    http://www.developpez.net/forums/d12...erds-variable/

Discussions similaires

  1. instanciation d'une classe
    Par firejocker dans le forum C++
    Réponses: 6
    Dernier message: 15/11/2005, 11h54
  2. Réponses: 7
    Dernier message: 10/11/2005, 10h09
  3. variables publiques ou module de classe ?
    Par niclalex dans le forum Access
    Réponses: 3
    Dernier message: 04/10/2005, 18h49
  4. [VB.NET] Instanciation objet (sur class perso.)
    Par DaxTaz dans le forum ASP.NET
    Réponses: 4
    Dernier message: 03/05/2004, 11h07

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