Variabiliser Nom tableau array : Tab1, Tab2... = Tab & i ?

Charly88

XLDnaute Occasionnel
Bonjour, est-il techniquement possible de "variabiliser des noms de variables" ?

Après avoir défini ma liste de tableau, Dim Tab1, Tab2, etc, jusqu'à Tab49 dans mon cas précis. Je souhaiterais pouvoir les utiliser facilement dans une boucle avec un "tab" + i ; connaissez-vous une quelconque solution ?

Merci d'avance pour toute piste, cela me simplifierait grandement le code.
 

Charly88

XLDnaute Occasionnel
Re : Variabiliser Nom tableau array : Tab1, Tab2... = Tab & i ?

Bonjour Pierrot,
Je ne souhaite pas atteindre des données d'un tableau unique mais de plusieurs tableaux (à 2 dimensions).
Très concrètement, j'ai 49 pages de données avec un format commun, j'aimerais les charger en mémoire au départ puis les utiliser à ma guise.

Je suis plutôt dans l'idée :
"Tab" & i (y, z) = donnée
Sauf que bien entendu, la syntaxe ne fonctionne pas.
 

Efgé

XLDnaute Barbatruc
Re : Variabiliser Nom tableau array : Tab1, Tab2... = Tab & i ?

Bonjour Charly88, Salut Pierrot :)
On ne peux pas, à ma connaissance, variabiliser les noms de tableaux comme tu l'essaye.
Parcontre le tableau à trois dimentions se justifie dans ce cas:
VB:
'49 tableaux de 25 lignes sur 30 colonnes
Dim TGeneral(1 To 49, 1 To 25, 1 To 30)
'Remplissage de la cellule ligne 1 colonne 3 du tableau 27
TGeneral(27, 1, 3) = "Toto"
Cordialement

EDIT Bonjour Chti160
 
Dernière édition:

Charly88

XLDnaute Occasionnel
Re : Variabiliser Nom tableau array : Tab1, Tab2... = Tab & i ?

Merci à tous pour votre aide. Au minimum, un ami vient de me donner une solution de contournement par une fonction mais ta solution Efgé me paraît particulièrement "élégante".
J'ai eu tellement de mal à maîtriser les 2 dimensions au départ que je n'ai jamais vraiment perçu quel pouvait être l'intérêt de dimensions supplémentaires, là cela paraît tout d'un coup évident.
 

ROGER2327

XLDnaute Barbatruc
Re : Variabiliser Nom tableau array : Tab1, Tab2... = Tab & i ?

Bonjour à tous.


Il est très facile d'indexer une famille de tableaux : il suffit de créer un tableau dont les éléments sont eux-mêmes les tableaux qu'on veut indexer.

Exemple :​
VB:
Sub toto()
Dim i&, temp(), v()

'1. création d'un tableau vide v :

    v = Array()
    
'2. dimensionnement du tableau v :

    ReDim v(1 To 4)

'À ce stade on a un tableau à quatre éléments v(1), v(2), v(3) et v(4) , tous vides.
'On peut alors définir ces éléments comme étant des tableaux, de dimension qu'on voudra.
'
'Par exemple, définition de tableaux de dimension 2 à nombres de lignes et de colonnes aléatoires de 1 à 6.

    For i = 1 To 4
        ReDim temp(1 To 1 + 5 * Rnd, 1 To 1 + 5 * Rnd)
        v(i) = temp
    Next i

'On peut dès lors faire appel à chacun de ces tableaux par v(i), 0<i<5.

End Sub
En mettant un point d'arrêt sur la ligne
Code:
End Sub
de ce code avant de l'exécuter, on verra que le tableau v a pour éléments des tableaux v(1), v(2), v(3) et v(4).

Dans le classeur joint, on verra comment indexer des tableaux figurant dans les différentes feuilles grâce à la procédure tutu :​
VB:
Sub tutu()
Dim i&, j&, k&, temp(), v(), x, ref()

'1. création d'un tableau vide v :

    v = Array()
    
'2. dimensionnement du tableau v :

    ReDim v(1 To 5)

'À ce stade on a un tableau à cinq éléments v(1), v(2), v(3), v(4) et v(5) , tous vides.
'On peut alors définir ces éléments comme étant des tableaux, de dimension qu'on voudra.
'
'Par exemple, définition des tableaux par le contenu des feuilles 1 à 5 .

    For i = 1 To 5
        With Sheets(i).Cells(1, 1).CurrentRegion
            ReDim temp(1 To .Rows.Count, 1 To .Columns.Count)
            If .Count = 1 Then
                If IsEmpty(.Cells(1, 1)) Then Exit For Else temp(1, 1) = .Cells.Value
            Else
                temp = .Cells.Value
            End If
            v(i) = temp
        End With
    Next i

'On peut dès lors faire appel à chacun de ces tableaux par v(i), 0<i<6.
'Par exemple, lecture des éléments des éventuels tableaux des feuilles 2, 4 et 5 :

    ref = Array(2, 4, 5)
    For i = 0 To UBound(ref)
        x = v(ref(i))
        If VarType(x) >= vbArray Then
            For j = 1 To UBound(x, 1): For k = 1 To UBound(x, 2)
                MsgBox Sheets(ref(i)).Name & "!" & Cells(j, k).Address(0, 0) & " : " & vbLf & vbLf & x(j, k)
            Next k, j
        Else
            MsgBox "Pas de tableau dans la feuille " & ref(i) & " !"
        End If
    Next

End Sub


Bonne journée.


ROGER2327
#6673


Mercredi 11 Gidouille 140 (Sacre de Talou VII, empereur du Ponukélé - fête Suprême Quarte)
7 Messidor An CCXXI, 4,8291h - concombre
2013-W26-2T11:35:23Z
 

Pièces jointes

  • XLD_207703_Tableaux indexés.xlsm
    20.2 KB · Affichages: 24
Dernière édition:

Statistiques des forums

Discussions
312 169
Messages
2 085 911
Membres
103 033
dernier inscrit
thazet