VBA redim de tableau

Hervé

XLDnaute Barbatruc
Bonjour tout le monde :)

J'ai un petit souci pour redimensionner des tableaux, je m'explique

je cherche à faire un tableau dynamique contenant d'autres tableaux.

a travers une boucle je voudrais rajouter une colonne à chaque tableau secondaire du tableau principal.

Mais je ne dois pas avoir la bonne syntaxe.

voici mon code simplifié à l'extreme :


Sub Bouton1_QuandClic()
Dim tablo1()
Dim tablo2()
Dim tabloS(1 To 2)
Dim i As Byte

'initialisation des tableaux secondaires
tablo1 = Range('a1:a20')
tablo2 = Range('b1:b20')

'initialisation du tableau principal
tabloS(1) = tablo1
tabloS(2) = tablo2

'syntaxe correct mais à integrer à une boucle
ReDim Preserve tablo1(1 To UBound(tablo1), 1 To 2)

'boucle sur chaque tableau pour rajouter une colonne
For i = 1 To UBound(tabloS)
redim preserve tabloS(i)(1 to ubound(tabloS(i)),1 to 2)
'MAUVAISE SYNTAXE
Next i


End Sub


la ligne en défaut est celle ci :

redim preserve tabloS(i)(1 to ubound(tabloS(i)),1 to 2)'MAUVAISE SYNTAXE

auriez vous une petite idée pour cette syntaxe.

d'avance je vous en remercie.

salut

Message édité par: hervé, à: 24/01/2006 10:39
 

Jam

XLDnaute Accro
Salut Hervé,

Bah qu'est-ce qu'y t'arrive, toi, avoir du mal avec des tableaux :)

Bon, ça fait longtemps que j'ai pas jonglé avec les tableaux donc pas une soluce mais une direction:
TabloS() a 2 dimension cf ton Dim. C'est donc cette dimension que tu dois redimensionner. Or là c'est la dimension elle-même que tu cherche à dimensionner. Donc t'a un problème. En fait tu attribu à un élément de ton tableau TabloS(1) un Range, puis au second TabloS(2) un autre Range. En fait tu n'as pas besoin de redimensionner TabloS(1 to 2) mais Tablo1() et Tablo2().

Je sais pas si j'ai été très clair - ou si je n'ai pas bien saisi ce que tu voulais faire - mais j'espère tout de même que cela t'aidera.

Bon courage
 

Hervé

XLDnaute Barbatruc
bonjour messieurs :)

Merci de vous intéresser à mon sujet.

oui pascal c'est bien la 2ème dimension que je redimensionner à travers ce code :

1 to ubound(tabloS(i)),1 to 2

Bien d'accord avec toi jam c'est bien tablo1 et 2 que je veux redimensionné (tabloS n'a qu'une seule dimension).

En somme, je suis bien d'accord avec vos conclusions, mais vous n’auriez pas une petite solution sous la main, pour aider un petit gars dans la mouise ?

Ou, dois-je rester tout ma vie avec cette question existentielle : Comment qu’on fait le vba pour redim ces p....n de tablo.

A moins que ce ne soit pas possible ?

salut :)
 

dg62

XLDnaute Barbatruc
Bonjour hervé, jam, pascal


Note Lorsque vous utilisez le mot clé Preserve avec un tableau dynamique, vous pouvez uniquement modifier la limite supérieure de la dernière dimension, et non le nombre de dimensions.

je crois bien que ce soit impossible
 

myDearFriend!

XLDnaute Barbatruc
Bonsoir Hervé, Pascal76, Jam, dg62,

Pour ma part, je pense que ta procédure est tout à fait exploitable Hervé. Ton intention me paraît tout à fait conforme à ce que VBA est capable de gérer, à savoir, le redimensionnement de la dernière dimension de tes 2 'sous-tableaux'.

Ci-dessous 2 solutions qui devraient pouvoir contourner cet unique problème de syntaxe.

La première solution utilise un simple Tableau Variant intermédiaire (TabTemp :) ) :

Sub Bouton1_QuandClic()
Dim tablo1(), tablo2(), tabloS(1 To 2)
Dim TabTemp
Dim i As Byte

      'initialisation des tableaux secondaires
      tablo1 = Range('a1:a20')
      tablo2 = Range('b1:b20')
     
      'initialisation du tableau principal
      tabloS(1) = tablo1
      tabloS(2) = tablo2
     
      'boucle sur chaque tableau pour rajouter une colonne
      For i = 1 To UBound(tabloS)
            TabTemp = tabloS(i)
            ReDim Preserve TabTemp(1 To UBound(TabTemp, 1), 1 To 2)
            tabloS(i) = TabTemp
      Next i
End Sub
La deuxième solution, marche selon le même principe puisqu'elle consiste à passer le tableau 'indicé' en argument par référence à une procédure chargée du redimensionnement des tableaux :
Sub Bouton1_QuandClic()
Dim tablo1(), tablo2(), tabloS(1 To 2)
Dim i As Byte

      'initialisation des tableaux secondaires
      tablo1 = Range('a1:a20')
      tablo2 = Range('b1:b20')
     
      'initialisation du tableau principal
      tabloS(1) = tablo1
      tabloS(2) = tablo2

      'boucle sur chaque tableau pour rajouter une colonne
      For i = 1 To UBound(tabloS)
            RedimensionneTab tabloS(i)
      Next i

End Sub

Sub RedimensionneTab(ByRef T)
      ReDim Preserve T(1 To UBound(T, 1), 1 To 2)
End Sub
Par ailleurs, l'utilisation de Option Base 1 en entête de module simplifierait sans doute la syntaxe davantage...

Cordialement,

PS : Hervé, .... MDR pour 'TabloS' ! :p
 

Hervé

XLDnaute Barbatruc
salut didier :)


purée, que tout devient simple quand on vois ta soluce.

Admiratif

je vais opter pour la soluce sous routine, plus fun :) :)

merci l'ami

salut

PS : j'espère bien qu'il t'a fait rire mon TabloS, c'etait son seul but.

dans mon code, je te rassure, j'utilise mon bon vieux tablores :) :) :)
 

Discussions similaires

Réponses
11
Affichages
292
Réponses
12
Affichages
250

Statistiques des forums

Discussions
312 215
Messages
2 086 329
Membres
103 183
dernier inscrit
karelhu35