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:

patricktoulon

XLDnaute Barbatruc
Bonjour
le test isarray !!!!!! il sert a quoi ;)
et si la variable est dimensionnée a empty par dim mavariable()
il te faut donc une fonction qui prevoit 2 tests

un truc du genre
if isarray(maraviable) then
if ubound(mavriable)>0 then x=true
else x=false
end if

tu pourrait même tester le ubound(mavariable,2) aussi pourquoi pas
 

laurent950

XLDnaute Barbatruc
Bonjour @patricktoulon

Complément en Poste #30 (Savoir si un tableau de chaine a était dimensionné ?)

J'ai trouvé ce code pour Tester si une variable tableau n'a jamais était dimensionné :

Si la Variable tableau n'a jamais était dimensionné, Alors je rentre dans la condition de l'Erreur :
* Ensuite :
° Je peux la dimensionné comme je veux cette variable Tableau.
° Ou ne pas la dimensionné est renvoyer une variable Boolean (Pour dire que le test est vrai)
° Code ci-dessous
VB:
Dim Tbl() As Variant
Sub maprocedure()
' Savoir si un tableau de chaine a était dimensionné ?
'   ° Test avec une variable tableau "Tbl()" de Type Variant non dimensionné
'
Dim i As Integer
On Error Resume Next
    i = LBound(Tbl)
        If Err.Number = 9 Then
            ' Dimensionné ce Tableau "Tbl" Pour Exemple [En Tableau 1D]
            ' Avec sont premier élément à l'indice zéro
            ReDim Tbl(0)
            Tbl(0) = "Avec sont premier élément à l'indice zéro"
        End If
On Error GoTo 0
MsgBox Tbl(0)
End Sub

Avec ce test :
L'indice n'appartient pas a la séléction [ If UBound(Tbl) > 0 Then ]

Code:
Dim Tbl() As Variant
Sub Test()
If IsArray(Tbl) Then
If UBound(Tbl) > 0 Then x = True
Else: x = False
End If
End Sub

Merci @patricktoulon

Laurent
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
tu devrais retrouver ma discussion sur tester type de tableau qui est récente
j'ai trouver une méthode pour déterminer si (dimentionnée et combien de ligne/colonne) et quel type de tableau
edit : retrouvée
 

laurent950

XLDnaute Barbatruc
Pour Moi,

Lorsque le tableau est vidé dans une boucle avec Erase
Dim Tbl() As Variant
ReDim Tbl(1 To 2) As Variant
Erase Tbl

VB:
Sub maprocedure()
' Test pour savoir si un tableau est non dimensionné ?
'
Dim Tbl() As Variant
Dim i As Integer
On Error Resume Next
    i = UBound(Tbl)
        If Err.Number <> 0 Then
        [ °°°° Code °°°°]
            MsgBox "Variable tableau vide = True"
        [ °°°° Code °°°°]
        Else
        [ °°°° Code °°°°]
            MsgBox "Variable tableau vide = false"
        [ °°°° Code °°°°]
        End If
On Error GoTo 0
End Sub
 

Discussions similaires

Réponses
29
Affichages
1 K

Statistiques des forums

Discussions
314 422
Messages
2 109 447
Membres
110 482
dernier inscrit
ilyxxxh