XL 2013 Redim Preserve Variable Tableau Emboité = Erreur 9 (Indice hors plage)

laurent950

XLDnaute Accro
Bonsoir,
Ps : Pefixe Excel 2013 (Mais ce code est compatible toutes version Excel)
En Détaillant la problématique ci dessous :
* J'ai juste une ligne de code que je n'arrive pas à faire fonctionner.
' Indice hors plage (Erreur 9) --- Essayer de d'ajouter une colonne suplémentaire directement !
ReDim Preserve Cls_TabBase(LBound(TabBase(i), 1) To UBound(TabBase(i), 1), LBound(TabBase(i), 2) To UBound(TabBase(i), 2) + 1)
' Solution pour contourner se probléme :

TabTemp = TabBase(i)
ReDim Preserve TabTemp(LBound(TabTemp, 1) To UBound(TabTemp, 1), LBound(TabTemp, 2) To UBound(TabTemp, 2) + 1)
TabBase(i) = TabTemp

' Pour Voir l'anomalie et l'erreur dans le code :
Décoché la ligne en Rouge pour voir la ligne d'arret du code Bug erreur 9
ReDim Preserve Cls_TabBase(LBound(TabBase(i), 1) To UBound(TabBase(i), 1), LBound(TabBase(i), 2) To UBound(TabBase(i), 2) + 1)
ps : Elle est coché volontairement dans le code pour monter que cela fonctionne avec la solution de contournement.

' J'ai détailler tous le processe ci-dessous ! ainsi que le code que j'ai documenté.

' Ci-vous avez une idée avec un grand plaisir car je suis bloqué ici sur cette ligne qui devrait fonctionner !

VB:
Option Base 1
Sub test()
Dim TabBase() As Variant
Dim TabTemp() As Variant
' Base et resultat
    ' Tableau 1 dimension de 57 Case "FiXE" = Aux 57 --> Index
        ' Dimension 1 Case (Avec Option Base 1) pour commencer à 1
            ReDim TabBase(1)
' Suite a cela je fais une boucle pour le nombre de colonne à Remplire (Soit 57)
    For i = 1 To 57
    ' Ici je m'arrete a la colonne Numéro 3 pour test (Ensuite je sort de la procédure for)
    If i > 3 Then Exit For
        ' Le but :
        '   Chacune de ces 57 Colonnes contiennent des nombres :
        '       * Chacune de ces colonnes ne sont pas de longeur fixe :
        '           * Exemple la colonne 1 = B aura par exemple 488 Lignes / Donc ligne 15  à 503
        '           * Exemple la colonne 2 = C aura par exemple 466 Lignes / Donc Ligne 37  à 503
        '           * Exemple la colonne 3 = D aura par exemple 377 Lignes / Donc Ligne 126 à 503
' le soucis = Une deuxiéme plage à récupérer
'       ' Explication = il y a une date pour chacunes des valeurs :
'       '   * Soit l'exemple ci-dessus :
'       '       * Exemple la colonne 1 = B aura par exemple 488 Lignes / Donc ligne 15  à 503
'       '           * deux plages :
'       '               '   Colonne A qui contient les dates et donc :
'       '               '   Plage aura date   488 Lignes / Donc ligne 15  à
'       '               '   Plage aura Valeur 488 Lignes / Donc ligne 15  à 503
' *****************************************************************************************************
'       '       * Exemple la colonne 2 = C aura par exemple 466 Lignes / Donc Ligne 37  à 503
'       '           * Même procéder que ci-dessus.
'******************************************************************************************************
' Suite du code
        ' Du haut Colone 1 = B pour i (Ligne 2) descente vers le bas (Premiere non vide = Depart du tableau)
            pr = Cells(Cells(2, i + 1).End(xlDown).Row, i + 1).Row
        ' Je consigne la premiere colonne comme l'exemple ci-dessus (Pour les dates) / Tojours la colonne 1
            TabBase(i) = Range(Cells(pr, 1), Cells(503, 1)) ' pr premiere non vide ligne 15
        ' ça y est j'ai mon premier tableau 2 dimension dans ma variable tableau 1 dimension
        '   Variable tableau 1 Dimension soit : TabBase
        '   Variable tableau 2 Dimension soit : TabBase(i)(1)
        ' A présent je veux Créer une seconde colonne de mon tableau 2 dimension (Pour y ajouter les valeurs)
        ' Donc
        ' avec redim preserve je vais y ajouter une colonne suplémentaire (Pour en avoir 2) au lieux d'une seule
        ' Pour Info
        ' debug.print LBound(TabBase)       / La premiere ligne   de mon tableau 1 dimension
        ' debug.print UBound(TabBase)       / La derniere ligne   de mon tableau 2 dimension
        ' debug.print LBound(TabBase(i), 1) / La premiere ligne   de mon tableau 2 dimension
        ' debug.print UBound(TabBase(i), 1) / La derniere ligne   de mon tableau 2 dimension
        ' debug.print LBound(TabBase(i), 2) / La premiere colonne de mon tableau 2 dimension
        ' debug.print UBound(TabBase(i), 2) / La derniere colonne de mon tableau 2 dimension
      
        ' Indice hors plage (Erreur 9) --- Essayer de d'ajouter une colonne suplémentaire directement !

' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'
'                     CORRECTION : REDIM PRESERVE VARIABLE TABLEAU EMBOITE / Indice hors plage (Erreur 9)
'                     ReDim Preserve TabBase
'
'   ReDim Preserve TabBase(LBound(TabBase(i), 1) To UBound(TabBase(i), 1), LBound(TabBase(i), 2) To UBound(TabBase(i), 2) + 1)
'
' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

        ' Solution transitoire à évité avec la ligne de code ci-dessus à faire fonctionner
        ' En attente ! Astuce de transfert
          
            TabTemp = TabBase(i)
            ReDim Preserve TabTemp(LBound(TabTemp, 1) To UBound(TabTemp, 1), LBound(TabTemp, 2) To UBound(TabTemp, 2) + 1)
            TabBase(i) = TabTemp
        ' Fin du transfert et l'ajout de la colonne suplémentaire
        ' Suite du code ci-dessous
        '   Etape pour Remplire la variable tableau (de la colone ajouté)
                For j = LBound(TabBase(i), 1) To UBound(TabBase(i), 1)
                    TabBase(i)(j, 2) = Cells(j + (pr - 1), i + 1)
                Next j
        ' Fin de remplissage du tableau 2 dimenssion avec respectivement :
        '   ' Une colonne date
        '   ' La colonne créer (En Attente d'astuce) avec les valeurs ajouté
        ' Création d'une nouvelle case du Tableau 1 dimension pour :
        '   * repeter les opération ci-dessus pour les 56 colonnes restantes (Respectivement avec les dates)
        ' Utilisation de Redim Preseve pour ajouter une nouvelle case a cette variable tableau
                ReDim Preserve TabBase(UBound(TabBase) + 1)
    Next i

' Suppression de la derniere case du tableau 1 dimension inutile
    ReDim Preserve TabBase(UBound(TabBase) - 1)
' FIN DU CODE

' Resultat
'       * 1 tableau 1 dimension de 57 Cases
'               * Chacune des cases contients un tableau 2 Dimensions.
End Sub

Merci Laurent
 

Pièces jointes

  • Redim Preserve Variables Tableaux Emboitées Erreur 9.xlsm
    34.7 KB · Affichages: 17
Solution
regarde
demo4.gif

Staple1600

XLDnaute Barbatruc
Re, Bonsoir à toi aussi patricktoulon...:rolleyes: (cf message#7)

•>Laurent950
Je n'ai jamais parlé de solution mais d'éclairer ta lanterne.
1ère cause d'erreur évoquée
Vous avez référencé un élément de tableau qui n'existe pas. L'indice peut être plus grand ou plus petit que la plage d'indices possibles, ou le tableau n'a pas de dimensions affectées à ce point dans l'application.
Sommes-nous dans ce cas ?
etc...
 

patricktoulon

XLDnaute Barbatruc
perso il m'a perdu avec ses commentaires
on va pas se dire bonjour toute la journée non plus ;)
@laurent950 pour info
redim préserve ne peut redimer q'une dimension( la dernière )

et puis c'est quoi ca
deja la faute en gras
ici tu a 3 dimension ce qui est impossible vu ce que je viens de dire en rouge
ReDim Preserve TabBase(209, 72, 65)](1)(1 To 20, 1 To 2) ' Blocage.

conclusion
IMPOSSIBLE
terminé tout le monde au lit ;)
 

patricktoulon

XLDnaute Barbatruc
re
en regardant de plus près tu confond dimension et contenu
par exemple ici
TabBase(i) = Range(Cells(pr, 1), Cells(503, 1)) ' pr premiere non vide ligne 15

tablobase est toujours a 1!!!!!!!! dimension
mais l'item (i)(le contenu) est un tablo a 2 dim (503-pr ligne,1 colonne)
don pour lire dans une boucle cette range dange le tablobase


se sera
for i = lbound(tablobase(1)) to ubound(tablobase(1))
msgbox tablobase(1)(i)
next
 
Dernière édition:

laurent950

XLDnaute Accro
Merci patrick, Staple1600
J'ai conclu par ce code sans les commentaires qui ira très bien :

VB:
Option Base 1
Sub test()
Dim TabBase() As Variant
    ReDim TabBase(1)
Dim TabTemp() As Variant
    For i = 1 To 57
        pr = Cells(Cells(2, i + 1).End(xlDown).Row, i + 1).Row
        TabBase(i) = Range(Cells(pr, 1), Cells(503, 1))
'
        TabTemp = TabBase(i)
        ReDim Preserve TabTemp(LBound(TabTemp, 1) To UBound(TabTemp, 1), LBound(TabTemp, 2) To UBound(TabTemp, 2) + 1)
        TabBase(i) = TabTemp
'
        For j = LBound(TabBase(i), 1) To UBound(TabBase(i), 1)
            TabBase(i)(j, 2) = Cells(j + (pr - 1), i + 1)
        Next j
'
        ReDim Preserve TabBase(UBound(TabBase) + 1)
    Next i
'
ReDim Preserve TabBase(UBound(TabBase) - 1)
End Sub

Ps : Un grand Merci Patrick de m'avoir conforté dans cette réponse précise.
Laurent
 

laurent950

XLDnaute Accro
tablobase est toujours a 1!!!!!!!! dimension
mais l'item (i)(le contenu) est un tablo a 2 dim (503-pr ligne,1 colonne)
Oui C'est exactement cela patrick,
C'est i l'item ce i qui contient le tableau a 2 Dimension et que j'essaie de redimensionné, mais impossible !

et donc je passe comme cela pour le redimensionné
VB:
TabTemp = TabBase(i)
ReDim Preserve TabTemp(LBound(TabTemp, 1) To UBound(TabTemp, 1), LBound(TabTemp, 2) To UBound(TabTemp, 2) + 1)
TabBase(i) = TabTemp

C'est impossible comme cela
VB:
ReDim Preserve TabTemp(i)(LBound(TabTemp, 1) To UBound(TabTemp, 1), LBound(TabTemp, 2) To UBound(TabTemp, 2) + 1)
 

patricktoulon

XLDnaute Barbatruc
tu peux plus redimer tablobase(50) par exemple en tablobase(50,100)
is not possible ;)
donc ca niet
ReDim Preserve TabBase(209, 72, 65)(1)(1 To 20, 1 To 2) ' Blocage.

tu n'a même pas idée de l'arborescence que ca représente :D:D:D:D
tblobase de 209 lignes fois 72 colonne fois 65 enfant(pour chaque item) fois au moins 1 petit fis (chacun!!!!) fois 1 arrière petit fils de 20 lignes fois 2colonnes
ben quand t'a fini de remplir arrivé au (20,2) de l'arierre petit fils , ben mon ami pfffiuuuu........

surtout qu'a la base tu pars avec tablobase(x)
tout les petits ils sont pas encore né et toi t'es pas arrivé, t'es pas parti non plus d'ailleurs
:D :D :D :D :D :D
 

Discussions similaires

Réponses
12
Affichages
225