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 :

creation de classe


Sujet :

Macros et VBA Excel

  1. #1
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut creation de classe
    Bonjour
    J'aimerais creer une nouvelle propriete de la classe "Range" qui permette de renvoyer les cellules contigues a une cellule.
    Appelons Voisinage cette propriete, on aurait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub exemple
     
    Set R=Range("C10")
    Set Region=R.Voisinage
    Region.Select
     
    end sub
    Ce code aurait pour effet de selectionner les cellules contigues a C10.
    Le pb est que je ne sais pas comment on fait ca.
    Alors j'ai cree un nouvel objet dont la classe est "clRegion"

    le code de la classe est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Property Get Region(nsheet As Range)
     Set Region = Range(nsheet.Offset(-1, -1), nsheet.Offset(1, 1))
    End Property
    et la fonction de selection est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub exemple()
    Dim R As New clRegion
    Set Rf = R.Region(Range("C10"))
    Rf.Select
     
    End Sub
    Le pb est que ca doit creer un nouvel objet, ce qui n'est pas necessaire.

    Alors comment puis-je faire ce qu eje voulais faire au debut?
    merci

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 514
    Points : 824
    Points
    824
    Par défaut
    Bonsoir,

    De ce que je comprends ta classe comprend deux propriétés:

    - Un objet Range en lecture/ecriture (C10 dans ton exemple)

    - Un objet Range en lecture seule correspondant aux cellules contigues à C10

    Ton module pourrait ressembler à ceci:

    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
    Private clsCellule As Range
     
    Property Get Cellule() As Range
        Set Cellule = clsCellule
    End Property
     
    Property Set Cellule(NewCellule As Range)
        Set clsCellule = NewCellule
    End Property
     
    Property Get Region() As Range
        With clsCellule
            Set Region = Range(.Offset(-1, -1), .Offset(1, 1))
        End With
    End Property
    L'utilisation donnerait ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim MyRange As clRegion
     
    Sub Test()
        Set MyRange = New clRegion
        Set MyRange.Cellule = Range("C10")
     
        MyRange.Region.Select
     
        MsgBox MyRange.Region.Address
     
    End Sub
    Reste à prévoir les cas ou la cellule de base est au bord de la feuille, et celui ou la cellule de base est une plage de cellules, voire plusieurs plages de cellules discontinues...

    Cordialement,

    Tirex28/

  3. #3
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    Merci
    Pourquoi n'est il pas necessaire de mettre un constructeur et un destructeur?
    De ce style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Class_Initialize()
    ....
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Class_Terminate()
      ....
    End Sub

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 514
    Points : 824
    Points
    824
    Par défaut
    Bonjour,

    Rien nen t'y oblige mais rien ne t'en empeche, tout dépend de ce que tu veux faire, par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Class_Initialize()
        Set Cellule = ActiveCell
    End Sub
    Cordialement,

    Tirex28/

  5. #5
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    merci
    As tu des references sur la composition et l heritage de classes en VBA?

  6. #6
    Membre éclairé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 514
    Points : 824
    Points
    824
    Par défaut
    Pour les anglophones:

    http://msdn2.microsoft.com/en-us/lib...ffice.10).aspx

    Cordialement,

    Tirex28/

  7. #7
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    Voici une classe que j'ai faite
    Elle consiste a creer un tableau, qui est repere par la toute premiere cellule, qui possede un titre, et une plage de valeur

    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
     
    'definition des variables internes
    Private x_val As Integer
    Private y_val As Integer
    Private titre As String
    Private header As Range
    Private Mysurface As Range
     
     
    Private Sub Class_Terminate()
    'Destructeur
    header.Value = vbNullString
    Set header = Nothing
    End Sub
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    '''''''''''''''''''Dimension horizontale'''''''''''''''''''''''''
    Public Property Get dimensions_abs()
    dimensions_abs = x_val
    End Property
    Public Property Let dimensions_abs(x)
    x_val = x
    End Property
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    '''''''''''''''''''Dimension verticale'''''''''''''''''''''''''
    Public Property Get dimensions_ord()
    dimensions_ord = y_val
    End Property
    Public Property Let dimensions_ord(x)
    y_val = x
    End Property
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ''''''''''''''''''''''''Titre'''''''''''''''''''''''''''''''''''''''
    Public Property Get Title()
    Title = titre
    End Property
    Public Property Let Title(d)
    header.Value = d
    End Property
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
    '''''''''''''''''''''''''''''''''Definition de la premiere cellule ''''''''''''''''''''''''''''''''''''''''''
    Public Property Get Entete()
    Set Entete = header
    End Property
    Public Property Let Entete(dsss)
    For Each Item In Sheets("SurfVol").Cells
    If Item.Address = dsss Then
    Set header = Item
    Exit For
    End If
    Next Item
    End Property
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ''''''''''''''''''''''''''''''''''''''''''Definition de la plage'''''''''''''''''''''
    Public Property Get Surface() As Range
    Set Surface = Mysurface
    End Property
     
    Public Property Let Surface(x)
    Set Mysurface = Range(header, header.Offset(x_val, y_val))
    End Property'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Voici l exemple

    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
    Sub exempl()
     
     
    Dim Tableaux1 As cTableaux
    Set Tableaux1 = New cTableaux
    Tableaux1.dimensions_abs = 10
    Tableaux1.dimensions_ord = 12
    Tableaux1.Entete = "$DG$6"
    Tableaux1.Title = "Letitre"
    Tableaux1.Surface = 5
     
    Set ff = Tableaux1.Surface()
     
    Set Tableaux1 = Nothing
     
    End Sub

    Le probleme quand je fais ca, c'est que dans la fenetre locals, on voit les variables Private titre,header,.....

    Aussi comment ameliorer cette classe?
    Merci

  8. #8
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Bonjour

    A mon avis, il n'y a pas moyen de masquer les propriétés privées de l'objet, en VBA.

    De plus, en vb, il n'y a pas d'héritage ni de polymorphisme.

    Pour voir comment l'améliorer, il faudrait que tu expliques à quoi te sert cet objet...

    Pour ma part, je ne vois pas l'utilité de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Property Let Surface(x)
    , car la surface est déterminée au moment de préciser le nombre de lignes et le nombre de colonnes. Pour moi, la variable privée my_surface doit être calculée dans les property let dimension_... et la propriété Surface doit être en lecture seule.

    De plus, pour ce genre d'objet, je préfère définir les propriétés lors d'une méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sub Init(Header as range, x as long, y as integer)
    (remarque au passage que x est de type long pour pouvoir accueillir plus de 32768 lignes...). Dès lors les propriétés dimensions... deviennent des propriétés en lecture seule, comme la propriété Surface.

    De plus, il faut choisir des noms explicites pour les propriétés, car pour la propriété dimensions_abs, je pensais qu'il s'agissait du nombre de colonnes (comme dans un tableau normal avec x en abcisse et y en ordonnée), et il semble que ce soit l'inverse. Pourquoi ne pas choisir Lignes et Colonnes ou NombreLignes et Nombre_Colonnes par exemple. Les variables privées s'appelleraient alors mLignes et mColonnes. La propriété Surface devrait utiliser la variable privée mSurface. Habituellement, les variables privées d'une classe sont préfixées de m ou de m_ et, pour celles qui sont directement en lien avec une propriété publique, elles portent le même nom que la propriété publique à laquelle elles se rapportent.

    Pour améliorer encore, tu peux typer ta propriété
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    property get Surface() as range
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  9. #9
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    merci pour les infos.
    Pour voir comment l'améliorer, il faudrait que tu expliques à quoi te sert cet objet...
    Disons que cetait pour apprendre a utiliser les classes en VBA.
    Plus precisement, je fais projet en VBA Excel ou je manipule des tableaux qui ont tous le meme format alors je pensais creer des objets.
    Par exemple pour avoir le nombre de cellules utilises dans le tableau, je dois faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nblignes_call = Sheets("Surfvol").Range("list_of_strikes_within_the_range").Offset(1, 0).End(xlDown).Row - Sheets("Surfvol").Range("list_of_strikes_within_the_range").Row
    Alors autant mettre ca dans un objet, c'est plus mieux et plus facile a utiliser.

    A mon avis, il n'y a pas moyen de masquer les propriétés privées de l'objet, en VBA.
    Tant pis, c'est juste que c'est penible davoir deux fois les memes variables dans la fenetre.


    Pour ma part, je ne vois pas l'utilité de
    Code :

    Property Let Surface(x)

    , car la surface est déterminée au moment de préciser le nombre de lignes et le nombre de colonnes. Pour moi, la variable privée my_surface doit être calculée dans les property let dimension_... et la propriété Surface doit être en lecture seule.
    Cest ce que je pensais faire.

    et la propriété Surface doit être en lecture seule.
    Donc pas de get pour la lecture seule ?



    De plus, pour ce genre d'objet, je préfère définir les propriétés lors d'une méthode
    Code :

    Sub Init(Header as range, x as long, y as integer)
    Je ne comprends pas ce que tu dis. Que serait le code de Init alors?

  10. #10
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par deubelte Voir le message
    Donc pas de get pour la lecture seule ?
    Non, c'est l'inverse. C'est Get qui lit et Let qui écrit.
    Une propriété est en lecture seule lorsque tu as
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    property get Surface() as range
    sans avoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    property let Surface(... as range)
    Ainsi, tu peux la lire mais tu ne peux pas l'écrire.
    Citation Envoyé par deubelte Voir le message
    De plus, pour ce genre d'objet, je préfère définir les propriétés lors d'une méthode
    Code :

    Sub Init(Header as range, x as long, y as integer)
    Je ne comprends pas ce que tu dis. Que serait le code de Init alors?
    Pour définir la surface, tu as besoin du nombre de lignes et du nombre de colonnes. Si tu permets de modifier le nombre de lignes et le nombre de colonnes dans des propriétés spécifiques, tu ne sais pas facilement calculer la surface. Or, tu pourrais en avoir besoin dans ta classe, surtout que le but principal de ta classe est de mettre un objet Range à disposition du code appelant.
    Tu as alors deux solutions. La première est de te passer de Init et de déterminer les trois variables nécessaires au calcul de la plage via des propriétés spécificiques en écriture.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    property let Header(Header as range)
        set mHeader = Header
    end property
     
    property let Lignes(Lignes as long)
        mLignes =Lignes
    end property
     
    property let Colonnes(Colonnes as integer)
        mColonnes = Colonnes
    end property
    puis de mettre la surface à disposition au sein de la propriété
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    property get Surface() as range
        set Surface = range(header,header(lignes,colonnes))
    end property
    en gérant alors le fait que le code pourrait très bien appeler la propriété surface alors que Lignes et/ou Colonnes n'ont pas été spécifiées. La propriété surface sera toujours en lecture seule, puisque sa définition dépend d'autres propriétés de l'objet.

    C'est pour cela que je propose une méthode Init
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    sub Init(Header as range, Lignes as long, Colonnes as Integer)
        set mHeader = Header
        mLignes = Lignes
        mColonnes = Colonnes
        set mSurface = range(header,header(lignes,colonnes))
    end sub
    Dans ce cas, les propriétés Lignes, Colonnes et Surface seront en lecture seule.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  11. #11
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    Oui, mais Sub init, tu dois la definir dans un module et pas dans une classe
    Ce n'est donc pas une propriete, c'est une methode.

    Peux tu definir une methode dans une classe?

  12. #12
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par deubelte Voir le message
    Oui, mais Sub init, tu dois la definir dans un module et pas dans une classe
    Ce n'est donc pas une propriete, c'est une methode.

    Peux tu definir une methode dans une classe?
    Si tu places le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sub Init(...)
        ...
        ...
    end sub
    dans une classe, Init devient une méthode de cette classe.
    Tu as donc, dans un module standard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dim MonTableau as new cTableaux
    montableau.init(range("a1"),5,8)
    Attention! Lorsque l'on travaille avec une classe, on parle de propriétés et de méthodes, mais une classe peut aussi mettre des fonctions à disposition du code appelant. Tout dépend de l'objet.

    Dans un module standard, on ne parlera pas de méthode, mais de procédure et on parlera de fonction. On ne parlera jamais de propriété dans un module standard.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  13. #13
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    OK merci
    Et par exemple, pour remplir en colonne les cellules contenues dans la surface, comment ferais-tu?

    Si la surface est un range, c'est en fait une collection de cellule

    Peut on faire une boucle For Next ?




    Attention! Lorsque l'on travaille avec une classe, on parle de propriétés et de méthodes, mais une classe peut aussi mettre des fonctions à disposition du code appelant. Tout dépend de l'objet.

    Dans un module standard, on ne parlera pas de méthode, mais de procédure et on parlera de fonction. On ne parlera jamais de propriété dans un module standard.
    merci pour les precisions

  14. #14
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Tu utilises la propriété Surface comme un objet Range

    Avec la classe suivante (Attention, j'ai modifié la ligne qui définit l'objet mSurface, pour que la plage Surface soit sur le même onglet que la cellule Header)
    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
    Option Explicit
     
    Dim mLignes As Long
    Dim mColonnes As Integer
    Dim mHeader As Range
    Dim mSurface As Range
     
    Sub Init(Header As Range, Lignes As Long, Colonnes As Integer)
        Set mHeader = Header
        mLignes = Lignes
        mColonnes = Colonnes
        Set mSurface = Header.Parent.Range(Header, Header(Lignes, Colonnes))
    End Sub
     
    Property Get Surface() As Range
        Set Surface = mSurface
    End Property
     
    Property Get Lignes() As Long
        Lignes = mLignes
    End Property
     
    Property Get Colonnes() As Integer
        Colonnes = mColonnes
    End Property
    Tu peux utiliser le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub essais()
        Dim MaPlage As Range
        Dim MonObjet As New cTableaux
     
        MonObjet.Init Range("b3"), 5, 10
        Set MaPlage = MonObjet.Surface
     
        MaPlage.Cells(4, 3) = "Bonjour"
        MaPlage.Cells(12, 0) = "Au revoir"
    End Sub
    pour voir comment VBA travaille avec la propriété Surface

    Je te conseille de travailler avec F8 (mode pas à pas) dans Essai pour suivre le déroulement du code
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  15. #15
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    je m'excuse pour ma mal-comprenence, mais je n'arrive pas a comprendre a quoi sert Init.
    Que je fasse:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Sub exempl()
    Dim Tableaux1 As cTableaux
    Set Tableaux1 = New cTableaux
    Tableaux1.Colonne = 10
    Tableaux1.Lignes = 12
    Tableaux1.Entete = "$DG$6"
    Tableaux1.Title = "Letitre"
    Set Tableaux = Nothing
     
    End Sub
    ou ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Sub exempl()
    Dim Tableaux1 As cTableaux
    Set Tableaux1 = New cTableaux
    Tableaux1.Colonne = 10
    Tableaux1.Lignes = 12
    Tableaux1.Entete = "$DG$6"
    Tableaux1.Title = "Letitre"
    Call Tableaux1.Init(Tableaux1.Entete, Tableaux1.Lignes, Tableaux1.Colonne)
    Set Tableaux = Nothing
     
    End Sub
    Ca a exactement le meme effet. Je vois dans la fenetre locals la surface qui est bien définie.

    En fait la propriete entete est definie comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Public Property Let Entete(dsss)
    For Each Item In Sheets("SurfVol").Cells
        If Item.Address = dsss Then
             Set Header = Item
             Exit For
        End If
    Next Item
    End Property
    Ca permet de definir la premiere case d'un tableau.
    Quand je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tableaux1.Entete = "$DG$6"
    La surface est automatiquement definie. Cest bizarre

  16. #16
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    On m'a dit plus haut qu'on pouvait pas faire du polymorphisme et de l'heritage en VBA.
    Mais voici ce que je voudrais faire:

    A partir d'un objet Myobjet1 instancie d'une classe MyClass1
    je voudrais creer un sous objet Myobjet2 de l'objet Myobjet1 instancie d'une autre classe MyClass2.

    Par exemple, si on a un objet MyTableau je veux creer un sous Tableau MyTableau2 de MyTableau pour pouvoir faire:

    MyTableau.MyTableau2.Colonne=5.


    merci

  17. #17
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Avec la classe que j'ai définie, tu ne peux pas affecter les propriétés Lignes et Colonnes, et tu dois utiliser Init. Mais si tu laisses les propriétés en lecture/écriture, la méthode Init devient inutile. Cela étant, je serais curieux de voir ton code, car avec ce que tu avais donné au départ, la propriété Surface n'est pas définie avant d'affecter la propriété Surface. Mais comme je l'ai dit plus haut, il n'est pas logique d'avoir la propriété Surface en lecture/écriture. Pour moi, cette propriété doit être en lecture seule.

    En l'absence du code que tu utilises, et d'explications claires et détaillées sur ce que tu souhaites réaliser, je ne sais pas être plus précis dans mes explications.

    Cela étant, utiliser une classe X comme propriété d'une classe Y n'est en rien du polymorphisme, et il est tout à fait possible de créer deux classes dont l'une serait utilisée comme propriété de l'autre.

    Il est également possible de définir comme propriété d'une classe X un objet de classe X. Toutes ces constructions dépendent de ce que tu souhaites réaliser. Il te faut donc être plus précis dans tes explications et tes exemples.
    Je note cependant que coder "en dur" la feuille de données dans la classe n'est pas pertinent.

    En ce qui concerne la propriété Parent, elle est définie pour une série d'objets.
    Ainsi, le Parent d'une cellule est l'objet Worksheet qui la contient. Le Parent d'un objet Worksheet est l'objet Workbook qui le contient...

    Pour une classe personnalisée, il n'y a pas de propriété Parent par défaut. C'est à toi de créer la propriété lors de l'élaboration de ta classe.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  18. #18
    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
    Hello Pierre, je viens de lire ton cours Quand en tires-tu un tuto, ça vaudrait la peine.
    Merci à toi, j'ai mis de côté l'url.

    Quant au code de deubelte... j'attends aussi
    Bonne soirée.

  19. #19
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    Classe clTableaux

    Voici les programmes
    J'ai fait un objet d'objet (cf clCorps1)

    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
    Private x_val As Integer
    Private y_val As Integer
    Private titre As String
    Private Header As Range
    Private Mysurface As Range
    Private MyCorps As Range
    Private MyCorps1 As clCorps1
    Private Sub Class_Initialize()
    Dim uk As clCorps1
    Set uk = New clCorps1
    Me.Corps1 = uk
    End Sub
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Public Property Let Corps1(Val As clCorps1)
    Set MyCorps1 = Val
    End Property
     
    Public Property Get Corps1() As clCorps1
    Set Corps1 = MyCorps1
    End Property
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Private Sub Class_Terminate()
    Header.Value = vbNullString
    Call deleteName(titre)
     
    Set Header = Nothing
    Set MyCorps1 = Nothing
    End Sub
    Public Property Get Colonne()
    Colonne = x_val
    End Property
    Public Property Let Colonne(x)
    x_val = x
    End Property
    Public Property Get Lignes()
    Lignes = y_val
    End Property
    Public Property Let Lignes(x)
    y_val = x
    End Property
    Public Property Get Title()
    Title = titre
    End Property
    Public Property Let Title(d)
    titre = d
    Header.Value = d
    Header.Parent.Names.Add Name:=d, RefersTo:="=" & CStr(Header.Parent.Name) & "!" & CStr(Header.AddressLocal)
    End Property
    Public Property Get Entete()
    Set Entete = Header
    End Property
    Public Property Let Entete(dsss)
    For Each Item In ActiveSheet.Cells
        If Item.Address = dsss Then
             Set Header = Item
             Exit For
        End If
    Next Item
    End Property
    Public Property Get Surface()
    Set Surface = Mysurface
    End Property
    Public Property Get Corps()
    Set Corps = MyCorps
    End Property
    Public Sub Init(Header As Range, Lignes As Long, Colonnes As Integer, Lignes1, Colonnes1)
     
    Set Mysurface = Header.Parent.Range(Header, Header(Lignes, Colonnes))
    Set MyCorps = Header.Parent.Range(Header.Offset(1, 1), Header(Lignes, Colonnes))
    Set MyCorps1 = Range("A1")
    End Sub
    Public Sub EffaceTout()
    Mysurface.ClearContents
    End Sub
    Public Sub EffaceCorps()
    MyCorps.ClearContents
    End Sub
    Sub deleteName(arg1)
    Header.Parent.Names(arg1).Delete
    End Sub



    Classe clCorps1
    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
     
    Private x_val As Integer
    Private y_val As Integer
    Private Sub Class_Initialize()
     
    End Sub
    Public Property Get Colonne()
    Colonne = x_val
    End Property
    Public Property Let Colonne(x)
    x_val = x
    End Property
    Public Property Get Ligne()
    Ligne = y_val
    End Property
    Public Property Let Ligne(y)
    y_val = y
    End Property
    Programme d utilisation
    Je ne sais pas si tout marche
    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
    Sub exempl()
     Dim Tableaux1 As cTableaux
    Set Tableaux1 = New cTableaux
    Tableaux1.Colonne = 10
    Tableaux1.Lignes = 12
    Tableaux1.Entete = "$Z$3"
    Tableaux1.Title = "Letitre"
     
    For j = 1 To Tableaux1.Colonne - 1
         For i = 1 To Tableaux1.Lignes - 1
             Tableaux1.Corps.Cells(i, j) = i * j
         Next i
    Next j
    Tableaux1.EffaceCorps
    Tableaux1.EffaceTout
     
     Tableaux1.Corps1.Colonne = 1
    Tableaux1.Corps1.Ligne = 9
     
     Call Tableaux1.Init(Tableaux1.Entete, Tableaux1.Lignes, Tableaux1.Colonne, Tableaux1.Corps1.Ligne, Tableaux1.Corps1.Colonne)
    Set Tableaux1 = Nothing
    End Sub

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

Discussions similaires

  1. [debutant] creation de classe
    Par boboss123 dans le forum Général Java
    Réponses: 5
    Dernier message: 20/11/2009, 13h03
  2. creation de classe et mapping hibernate
    Par cyreel dans le forum Persistance des données
    Réponses: 3
    Dernier message: 25/09/2008, 10h23
  3. pb de creation de classe de connexion
    Par oceane751 dans le forum JDBC
    Réponses: 2
    Dernier message: 30/07/2007, 15h37
  4. creation dune classe et utilisation
    Par le_voisin dans le forum C++
    Réponses: 9
    Dernier message: 30/08/2006, 21h38
  5. Parseur XML to Java pour creation de Class
    Par yannick101 dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 18/07/2005, 14h20

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