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 :

Module de classe type et surcharge [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Décembre 2012
    Messages : 129
    Par défaut Module de classe type et surcharge
    Bonjour à tous,

    Je me remets au vba après un an de pause à faire du js/php, j'avais donc pris la bonne habitude de faire de la POO. Ceci devient pourtant très fastidieux en vba...

    Du coup je créé une grosse classe abstraite avec plein de types à l'intérieur et j'ai notamment un array de chaque type que je dois souvent manipuler (ajout, update, suppression, tri, filtre etc...)
    J'ai donc créé des fonctions pour manipuler les array facilement malheureusement je n'ai pas trouver comment surcharger une fonction car les types utilisateurs ne peuvent pas être convertis en variant...

    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
    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
     
    Type tField
        attr1 As String
        attr2 As Date
    End Type
    Type tTable
        attr1 As String
        attr2 As Date
    End Type
     
    Sub main()
        Dim arrFields() As tField
        Dim field As tField
        Dim arrTables() As tTable
        Dim table As tTable
     
        field.attr1 = "test"
        field.attr2 = Date
        table.attr1 = "test"
        table.attr2 = Date
     
        arrPush arrFields, field
        arrPush arrTables, table
    End Sub
     
    Private Sub arrPush(arr, el)
        If isErasedArray(arr) Then
            ReDim arr(1)
        Else
            ReDim Preserve arr(UBound(arr) + 1)
        End If
        arr(UBound(arr)) = el
    End Sub
    Private Function isErasedArray(arr) As Boolean
        Dim a&
        On Error GoTo ieaError
        a = UBound(arr)
        isErasedArray = False
        Exit Function
    ieaError:
    isErasedArray = True
    End Function
    Je me retrouve avec le message d'erreur
    "Erreur de compilation: Seuls les types définis par l'utilisateur et qui sont définis dans les modules d'objets publics peuvent être convertis depuis ou vers un variant, ou passés à des fonctions à liaison tardive"
    Pour l'instant la solution est de faire :
    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
     
    Option Explicit
    Option Base 1
     
    Type tField
        attr1 As String
        attr2 As Date
    End Type
    Type tTable
        attr1 As String
        attr2 As Date
    End Type
     
    Sub main()
        Dim arrFields() As tField
        Dim field As tField
        Dim arrTables() As tTable
        Dim table As tTable
     
        field.attr1 = "test"
        field.attr2 = Date
        table.attr1 = "test"
        table.attr2 = Date
     
        arrPushField arrFields, field
        arrPushTable arrTables, table
    End Sub
     
    Private Sub arrPushField(arr() As tField, el As tField)
        If isErasedArrayField(arr) Then
            ReDim arr(1)
        Else
            ReDim Preserve arr(UBound(arr) + 1)
        End If
        arr(UBound(arr)) = el
    End Sub
    Private Sub arrPushTable(arr() As tTable, el As tTable)
        If isErasedArrayTable(arr) Then
            ReDim arr(1)
        Else
            ReDim Preserve arr(UBound(arr) + 1)
        End If
        arr(UBound(arr)) = el
    End Sub
    Private Function isErasedArrayField(arr() As tField) As Boolean
        Dim a&
        On Error GoTo ieaError
        a = UBound(arr)
        isErasedArrayField = False
        Exit Function
    ieaError:
    isErasedArrayField = True
    End Function
    Private Function isErasedArrayTable(arr() As tTable) As Boolean
        Dim a&
        On Error GoTo ieaError
        a = UBound(arr)
        isErasedArrayTable = False
        Exit Function
    ieaError:
    isErasedArrayTable = True
    End Function
    Mais ça va vite devenir très lourd... Là je n'ai que deux fonctions mais je risque d'en avoir un paquet...

    Quelqu'un a-t-il une astuce pour surcharger les fonctions en vba ?


    PS : sachant que je ne créé pas un module de classe par type parce que ça devient vite très lourd également (voir pire) et je ne suis pas sûr de résoudre le problème.

  2. #2
    Invité
    Invité(e)
    Par défaut
    bonjour,
    tu as 2 option!
    tu peux passer en paramètres un objet ParamArray dan ce cas tu dois scanner le tableau V et scanner les tableau a,b,c,d en n’oubliant pas d'identifier le type de données
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TypeName(MyVariable(1))
    soit utiliser de paramètre Optionnels!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub test(ParamArray V() As Variant)
     
    End Sub
     
    Sub test2(Optional a, Optional b, Optional c, Optional d)
     
    End Sub
     
    Sub test3()
      test Array(1, 2, 3, 4), Array(4, 5, 6), Array(7, 8, 9), "toto"
      test2 a:=1, b:=2, c:=3, d:=4
        test2 a:=1, b:=2
    End Sub

  3. #3
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    Bonjour à toi,

    Malheureusement à part Variant pas de surcharge en VBA.....

  4. #4
    Membre émérite
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Par défaut
    Salut,

    en VBA, c'est de la POO très réduite.
    Pas de surcharge, ni d'interface, ni d'héritage, etc...

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Décembre 2012
    Messages : 129
    Par défaut
    Bonjour à toi,

    Malheureusement à part Variant pas de surcharge en VBA.....
    Salut,

    en VBA, c'est de la POO très réduite.
    Pas de surcharge, ni d'interface, ni d'héritage, etc...
    Mais pourquoi l'une des plus puissantes société du monde nous inflige ça ?
    Ils ont le droit de faire évoluer vba comme php l'a fait par exemple...



    Rdurupt : pensais-tu à quelque chose comme ça ?

    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
     
    Sub main()
        Dim arrFields() As tField
        Dim field As tField
        Dim arrTables() As tTable
        Dim table As tTable
     
        field.attr1 = "test"
        field.attr2 = Date
        table.attr1 = "test"
        table.attr2 = Date
     
        arrPush arrFields, field
        arrPush arrTables, table
    End Sub
     
     
    Private Sub arrPush(ParamArray arr())
        Dim arrTmp(), i&
        If isErasedArray(arr(0)) Then
            ReDim arrTmp(1)
            arr(0) = arrTmp
        Else
            ReDim arrTmp(UBound(arr(0)) + 1)
            For i = 1 To UBound(arr(0))
                arrTmp(i) = arr(0)(i)
            Next i
        End If
        arrTmp(UBound(arrTmp)) = arr(1)
        arr(0) = arrTmp
    End Sub
    Private Function isErasedArray(ParamArray arr()) As Boolean
        Dim a&
        On Error GoTo ieaError
        a = UBound(arr(0))
        isErasedArray = False
        Exit Function
    ieaError:
    isErasedArray = True
    End Function
    Car j'ai le même message d'erreur :
    "Erreur de compilation: Seuls les types définis par l'utilisateur et qui sont définis dans les modules d'objets publics peuvent être convertis depuis ou vers un variant, ou passés à des fonctions à liaison tardive"

  6. #6
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    Je suis totalement d'accord avec toi et j'aurais même bien vu un virage de VBA vers C# .net !
    Tout en gardant la possibilité pour rétrocompatbilité de faire du VBA mais donner le choix de classeur nouvelle génération avec un vrai langage des années 2010...

  7. #7
    Invité
    Invité(e)
    Par défaut
    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
     
    For i =0 to ubound(arr)
       if typenme(arr(i)) ="array"  then
          for x = 0 to ubound(arr(i))
            msgbox arr(i)(x)
          next
       end if
     
    if typenme(arr(i)) ="range"  then
          for x = 1 to arr(i).cells.count
     
            msgbox arr(i)(x)
          next
       end if
    Next

  8. #8
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Décembre 2012
    Messages : 129
    Par défaut
    Merci Rdurupt mais le problème ne vient pas de la manière de traiter les arguments contenus dans ParamArray mais d'une erreur de compilation donc je ne peux même pas lancer le code.
    Le problème vient bien de l'appel de la fonction et non de la fonction elle même...

    Une fois cette erreur contournée, je pense pouvoir me débrouiller pour traité mes données en fonction de leur type.

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

Discussions similaires

  1. [VBA] Module de classe et évènement
    Par Caroline1 dans le forum Access
    Réponses: 9
    Dernier message: 20/03/2013, 23h23
  2. [Module de classe] Fonction non liée à l'instance?
    Par Caroline1 dans le forum Access
    Réponses: 6
    Dernier message: 07/04/2006, 20h13
  3. Réponses: 4
    Dernier message: 31/03/2006, 15h16
  4. Réponses: 8
    Dernier message: 22/02/2006, 15h09
  5. variables publiques ou module de classe ?
    Par niclalex dans le forum Access
    Réponses: 3
    Dernier message: 04/10/2005, 18h49

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