XL 2010 Variable Tableau Module de Classe vers Module Standard

laurent950

XLDnaute Barbatruc
Bonsoir,
Difficulté selon que l'ont type la variable tableau dans le module de classe à renvoyer dans le module standard :
Exemple avec 3 cas dont 1 qui fonctionne pas ?

VB:
J’essaie de faire passer une (variable tableau de type Double privé) d’un module de classe vers un module standard.

Pour exemple : J’ai fait avec 3 cas différents pour le renvoi avec la lecture GET du module de classe.

Cas N° 1 Fonctionne  Typé  Double :   Public Property Get TabDone()

Cas N° 2 Fonctionne Pas  Typé Double :  Public Property Get TabDone() as Double

Cas N° 3 Fonctionne   Typé Variant :  Public Property Get TabDone() as Variant


J’ai créé une table de multiplication pour le teste. Cette variable tableau privé du module de classe est remplis avec sa procédure :
             - result  qui se trouve dans le GET.

La procédure :  result  Remplis cette variable tableau Typé Double selon le Cas N°1 et N°2 ou Variant selon le cas N°3

1 - un module standard simple avec :

-  Une variable Tableau

-  La variable du Module de classe soit : resT

-  Et une fonction de lecture du module de classe Get : TabDone

-  La fonction qui renvois ce que je récupère du module de classe vers ma variable tableau :
               - TabCalcul = resT.TabDone

2 – Le module de classe est composé :

-  La propriété de lecture GET (Cas N°1 et N°2 en Double) et (Cas N°3 en Variant)

-   La procédure qui remplit la variable tableau vers le module de classe : result

-  J’ai donc testé 3 cas :

-  Les Cas N°1 et N°3 Fonctionne Bien (Mais La propriété de lecture Get est écrite de deux façon différente en fonction du type de la (variable Tableau privé) suivant qu’elle est Typé Double ou Variant.

La question est la suivante pourquoi Le cas N° 2 ne Fonctionne pas pour cette variable tableau qui est Typé en double ?

Voir Cas N°3 Fonctionne très bien en Variant Mais Non compatible Pour le Type Double Cas N°2

Lorsque cette Variable est différente de Variant écrire comme l’exemple du cas N°1 ?

Y a-t-il une explication (Bien que je pense que le faite de pas noté le type de renvois pour le Cas N°1 doit être par Default de Type Variant ? mais j’en suis pas sur.

Merci à ceux qui auront la réponse à mon interrogation ?

Cas N° 1
Module standard : Test_Double_Fonctionne
VB:
Sub TestVarTabModuleDeClasse()
' Cas N° 1 Fonctionne avec l'ecriture du GET non Typé lors du renvois.
' -------------------------------------------------------------------
' Création du variable tableau de Type Double avec statut privé dans le Module de classe "CalqueCulatrice"
'       -----> Private mTabCalcul() As Double
' Puis renvois de cette variable Tableau dans le Module standard :
'      ------> Test_Double_Fonctionne
' Reception du resultat au moyen de la lecture du module de classe GET
'      ------> TabCalcul = resT.TabDone
' Fonctionne écrit ainsi.
' Public Property Get TabDone()
'      ------> Normalement l'écriture doit se faire ainsi :
'              -----------> Public Property Get TabDone() as Double
' Mais cela ne fonctionne avec cette écriture

' 1)
' Module de classe CalqueCulatrice
Dim resT As CalqueCulatrice
    ' resT Variable Typé Module du module de classe "CalqueCulatrice"
        Set resT = New CalqueCulatrice

' 2)
' Variable tableau Typé Double
Dim TabCalcul() As Double

' 3)
' TabCalcul (Tableau 2 D de type Double)
' Variable de lecture privé de la classe "Get TabDone" Typé en Renvois Double.
    TabCalcul = resT.TabDone

' 4)
' Copie dans la Feuille le résultat du tableau.
    Cells(4, 2).Resize(UBound(TabCalcul, 1), UBound(TabCalcul, 2)) = TabCalcul
End Sub

Cas N° 1
Module de classe : CalqueCulatrice
VB:
Private mTabCalcul() As Double
Public Property Get TabDone()
' Devrais être écrit ainsi : Public Property Get TabDone() as double (Mais Fonctionne pas) Voir Cas N°2
' ------------------------------------------------------------------------------------------------------
' Procedure qui remplis la variable tableau : mTabCalcul
    result

' Renvois du resultat du tableau "mTabCalcul" dans le module standard
    TabDone = mTabCalcul
End Property
Private Sub result()

' Dimension de la variable tableau 2 D Privé au module de classe "mTabCalcul".
    ReDim Preserve mTabCalcul(1 To 10, 1 To 10)

' Boucle pour les calcule des resultats stocké dans de la variable tableau 2 D Privé au module de classe "mTabCalcul".
    For i = LBound(mTabCalcul, 1) To UBound(mTabCalcul, 1)
        For j = LBound(mTabCalcul, 2) To UBound(mTabCalcul, 2)
            mTabCalcul(i, j) = i * j
        Next j
    Next i
   End Sub

Cas N° 2
Module de classe : CalqueCulatrice
VB:
Private mTabCalcul() As Double
Public Property Get TabDone() As Double
' Devrais être écrit ainsi : Public Property Get TabDone() (Fonctionne) Voir Cas N°1
' ----------------------------------------------------------------------------------
' Procedure
    result
' Renvois du resultat du tableau "mTabCalcul" dans le module standard
    TabDone = mTabCalcul
End Property
Private Sub result()

' Dimension de la variable tableau 2 D Privé au module de classe "mTabCalcul".
    ReDim Preserve mTabCalcul(1 To 10, 1 To 10)

' Boucle pour les calcule des resultats stocké dans de la variable tableau 2 D Privé au module de classe "mTabCalcul".
    For i = LBound(mTabCalcul, 1) To UBound(mTabCalcul, 1)
        For j = LBound(mTabCalcul, 2) To UBound(mTabCalcul, 2)
            mTabCalcul(i, j) = i * j
        Next j
    Next i
   End Sub

Cas N° 3
Module de classe : CalqueCulatrice
VB:
Private mTabCalcul() As Variant
Public Property Get TabDone() As Variant
' Devrais être écrit ainsi : Public Property Get TabDone() as Double (Fonctionne Pas Typé Double) Voir Cas N°2
' -------------------------------------------------------------------------------------------------------
' Devrais être écrit ainsi : Public Property Get TabDone() (Fonctionne Pas Typé Double) Voir Cas N°1
' -------------------------------------------------------------------------------------------------------
' Procedure
    result
' Renvois du resultat du tableau "mTabCalcul" dans le module standard
    TabDone = mTabCalcul
End Property
Private Sub result()

' Dimension de la variable tableau 2 D Privé au module de classe "mTabCalcul".
    ReDim Preserve mTabCalcul(1 To 10, 1 To 10)

' Boucle pour les calcule des resultats stocké dans de la variable tableau 2 D Privé au module de classe "mTabCalcul".
    For i = LBound(mTabCalcul, 1) To UBound(mTabCalcul, 1)
        For j = LBound(mTabCalcul, 2) To UBound(mTabCalcul, 2)
            mTabCalcul(i, j) = i * j
        Next j
    Next i
End Sub

laurent
 

Pièces jointes

  • Cas 1_Focnctionne_Avec_Double_VarTabModuleDeClasse.xlsm
    26.9 KB · Affichages: 31
  • Cas 2_FocnctionnePas_Avec_Double_VarTabModuleDeClasse.xlsm
    26.6 KB · Affichages: 19
  • Cas 3_Focnctionne_Avec_Variant_VarTabModuleDeClasse.xlsm
    26.4 KB · Affichages: 18
Dernière édition:

laurent950

XLDnaute Barbatruc
Fichier corrigé avec l'aide de Dranred qui ma plus qu'aidé dans cette compréhension d'un modéle domplexe.

Le fichier V3 est Corrigé en Fichier V5

J'ai noté ci-dessous la Mauvaise instruction du fichier V3 en Poste #9

Les arguments ne sont du même type dans le Get que dans le Let ou le Set.
ici Mauvaise écriture du fichier V3
VB:
Public Property Get EcritureTabBd(ByVal i As Long, ByVal j As Long) As Variant
    If IsObject(m_TabStock(i, j)) Then
        Set EcritureTabBd = m_TabStock(i, j)
    Else
        EcritureTabBd = m_TabStock(i, j)
    End If
   End Property
' Ecriture vers une variable Tableau de type Variant (Pour variable Natif)
Public Property Let EcritureTabBd(ByVal i As Integer, ByVal j As Integer, ByVal Var As Variant)
    m_TabStock(i, j) = Var
End Property
' Ecriture vers une variable Tableau de type Variant (Pour variable Objet)
Public Property Set EcritureTabBd(ByVal i As Integer, ByVal j As Integer, ByVal Var As Variant)
    Set m_TabStock(i, j) = Var
End Property

J'ai noté ci-dessous Maintenant la Bonne instruction du fichier (V3 en Poste #9 corrigé en fichier V4 du Présent Poste #17)
ici correction du fichier V3
VB:
 Les arguments doivent être du même type dans le Get que dans le Let ou le Set.

Public Property Get EcritureTabBd(ByVal i As Long, ByVal j As Long) As Variant
    If IsObject(m_TabStock(i, j)) Then
        Set EcritureTabBd = m_TabStock(i, j)
    Else
        EcritureTabBd = m_TabStock(i, j)
    End If
   End Property
' Ecriture vers une variable Tableau de type Variant (Pour variable Natif)
Public Property Let EcritureTabBd(ByVal i As Long, ByVal j As Long, ByVal Var As Variant)
    m_TabStock(i, j) = Var
End Property
' Ecriture vers une variable Tableau de type Variant (Pour variable Objet)
Public Property Set EcritureTabBd(ByVal i As Long, ByVal j As Long, ByVal Var As Variant)
    Set m_TabStock(i, j) = Var
End Property

Ps : J'ai posté le fichier V5

Un très très grand Merci a Dranred qui est vraiment plus que très réactif et très précis dans ses réponses, et j'apprend énormément avec toute sont aide et aussi j'ai tous consigné (du mieux que j'ai pu) pour les autres membre du forum qui souhaite aussi apprendre des Modules de classe en VBA Excel.

Cdt
Encore Merci Dranred.
Laurent
 

Pièces jointes

  • V5_LectureEcriture Avec Let et Set en module de classe - Fonctionne Pas.xlsm
    21.5 KB · Affichages: 12

laurent950

XLDnaute Barbatruc
variable Tableau 2 dimension avec un Module de classe tri croissant et décroissant

code ci dessous :
Donc :
J'ai une variable tableau dans le module standard !
* Je choisie de faire un tri sur une colonne définit
* Aux Choix Croissant Ou Décroissant
* En Bonus je conserve aussi la structure de la variable tableau initial
Je vous poste le code

* Le module Standard : ModuleStandard
VB:
' Appelle du Module de classe en public
Public SL As New SListe
Sub test()
' Mise en mémoire d'un tableau 2 dimensions
Dim Tableau() As Variant
    Tableau = Range(Cells(1, 1), Cells(17, 3))
' Fonction Tri du tableau / Le tableau et la colonne 2
' Choix Croissant = Crois OU Decroissant = DeCrois
    Tableau = TrierCol(Tableau, 1, "DeCrois")
' Test Cellule(1,1)
    MsgBox Tableau(1, 1)
' Fin !
' *************************************************************************************************************
' NOTA : BONUS
' Donc je parler jutement de se qui était consigné dans la classe voila l'ancien tableau
' dans l'ordre d'origine !
    Dim TableauOrigine() As Variant
        TableauOrigine = SL.RecupTabOrigine
' Test Cellule(1,1)
    MsgBox TableauOrigine(1, 1)
' Fin !
End Sub
' **************************************************************************************************
Public Function TrierCol(ByRef Tableau() As Variant, ByVal NumCol1 As Integer, ByVal Ordre As String) As Variant()
' Ont injecte "Dans le Module de Classe" le Tableau dans le module de classe avec le numéro de colonne a trié !
    SL.ajout(Tableau) = NumCol1
' **********************************************************************************************
' AUX CHOIX POUR L'ORDRE DE TRI CROISSANT OU DECROISSANT CI-DESSOUS !
' -------------------------------------------------------------------
If Ordre = "Crois" Then
' tri Croissant (Ordre = Crois) sur la Colonne (2 = NumCol1) du tableau
   TabCible = SL.triCroissant ' Tri du tableau Croissant (dans le module de classe)
Else
' tri DeCroissant (Ordre = DeCrois) sur la Colonne (2 = NumCol1) du tableau
   TabCible = SL.triDeCroissant ' Tri du tableau Croissant (dans le module de classe)
End If
' **********************************************************************************************
' retourner le "tableau résultat"
   TrierCol = TabCible
End Function

Le Module de Classe : SListe
VB:
Private cls_TabOrigine() As Variant ' Ici je conserve la structure du tableau d'origine
' Element de travail ci-dessous !
    Private cls_Tabtemp() As Variant  ' Ici j'effectu les modification de structure du tableau de tri
    Private cls_NumCol1 As Integer    ' Avec le numéro de colonne a trié !
Property Let ajout(ByRef Tableau() As Variant, ByVal NumCol1 As Integer)
    cls_Tabtemp = Tableau ' Le tableau 2 dimension dans le module de classe
    cls_NumCol1 = NumCol1 ' Le choix de la colonne de tri
' Option Je conserve la structure d'origine du tableau initial non modifié !
    cls_TabOrigine = Tableau
End Property
Property Get RecupTabOrigine() As Variant()
    RecupTabOrigine = cls_TabOrigine
End Property
Property Get triCroissant() As Variant()
' Tri la variable tableau
    Croissant cls_Tabtemp, cls_NumCol1, LBound(cls_Tabtemp, 1), UBound(cls_Tabtemp, 1)
' Renvois le Resultat dans le Module Standard
    triCroissant = cls_Tabtemp
End Property
Property Get triDeCroissant()
' Tri la variable tableau
    DeCroissant cls_Tabtemp, cls_NumCol1, LBound(cls_Tabtemp, 1), UBound(cls_Tabtemp, 1)
' Renvois le Resultat dans le Module Standard
    triDeCroissant = cls_Tabtemp
End Property
Private Sub Croissant(a() As Variant, colTri, gauc, droi)
' Tri "Croissant" d'un tableau (Array) à 2 dimensions
  ref = a((gauc + droi) \ 2, colTri)
  g = gauc: d = droi
  Do
' Pour un tri Croissant
    Do While a(g, colTri) < ref: g = g + 1: Loop
    Do While ref < a(d, colTri): d = d - 1: Loop
        If g <= d Then
           For k = LBound(a, 2) To UBound(a, 2)
             temp = a(g, k): a(g, k) = a(d, k): a(d, k) = temp
           Next k
           g = g + 1: d = d - 1
        End If
  Loop While g <= d
  If g < droi Then Call Croissant(a, colTri, g, droi)
  If gauc < d Then Call Croissant(a, colTri, gauc, d)
End Sub
Private Sub DeCroissant(a() As Variant, colTri, gauc, droi)
' Tri "DéCroissant" d'un tableau (Array) à 2 dimensions
  ref = a((gauc + droi) \ 2, colTri)
  g = gauc: d = droi
  Do
' Pour un tri DéCroissant
    Do While a(g, colTri) > ref: g = g + 1: Loop
    Do While ref > a(d, colTri): d = d - 1: Loop
        If g <= d Then
           For k = LBound(a, 2) To UBound(a, 2)
             temp = a(g, k): a(g, k) = a(d, k): a(d, k) = temp
           Next k
           g = g + 1: d = d - 1
        End If
  Loop While g <= d
  If g < droi Then Call DeCroissant(a, colTri, g, droi)
  If gauc < d Then Call DeCroissant(a, colTri, gauc, d)
End Sub

Ps : C'est Maintenant facile de faire un tri sur des multicolonnes ! une fois compris cela avec
Redim preserve (sur ce tableau y ajouter une colonne pour y faire une clef de concatenation et faire le tris sur cette colonne)
Comme redim preseve sera la derniere colonne reduire la taille de se tableaux avec
redim preserve -1 colonne la derniére

Laurent
 

Pièces jointes

  • Variable Tablea avec Module de classe tri Croissant decroissant.xlsm
    22.7 KB · Affichages: 6

laurent950

XLDnaute Barbatruc
Complément
Donc :
J'ai une variable tableau dans le module standard !
* Je choisie de faire un tri sur une colonne définit
* Aux Choix Croissant Ou Décroissant
* En Bonus je conserve aussi la structure de la variable tableau initial
Du Module standard vers le module de classe envois d'une variable Tableau 2 Dimension
* Cas d'école (je garde le tableau original que je stock dans mon module de classe)
Private cls_TabOrigine() As Variant / Variable privet au module de classe
* puis je stock le même tableau dans une autres variable du module de classe
Private cls_Tabtemp() As Variant
Nota c'est deux tableaux identique sauf qu'il n'ont pas la même adresse dans le Tas !

Je travail dans le module de classe avec se tableau cls_Tabtemp
* Donc Modifier et conservé dans le module de classe

Suite a cela deux Options :
* Ont récupère la variable tableau du module de classe Stoké dans le module standard.
dans sa totalité :
soit : Tableau = SL.triDeCroissant (C'est un exemple) voir le code !
* Ou lecture directement dans le module de classe les information stoké dans la Var tableau
soit : Debug.Print SL.ContenuVarTab(SL.triCroissant, i, j) voir le code !

* Le module Standard : ModuleStandard
VB:
' Appelle du Module de classe en public
Public SL As New SListe
Sub test()
' Mise en mémoire d'un tableau 2 dimensions
Dim Tableau() As Variant
    Tableau = Range(Cells(1, 1), Cells(17, 3))

' Maintenant l'interet du module de classe !
' ******************************************
' Ont injecte "Dans le Module de Classe"
' la Variable "Tableau" 2 dimension
' Le Numéro de la colonne a trié
' Decryptage SL.ajout("Tableau = la variable tableau") = "1 = le numéro de la colonne"
    SL.ajout(Tableau) = 1

' ********************************************************************************************************
' AUX CHOIX POUR L'ORDRE DE TRI CROISSANT OU DECROISSANT CI-DESSOUS !
' -------------------------------------------------------------------
' tri Croissant par appelle depuis le module de classe.
' Pour l'exemple je choisie tri DeCroissant donc je Bloc cette ligne !
' --------------->>>>   Tableau = SL.triCroissant

'' tri DeCroissant par appelle depuis le module de classe.
   Tableau = SL.triDeCroissant
'   Test de lecture pour Resultat de la case Ligne 1 Colonne 1 de la variable tableau trié.
    MsgBox Tableau(1, 1)
' Fin !

' *************************************************************************************************************
' NOTA : BONUS (J'ai conservé votre tableau Original avant toute modification dans le module de classe)
' Private cls_TabOrigine() As Variant / Ce tableau est privé a la classe et sera jamais modifié
' Exemple
        Tableau = SL.RecupTabOrigine
' Test Cellule(1,1)
    MsgBox Tableau(1, 1)
' Fin !
' *************************************************************************************************************
' Alors Voici tous l'interet du Module de Classe
' Qu'elle tableau je veux :
'    * Celui trié DeCroissant ?          / appel depuis le module de classe SL.triDeCroissant
        Tableau = SL.triDeCroissant
        MsgBox Tableau(1, 1)
'    * Ou celui d'origine !!             / appel depuis le module de classe SL.RecupTabOrigine
        Tableau = SL.RecupTabOrigine
        MsgBox Tableau(1, 1)
'    * Celui trié Croissant ?            / appel depuis le module de classe SL.triCroissant
        Tableau = SL.triCroissant
        MsgBox Tableau(1, 1)
' Nota La variable Tableau "Tableau" est unique est pas besoin de créer une autres variable tableau !
' *************************************************************************************************************
' Bonus Complementaire (sans avoir besoin de transfert de la variable tableau dans le module de classe)
' Lecture directemet depuis le module de classe chaque case du bableau (Contenu dans le module de classse)
' Aux Choix
Dim i As Long, j As Long
' ************************************************************************************************
' Le tableau d'origine ................. Soit : SL.RecupTabOrigine
For i = LBound(SL.RecupTabOrigine, 1) To UBound(SL.RecupTabOrigine, 1)
    For j = LBound(SL.RecupTabOrigine, 2) To UBound(SL.RecupTabOrigine, 2)
            Debug.Print SL.ContenuVarTab(SL.RecupTabOrigine, i, j)
    Next j
Next i
' ********************************************************************************************************
' Par ajout dans le module de classe ceci !
''' ---- >>  Property Get ContenuVarTab(ByRef Tabtemp() As Variant, ByRef i As Long, ByRef j As Long)
''' ---- >>     ContenuVarTab = Tabtemp(i, j)
''' ---- >>  End Property
' Qui permet les resultat si dessous
' ********************************************************************************************************
' Bonnus = Copie du tableau en Cells(5,1)
    Cells(1, 5).Resize(UBound(SL.RecupTabOrigine, 1), UBound(SL.RecupTabOrigine, 2)) = SL.RecupTabOrigine
' ************************************************************************************************
' Ou le tableaux trié en DeCroissant...... Soit : SL.triDeCroissant
For i = LBound(SL.triDeCroissant, 1) To UBound(SL.triDeCroissant, 1)
    For j = LBound(SL.triDeCroissant, 2) To UBound(SL.triDeCroissant, 2)
            Debug.Print SL.ContenuVarTab(SL.triDeCroissant, i, j)
    Next j
Next i
' Bonnus = Copie du tableau en Cells(5,1)
    Cells(1, 5).Resize(UBound(SL.triDeCroissant, 1), UBound(SL.triDeCroissant, 2)) = SL.triDeCroissant
' ************************************************************************************************
' Ou le tableau trié en Croissant..... Soit : SL.triCroissant
For i = LBound(SL.triCroissant, 1) To UBound(SL.triCroissant, 1)
    For j = LBound(SL.triCroissant, 2) To UBound(SL.triCroissant, 2)
            Debug.Print SL.ContenuVarTab(SL.triCroissant, i, j)
    Next j
Next i
' Bonnus = Copie du tableau en Cells(5,1)
    Cells(1, 5).Resize(UBound(SL.triCroissant, 1), UBound(SL.triCroissant, 2)) = SL.triCroissant
' ************************************************************************************************
End Property

Le Module de Classe : SListe
VB:
Private cls_TabOrigine() As Variant ' Ici je conserve la structure du tableau d'origine
' Element de travail ci-dessous !
    Private cls_Tabtemp() As Variant  ' Ici j'effectu les modification de structure du tableau de tri
    Private cls_NumCol1 As Integer    ' Avec le numéro de colonne a trié !
Property Let ajout(ByRef Tableau() As Variant, ByVal NumCol1 As Integer)
    cls_Tabtemp = Tableau ' Le tableau 2 dimension dans le module de classe
    cls_NumCol1 = NumCol1 ' Le choix de la colonne de tri
' Option Je conserve la structure d'origine du tableau initial non modifié !
    cls_TabOrigine = Tableau
End Property
Property Get RecupTabOrigine() As Variant()
    RecupTabOrigine = cls_TabOrigine
End Property
Property Get triCroissant() As Variant()
' Tri la variable tableau
    Croissant cls_Tabtemp, cls_NumCol1, LBound(cls_Tabtemp, 1), UBound(cls_Tabtemp, 1)
' Renvois le Resultat dans le Module Standard
    triCroissant = cls_Tabtemp
End Property
Property Get triDeCroissant() As Variant()
' Tri la variable tableau
    DeCroissant cls_Tabtemp, cls_NumCol1, LBound(cls_Tabtemp, 1), UBound(cls_Tabtemp, 1)
' Renvois le Resultat dans le Module Standard
    triDeCroissant = cls_Tabtemp
End Property
Property Get ContenuVarTab(ByRef Tabtemp() As Variant, ByRef i As Long, ByRef j As Long)
    ContenuVarTab = Tabtemp(i, j)
End Property
Private Sub Croissant(a() As Variant, colTri, gauc, droi)
' Tri "Croissant" d'un tableau (Array) à 2 dimensions
  ref = a((gauc + droi) \ 2, colTri)
  g = gauc: d = droi
  Do
' Pour un tri Croissant
    Do While a(g, colTri) < ref: g = g + 1: Loop
    Do While ref < a(d, colTri): d = d - 1: Loop
        If g <= d Then
           For k = LBound(a, 2) To UBound(a, 2)
             temp = a(g, k): a(g, k) = a(d, k): a(d, k) = temp
           Next k
           g = g + 1: d = d - 1
        End If
  Loop While g <= d
  If g < droi Then Call Croissant(a, colTri, g, droi)
  If gauc < d Then Call Croissant(a, colTri, gauc, d)
End Sub
Private Sub DeCroissant(a() As Variant, colTri, gauc, droi)
' Tri "DéCroissant" d'un tableau (Array) à 2 dimensions
  ref = a((gauc + droi) \ 2, colTri)
  g = gauc: d = droi
  Do
' Pour un tri DéCroissant
    Do While a(g, colTri) > ref: g = g + 1: Loop
    Do While ref > a(d, colTri): d = d - 1: Loop
        If g <= d Then
           For k = LBound(a, 2) To UBound(a, 2)
             temp = a(g, k): a(g, k) = a(d, k): a(d, k) = temp
           Next k
           g = g + 1: d = d - 1
        End If
  Loop While g <= d
  If g < droi Then Call DeCroissant(a, colTri, g, droi)
  If gauc < d Then Call DeCroissant(a, colTri, gauc, d)
End Sub

Pour info :

' Pour restitution de la variable tableau vers la feuille excel (en evitant les boucles) #Poste 13

Poste #34 Module de classe Poste (Redim preserve Variable tableau 2D)
 

Pièces jointes

  • Variable Tablea avec Module de classe tri Croissant decroissant Complements.xlsm
    22.7 KB · Affichages: 5
Dernière édition:

laurent950

XLDnaute Barbatruc
Module de Classe avec
Héritage entre classe :

Module de classe explication (Détaillé)

Module de Classe avec Heritage

Exemple :
ModuleDeClasse_Heritage (VBA Commente avec Exemple).xlsm

VB:
Sub test()
'1) Initialisé La Classe ModClasseA
Dim ModClsA As ModClasseA
    Set ModClsA = New ModClasseA

'2)
' Utilisé la fonction Init
' Se test est effectué pour remplir une Variable Tableau qui se trouve dans le ModClasseA
' Lorsque la fonction Renvois dans la classe ModClassB
'   ---->>> Pour le Test
'               - Je redimensionne le Tableu avec une Ligne suplémentaire
'                   * A Partir de la Classe ModClasseB
'               - Je Récupere le tableau de la Classe ModClasseA
'                   * Transfert de se tableau dans un Tableau Temporaire dans la Classe ModClasseB
'               - Je remplis la Ligne 2 de se tableau (Pour la colonne 1 et 2)
'                   * Maintenant le tableau TabTemp n'est plus le même que celuis du tableau ModClasseA
'                       + Le Tableau TabTemp du ModClasseB (Ligne 1 Vide sur 2 colonne et ligne 2 Remplis sur 2 Colonnes)
'                       + Le Tableau Cls_TabClsA du ModClasseA (Ligne 1 Vide sur 2 colonne et ligne 2 Vide sur 2 Colonnes)
'               - Il faut faire une Mise a Jour du tableau dans la Classe ModClasseA
'                   * Export du Tableau TabTemp vers le Tableau Cls_TabClsA la Classe ModClasseA
'
    ModClsA.Init

'3)
' Exercice Recuper la variable tableau dans le ModClasseA est affiché :
'   ---->>> Pour le Test
'               - Lire les valeurs de la Variable Tableau récupré "TabRecup" de la classe ModClasseA "Cls_TabClsA"
'                   * Directement A Partir de la Classe ModClasseA
'                   * Maintenant le tableau TabTemp n'est plus le même que celuis du tableau ModClasseA
'                       + Le Tableau Cls_TabClsA du ModClasseA (Ligne 1 Vide sur 2 colonne et ligne 2 Remplis sur 2 Colonnes)
'                           - Lignes 1 / Colonne 1 et Colonne 2 Vide
'                           - Lignes 2 / Colonne 1 "Dupont" et Colonne 2 "Bernard"
                                    Dim TabRecup() As Variant
                                        TabRecup = ModClsA.ExportTabClsA
                                            Debug.Print TabRecup(2, 1) ' Dupont
                                            Debug.Print TabRecup(2, 2) ' Bernard
'4)
' Pour le test Redimension d'une Ligne pour le tableau de la classe ModClasseA "Cls_TabClsA"
'   ---->>> Pour le Test
'               - Redimension du tableau (ajout d'une ligne depuis la classe ModClasseA)
                    ModClsA.RedimTabClsA = 1
                   
'5)
' Pour le test Transposer cette variable Tableau pour :
'   ---->>> Pour le Test
'               - Pour copier se tableau de la classe ModClasseA "Cls_TabClsA" vers excel
'                      * Transpose
                            TabRecup = Application.Transpose(TabRecup)
'                      * Copier Vers excel
                            Cells(2, 2).Resize(UBound(TabRecup, 1), UBound(TabRecup, 2)) = TabRecup
'6)
'Decharche la Variable Classe
    Set ModClsA = Nothing
' NB :
    ' Set ModClsB = Nothing pa Besoin car jamais initialisé (Passage par Le ModClasseA) pour se servir de la classe ModClasseB
End Sub
 

Pièces jointes

  • ModuleDeClasse_Heritage (VBA Commente avec Exemple).xlsm
    27.1 KB · Affichages: 5
Dernière édition:

laurent950

XLDnaute Barbatruc
Collection
Une collection est un objet de VBA qui permet de stocker différentes informations n'ayant pas forcément le même type.
Cet objet contient quatre méthodes qui permettent de le manipuler.
  • add : ajouter
  • item : récupérer
  • remove : supprimer
  • count : compter
Explication sur le site ci-dessous : (Intéressant avec les modules de Classe)

Nota :
si les noms d'arguments ne sont pas précisés, c'est l'inverse. Le 1er argument de la méthode Add de l'objet Collection est l'item obligatoire. Le 2nd la clé facultative.

********************************************************************************************************
Mode d'emplois : très détaillés Collections VS Array :
' Exemple fichier : VBA_Module-De-Classe-Avec_Gestion_Classe_Collections


********************************************************************************************************

Très bon exemple par @Dranreb
Résolu - XL 2019 - Afficher les noms des checkbox sélectionné dans une listbox | Page 2 | Excel-Downloads (excel-downloads.com)
Poste #11

********************************************************************************************************

En complément : Manipulations des tableaux

Target avec Union transfert vers variable tableau
Dim table As ListObject Set table = ActiveSheet.ListObjects.Add(sourceType:=xlSrcRange, Source:=rg, XlListObjectHasHeaders:=xlYes)

********************************************************************************************************


*******************************************************************************************************


*******************************************************************************************************


Quelques compléments intéressant aussi :
 

Pièces jointes

  • VBA_Module-De-Classe-Avec_Gestion_Classe_Collections.xlsm
    38.8 KB · Affichages: 13
Dernière édition:

laurent950

XLDnaute Barbatruc
Suite :
Héritage entre classe dans Collection

J'ai corriger est commenté le Code : Heritage et collection (A améliorer)


1607609875791.png


1607610152599.png


Ci-dessous Aide de @Dranred un grand Merci
Par définition dans un module objet quelque chose de Private ne saurait être une propriété, c'est interne au module.
Quant à ce qui est Public, c'est une propriété si c'est une variable, une Function dépourvue d'argument, une Property Get dépourvue d'argument ou une Property Let ou Set munie d'un seul argument. Dans les autre cas c'est une méthode.

idée : structure dans les Modules de classes

FAQ Visual Basic - Question 202 : Comment réaliser et utiliser un arbre binaire ? (free.fr)
 

Pièces jointes

  • Test Heritage Entre Classe et Collection.xlsm
    26.2 KB · Affichages: 12
Dernière édition:

laurent950

XLDnaute Barbatruc
Complément : (VBA)Tester si une variable tableau est d'une ou plusieurs dimension

Un autres exemple pour moi :
Fonction = test sur tableau Multidimensionnel (1D Ou 2D)

exemple avec Transpose : limite 65536 Cases (Contournement)
XL 2016 - VBA Application.Transpose résultat étrange | Excel-Downloads (excel-downloads.com)

VB:
Function NumberOfArrayDimensions(arr As Variant) As Integer
' https://stackoverflow.com/questions/24613101/vba-check-if-array-is-one-dimensional
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' NumberOfArrayDimensions
' This function returns the number of dimensions of an array. An unallocated dynamic array
' has 0 dimensions. This condition can also be tested with IsArrayEmpty.
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Dim Ndx As Integer
Dim Res As Integer
On Error Resume Next
' Loop, increasing the dimension index Ndx, until an error occurs.
' An error will occur when Ndx exceeds the number of dimension
' in the array. Return Ndx - 1.
    Do
        Ndx = Ndx + 1
        Res = UBound(arr, Ndx)
    Loop Until Err.Number <> 0
Err.Clear
NumberOfArrayDimensions = Ndx - 1
End Function
 

Dranreb

XLDnaute Barbatruc
Boujour et bonne année.
Oui, j'avais aussi déjà ça qui le donne, mais pour un tableau de Variant, pas pour un Variant contenant un tableau de Variant :
VB:
Function NbDimTV(T()) As Long
   Dim X As Long: On Error Resume Next
   Do: X = LBound(T, NbDimTV + 1): If Err Then Exit Function
      NbDimTV = NbDimTV + 1: Loop
   End Function
:
 

laurent950

XLDnaute Barbatruc
Pour moi
Test de suppression de doublons au moyen de la classe collection
Avec Module de classe pour Gestion de la variable Object Collection
Et Module de Classe de Tri de tableau avec le tableau initial conservé au besoin
 

Pièces jointes

  • Test Sup Doublon Collection et Module de Classe Tri.xlsm
    136.4 KB · Affichages: 10

Dranreb

XLDnaute Barbatruc
Bonsoir.
J'ai quelque chose qui ressemble à ce que vous décrivez: ma fonction Gigogne. Mais je la propose assez rarement parce qu'en général chaque fois que je donne une solution qui l'utilise, un autre intervenant vient dire qu'on peut arriver au même résultat avec Power Query.
 

laurent950

XLDnaute Barbatruc
Bonsoir @Dranred,
Je suis preneur de votre Fonction Gigogne, avec plaisir de voir comment vous l'avez créer. j'ai pour ma part remplacer Property let par Public Sub init "Dans mon module de classe". je suis vos idée au plaisir de voir voir Fonction Gigogne @Dranreb
 

Pièces jointes

  • V13.xlsm
    244.8 KB · Affichages: 10

laurent950

XLDnaute Barbatruc
Pour Moi :
Variable tableau d'objet (pour gestion de Multi sessions d'Excel)
Test sur une Variables Objet Vide ou Non Vide
Test sur une Variable qui contient un Objet.

VB:
Sub test()
' Ouverture d'Excel en Multi sessions selon condition à définir)
Dim ExclApp As Excel.Application
Dim ExclApp2 As Excel.Application
Dim GestionInstanceExclApp(0 To 1) As Excel.Application
' exemple
        Set ExclApp = CreateObject("Excel.Application")
        Set GestionInstanceExclApp(0) = ExclApp
        Set ExclApp2 = New Excel.Application
        Set GestionInstanceExclApp(1) = ExclApp2
        Set ExclApp = ExclApp2
'
' Vide l'objet (Pour Test)
Set GestionInstanceExclApp(0) = Nothing
' Test si l'objet et vide !
If GestionInstanceExclApp(0) Is Nothing Then
    MsgBox "La variable tableau case 0 ne contient pas d'objet donc vide"
End If
'
' Test Si c'est un objet :
If TypeOf GestionInstanceExclApp(1) Is Excel.Application Then
    MsgBox "La variable tableau case 1 contient un objet"
End If

End Sub
 

Discussions similaires

Réponses
29
Affichages
2 K

Statistiques des forums

Discussions
314 727
Messages
2 112 264
Membres
111 478
dernier inscrit
Excel_INFO