XL 2016 VBA - Comment pouvoir traiter normalement une structure perso

Dudu2

XLDnaute Barbatruc
Bonjour,
Avec Excel VBA on ne peut pas passer une structure utilisateur en argument d'une fonction ni en faire un retour de fonction.
Y a-t-il un moyen ? En faire une classe ?
VB:
Private Type TabAreas
    TabValues() As Variant
End Type

Dim TabAreasVal() As TabAreas
 
Dernière édition:
Solution
Bonjour,
ThisWorbook est un module de classe pas un module standard !
Code:
set wb=ThisWorbook

Par conséquent tu n'as pas accès à tous ce qui est privé.

Il est vrai que tout ce qui est privé devrait être accessible de l'intérieur du module de classe mais c'est comme ça !

Notes également que tout ce qui est privé dans un module standard n'est pas viable d'un autre monde !

dysorthographie

XLDnaute Accro
dans un module standard!
VB:
Type TabAreas
    TabValues() As Variant
End Type
dans ThisWorbook
Code:
Dim TabAreasVal() As TabAreas
Function test(V() As TabAreas, I As Integer) As TabAreas()
ReDim Preserve V(I)
ReDim Preserve V(I).TabValues(I)
test = V()
End Function

Sub Test1()
Dim A() As TabAreas, I As Integer
For I = 0 To 10
 A() = test(TabAreasVal(), I)
Next
End Sub
 

Dudu2

XLDnaute Barbatruc
@Dranreb...
je ne sais pas exploiter la fonction AdrZonVal,
Je ne comprends pas ce que représente cet Array(R.Address(External:=True), ZonVal(R))
je ne comprends pas lé récursivité à l'infini dans la fonction ZonVal.
Bref, je ne comprends absolument pas ton code.
 

Dranreb

XLDnaute Barbatruc
Vous disiez bien que dans votre structure vous vouliez peut être l'adresse du Range en plus de ses valeurs, n'est-ce pas.
Et bien AdrZonVal renvoie dans un Array à 2 éléments, 0 et 1, la dite adresse puis les valeurs.
Il n'y a guère de récursivité la dedans mais c'est vrai que AdrZonVal(1) contient un ZonVal, qui lui même est un tableau des Areas dont chaque poste contient les valeur de la plage. C'est simple, pas besoin de Type ni de Classe pour ranger ça où vous voulez.
 

laurent950

XLDnaute Accro
Bonsoir @Dudu2, @Dranreb

Exemple :
Nom de fichier + Onglet + Address
"[KO.xlsm]Feuil1!$A$1:$B$2" Pour R.Address(External:=True)

Vous êtes vraiment très très fort @Dranreb Super votre code et encore Hyper efficace comme toujours

1630005392181.png


Laurent
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Ok, si j'arrive maintenant à exploiter AdrZonVal() pour en extraire l'adresse et les valeurs des Areas, je ne comprends toujours pas ton code.
Question 1: Dans un Array on peut donc avoir des éléments de nature différente, des pommes et des carottes. Correct ?
Si la réponse est oui, je n'ai jamais deviner ça à la lecture de la doc.
 

laurent950

XLDnaute Accro
Re,
C'est un exemple @Dranreb à fait un super code
AdrZonVal = Array(R.Address(External:=True), ZonVal(R))
C'est un tableau "AdrZonVal" 1 dimension qui contient 2 Cases la Case 0 et La case 1
Dans la Case 0 du tableau @Dranreb (Va chercher l'adresse et la stocke dans cette case 0)
soit mon exemple : "[KO.xlsm]Feuil1!$A$1:$B$2"
Dans la case 1 du tableau @Dranreb (Va chercher la plage de valeurs et la stock dans cette case 1)
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Si, elle retourne l'argument 1 crée par la Sub CréerZonVal
Je fais souvent comme ça pour éviter un tableau interne qu'il faudrait affecter à la fonction à la fin, et ça peut toujours servir à créer le tableau différemment si on a besoin de le conserver, directement avec la Sub CréerZonVal
 

Dudu2

XLDnaute Barbatruc
@laurent950,
J'ai compris comment exploiter ce qu'a fait @Dranreb.
VB:
Sub a()
    Dim t() As Variant
    Dim tt() As Variant
    Dim ttt() As Variant
    Dim i As Integer
    
    t = AdrRangeVal(Selection)
    MsgBox t(0)
    tt = t(1)
    'MsgBox UBound(tt, 1)
    For i = 1 To UBound(tt, 1)
        ttt = tt(i)
        MsgBox UBound(ttt, 1) & " " & UBound(ttt, 2)
    Next i
End Sub

Ce que je n'ai pas compris c'est son code.
Si toi tu l'as compris c'est parfait. Mais moi j'essaie sinon ça sert à rien d'avoir une réponse qu'on ne comprends pas. Maintenant je n'ai peut-être pas la capacité à le comprendre !
 

laurent950

XLDnaute Accro
Re pour @Dudu2

R c'est le range
Dans la case 0 du tableau on Range l'adresse : R.Address(External:=True)
Dans la case 1 du tableau on Range les valeurs de la plage l'adresse : R.Value)
soit
MsgBox AdrZonVal(0) ' "[KO.xlsm]Feuil1!$C$7:$D$8"
MsgBox AdrZonVal(1)(1, 1) ' "C7"
MsgBox AdrZonVal(1)(2, 2) ' "D8"

1630007107052.png


VB:
Sub Test()
Dim AdrZonVal As Variant
Dim R As Range
 Set R = Range("C7:D8")
    AdrZonVal = Array(R.Address(External:=True), R.Value)
    MsgBox AdrZonVal(0)       ' "[KO.xlsm]Feuil1!$C$7:$D$8"
    MsgBox AdrZonVal(1)(1, 1) ' "C7"
    MsgBox AdrZonVal(1)(2, 2) ' "D8"
End Sub

@Dranreb est hyper fort et super efficace, c'est code son extra mais quand on a compris on comprend les autres codes avec une grande facilité

Félicitation @Dranreb

1630006453931.png
 
Dernière édition:

Discussions similaires

Réponses
3
Affichages
290
Réponses
2
Affichages
452

Statistiques des forums

Discussions
312 466
Messages
2 088 675
Membres
103 917
dernier inscrit
skullym