XL 2016 VBA Tableau de Tableaux - Syntaxe

Dudu2

XLDnaute Barbatruc
Bonjour,

Je n'y arrive pas, rien à faire.
Je veux créer un tableau de tabeaux de variants.
VB:
Sub a()
    Dim t1() As Variant
   
    ReDim t1(1 To 2)
    redim t1(1) (1 to 3, 1 to 1) <- Syntaxe en erreur !
End Sub

Edit: la seule manière que j'ai trouvée de le faire c'est d'affecter un Range:
VB:
t1(1) = ActiveSheet.Range("A1:A3").Value
Mais c'est un pis aller nullissime.
Merci pour l'aide.
 
Dernière édition:
Solution
Re

Solution Bis sans la gestion les erreurs mais en passant par un tableau Temporaire.

VB:
Sub a()
    Dim t1() As Variant
        ReDim t1(1 To 2)
    ' Redimension de la premiére case du tableau t1(1)
    ' ReDim t1(1).t(1 To 3, 1 To 1)
    Dim Ttemp() As Variant
        ReDim Ttemp(1 To 3, 1 To 1)
    ' Methode ci-dessous
        t1(1) = Ttemp
        Erase Ttemp
        ' il n y a plus l' Erreur 2015 "Pour chaque case a la creation de" : t1(1)(1, 1) / t1(1)(2, 1) / t1(1)(2, 1)
        ' Donc lorsque l'on remplis c'est même case c'est correcte : les cases sont vide
        ' Voir ci dessous
            t1(1)(1, 1) = "Case1"
            t1(1)(2, 1) = "Case2"
            t1(1)(3, 1) = "Case3"
        ' Le tableau de tabeaux de...

Efgé

XLDnaute Barbatruc
Re
Si je comprend la fonction PutIntoDictionary, c'est moins le cas de GetFromDictionary.
Si tu veux utiliser un objet encapsulé dans un dico ou un tableau de valeur D(ID) suffit.
On peux dire Chose = Dic(ID) par exemple pour créer un tableau indépendant du dico mais je ne vois pas l'utilisation de Set Chose = Dic(ID) . On ne peux pas, à mon avis, créer un objet... Dans le cas présent cela ne serte qu'a alouer une variable object qui existe déjà : Dic(ID)

Dans quel contexte utilises-tu cette fonction ?

Cordialement
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Quand je mets et Set Chose = Dic(ID) (Chose est passé ByRef) je rends l'objet stocké préalablement sous cet ID. Ce peut être un Range une Shape ou tout autre objet.

J'utilise ça dans un petit utilitaire que je me suis fait pour échanger des valeurs ou des objets entre UserForm et programme utilisant le UserForm pour éviter de manipuler des variables globales qui peuvent être plus ou moins nombreuses selon le cas.
 

Pièces jointes

  • VBA UserFormInterface.xlsm
    21.4 KB · Affichages: 4

laurent950

XLDnaute Accro
Bonsoir @Efgé
Mais on perd, évidemment, la notion de boucle LBound - UBound

Concernant la notion de boucle, solution ci-dessous avec le Modèle Objet

Votre code est super (En Poste #16) Merci Efgé pour l'idée qui complète cette discussion

VB:
Sub DicoMultiTab()
Dim i&, J&
Dim D As Object, Sh As Worksheet

Set D = CreateObject("Scripting.dictionary")

For Each Sh In ThisWorkbook.Worksheets
    i = i + 1
    Set D(i) = Sh.UsedRange
Next Sh

' Lecture Pour D(1) concernant la plage de valeur
Dim Temp As Range
    Set Temp = D.Item(1)
Debug.Print Temp.Value2(2, 1)

' Interpretation de la notion de Boucle ci-dessous.
Dim Rgn As Range
For i = 1 To D.Count
    Set Rgn = D.Item(i)
    For J = LBound(Rgn.Value2, 1) To UBound(Rgn.Value2, 1)
        For k = LBound(Rgn.Value2, 2) To UBound(Rgn.Value2, 2)
            Debug.Print Rgn.Value2(J, k)
        Next k
    Next J
Next i
End Sub
 

Efgé

XLDnaute Barbatruc
Re
@laurent950
Si on met les ranges dans le dico, il est inutile de passer par un range temporaire pour boucler dessus.
La clé i est un range en elle même.
VB:
Sub DicoMultiTabRange()
Dim i&, J&
Dim D As Object, Sh As Worksheet

Set D = CreateObject("Scripting.dictionary")

For Each Sh In ThisWorkbook.Worksheets
    i = i + 1
    Set D(i) = Sh.UsedRange
Next Sh

Debug.Print D(1)(1, 2)

For i = LBound(D(2).Value, 1) To UBound(D(2).Value, 1)
    For J = LBound(D(2).Value, 2) To UBound(D(2).Value, 2)
        Debug.Print D(2)(i, J)
    Next J
Next i

End Sub

Par contre cette méthode doit être plus longue en traitement sur de grandes zones puisqu'on balaie la feuille et non un tableau en mémoire.

Cordialement
 

dysorthographie

XLDnaute Accro
VB:
Sub test()
Dim Dico As Object, Dico2 As Object, Dico3 As Object
Set Dico = CreateObject("Scripting.dictionary")
Set Dico2 = CreateObject("Scripting.dictionary")
Set Dico3 = CreateObject("Scripting.dictionary")
    For i = 1 To Sheets.Count
    Dico.Add i, Sheets(i).UsedRange 'Avec Add on instencie l'objet range
    Set Dico2(i) = Sheets(i).UsedRange   'ici on instencie bien un objet range
    Dico3(i) = Sheets(i).UsedRange   'comme ceci on a Variant()
    Debug.Print TypeName(Dico(i)), TypeName(Dico2(i)), , TypeName(Dico3(i))
    Next

End Sub
 

Discussions similaires

Réponses
12
Affichages
240

Statistiques des forums

Discussions
312 036
Messages
2 084 812
Membres
102 676
dernier inscrit
LN6