Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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

laurent950

XLDnaute Accro
Voici la solution du Poste #1
* Redim Preserve Variable Tableau Emboité = Erreur 9 (Indice hors plage)
* La solution : TabBase(i) = [{"","","",""}]

* Poste #20 (Solution pour copier des plages non contiguës


Le Code ci-dessous :
VB:
Option Base 1
' Ici Astuce Redim Preserve
' Redimension de la premiere case du Tableau 1 D --->>> en Tableau 1 dimension de 4 cases
Sub test2()
Dim i As Integer: i = 1
Dim TabBase() As Variant
    ReDim TabBase(i)
' ici pour Application.Index ci-dessous
Dim arrcolumns As Variant
    For i = 1 To 57
    ' Redimension de la premiere case du Tableau 1 D --->>> en Tableau 1 dimension de 4 cases
    ' Ajouter des cases à TabBase(i) :
    ' Donc le TabBase(i) aura 4 Case
    ' Redim preserve TabBase(i)(1 to 4)                  = est Impossible
    ' 2 SOLUTIONS VOIR CI-DESSOUS :
    ' Soit Solution 1 : TabBase(i) = array([{"","","",""}]) = Possible je crée 4 Cases suplémentaires
    ' ici format du tableau = TabBase(1)(1)(1) / TabBase(1)(1)(2) / TabBase(1)(1)(3) / TabBase(1)(1)(4)
    ' Soit Solution 2: TabBase(i) = [{"","","",""} = Possible je crée 4 Cases suplémentaires
    ' ici format du tableau = TabBase(i)(1) / TabBase(i)(2) / TabBase(i)(3) / TabBase(i)(4)
    ' Soluction retenu la N°2 :
        TabBase(i) = [{"","","",""}]
    ' Donc
        TabBase(i)(1) = "BT01"
        TabBase(i)(2) = Array("Janvier", "Fevrier", "Mars", "Etc.")
        TabBase(i)(3) = Array("1974", "1975", "1976", "Etc.")
    ' Suite
        pr = Cells(Cells(2, i + 1).End(xlDown).Row, i + 1).Row
    ' Copier des Colonne Non Contiguës
        With Range(Cells(pr, 1), Cells(503, i + 1))
             arrcolumns = Array(1, i + 1)
             TabBase(i)(4) = Application.Index(.Value, Evaluate("ROW(1:" & .Rows.Count & ")"), arrcolumns)
        End With
    ' Remimension du Tableau 1 Dimension
        ReDim Preserve TabBase(UBound(TabBase) + 1)
    Next i
' Suppresion de la derniere case du tableau 1 Dimension
ReDim Preserve TabBase(UBound(TabBase) - 1)
' Par la suite je vais faire le complément pour la lecture.
' Suite ici a venir ..................
End Sub

Le reste fonctionne
Merci pour l'explication de la Multipage sur l'Userform Patrick
Pour la Multipage l'index est bien 0 pour la premiere page (La page 1)
Merci encore
Laurent
 
Dernière édition:

laurent950

XLDnaute Accro
Fichier Remplacer le 20/04/2020
Fichier : V11_Travail sur Index VBA-19-04-2020 - Copie

Pour Patricktoulon

VB:
Idée avec un Dictionary une structure
Sub DicoDoublonSommeLaurent950()
' https://www.excel-downloads.com/threads/transfer-et-trie-dune-feuil-a-une-autre-feuil-meme-classeur.20049927/
Dim TI As Single
'    TI = Timer
' ***************************************************
'Dim d As New Scripting.Dictionary
Dim d As Object
    Set d = CreateObject("Scripting.Dictionary")
    d.CompareMode = TextCompare
Dim cef As String
' ***************************************************
Dim Tb() As Variant
Dim ShF1 As Worksheet
    Set ShF1 = Worksheets("BDD")
    Tb = ShF1.Range(ShF1.Cells(2, 1), ShF1.Cells(ShF1.Cells(65536, 5).End(xlUp).Row, 112))
Dim i, j, cpt As Double
' ***************************************************
Dim tabDico() As Variant
ReDim tabDico(0)
Dim TabRes() As Variant
ReDim TabRes(1 To 8, 1 To 1)
Dim Temp() As Variant
' ***************************************************
Dim ShF2 As Worksheet
    Set ShF2 = Worksheets("TrieparIGC")
    'ShF2.Range(ShF2.Cells(2, 5), ShF2.Cells(ShF2.Cells(65536, 5).End(xlUp).Row + 1, 30)).Interior.Pattern = xlNone
    'ShF2.Range(ShF2.Cells(2, 5), ShF2.Cells(ShF2.Cells(65536, 5).End(xlUp).Row + 1, 30)).ClearContents
' ***************************************************
    For i = LBound(Tb) + 1 To UBound(Tb) ' Commence à la ligne 2 (LBound(Tb) + 1)
        clef = Tb(i, 12)
            If d.Exists(clef) Then
            cpt = d(clef)
            Temp = tabDico(cpt - 1)
            ReDim Preserve Temp(1 To 8, 1 To UBound(Temp, 2) + 1)
            tabDico(cpt - 1) = Temp
                tabDico(cpt - 1)(1, UBound(Temp, 2)) = Tb(i, 4)
                tabDico(cpt - 1)(2, UBound(Temp, 2)) = Tb(i, 5)
                tabDico(cpt - 1)(3, UBound(Temp, 2)) = Tb(i, 6)
                tabDico(cpt - 1)(4, UBound(Temp, 2)) = Tb(i, 18)
                tabDico(cpt - 1)(5, UBound(Temp, 2)) = Tb(i, 19)
                tabDico(cpt - 1)(6, UBound(Temp, 2)) = Tb(i, 12)
                tabDico(cpt - 1)(7, UBound(Temp, 2)) = Tb(i, 112)
                tabDico(cpt - 1)(8, UBound(Temp, 2)) = Tb(i, 95)
            Erase Temp
        Else
            cpt = d.Count + 1
            d(clef) = cpt
            tabDico(cpt - 1) = TabRes
                tabDico(cpt - 1)(1, 1) = Tb(i, 4)
                tabDico(cpt - 1)(2, 1) = Tb(i, 5)
                tabDico(cpt - 1)(3, 1) = Tb(i, 6)
                tabDico(cpt - 1)(4, 1) = Tb(i, 18)
                tabDico(cpt - 1)(5, 1) = Tb(i, 19)
                tabDico(cpt - 1)(6, 1) = Tb(i, 12)
                tabDico(cpt - 1)(7, 1) = Tb(i, 112)
                tabDico(cpt - 1)(8, 1) = Tb(i, 95)
            ReDim Preserve tabDico((cpt - 1) + 1)
        End If
    Next i
' Suppression de la derniere dimension
    ReDim Preserve tabDico(UBound(tabDico) - 1)
' Boucle sur tabDico
    cpt = 4
    For i = LBound(tabDico) To UBound(tabDico)
        For j = 1 To 7
            ShF2.Cells(cpt, j + 1).Resize(UBound(tabDico(i), 2), 1) = Application.Index(Application.Transpose(tabDico(i)), , j)
        Next j
            ShF2.Cells(cpt, 12).Resize(UBound(tabDico(i), 2), 1) = Application.Index(Application.Transpose(tabDico(i)), , 8)
    cpt = ShF2.Cells(65536, 2).End(xlUp).Row + 1
    Next i
'MsgBox Format(Timer - TI, "0.000\ sec.")
End Sub
 

Pièces jointes

  • V11_Travail sur Index VBA-19-04-2020 - Copie.xlsm
    228.3 KB · Affichages: 7
Dernière édition:

patricktoulon

XLDnaute Barbatruc
allez ca commence


et ca continue



bon malgré les erreur de combo passage(annuelle/etre deux dates
je crois comprendre que tu choisi les deux date et tu fait un calcul entre les deux c'est ca ?

ma fois si tu a fait tout ce ramdam pour ça le confinement t'a beaucoup plus amoché que le virus
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
Re
je me demande si tu comprends la langue française
vire moi cette M!!.. de module classe tout ce code pourri et reprends moi ca a zéro avec une v tableau ET C'EST TOUT
est ce que je suis plus clair là
en l’état même pas je regarde
 

Discussions similaires

Réponses
12
Affichages
253
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…