Redimensionnement dynamique d'une matrice

Bonjour à tous,

Pour redimensionner dynamiquement les lignes d’une matrice dans mon code VBA, j’utilise l’instruction suivante :

If (ptr + 10) >= UBound(aOut, 1) Then 
    ReDim Preserve aOut(1 To UBound(aOut, 1) + GROWTH_FACTOR, 1 To UBound(aOut, 2)) 
End If

Ou GROWTH_FACTOR est une constante définie à 100, et la variable ptr, après plusieurs passages, se situe entre 92 et 98, dans ce cas.

Cependant, cette ligne :

ReDim Preserve aOut(1 To UBound(aOut, 1) + GROWTH_FACTOR, 1 To UBound(aOut, 2))

déclenche systématiquement l’erreur « L’indice n’appartient pas à la sélection ».

Voici comment la matrice aOut est initialisée :

' Initialisation de aOut avec 100 lignes et autant de colonnes que LO_DistribGains 
ReDim aOut(1 To GROWTH_FACTOR, 1 To LO_DistribGains.ListColumns.Count) 
ptr = 0 
Debug.Print "aOut initialisé avec " & UBound(aOut, 2) & " colonnes" ' 21 Colonnes

Ensuite, j’ai inversé les indices pour permettre à Redim Preserve, qui ne redimensionne que la deuxième dimension, de fonctionner normalement en utilisant newSize dans le deuxième indice :

If (ptr + 10) >= UBound(aOut, 2) Then
     newSize = UBound(aOut, 2) + GROWTH_FACTOR
     If newSize > 0 Then
         ReDim Preserve aOut(1 To UBound(aOut, 2), 1 To newSize)
     Else
         Debug.Print "Erreur : newSize n'est pas valide."
         Exit Sub
     End If
End If

Après avoir initialisé aOut :

 ' Initialisation de aOut avec un nombre initial de 100 lignes et autant de colonnes que dans LO_DistribGains
    ReDim aOut(1 To LO_DistribGains.ListColumns.Count, 1 To GROWTH_FACTOR)
    ptr = 0
    Debug.Print "aOut initialisé avec " & UBound(aOut, 2) & " colonnes"

et voici le log obtenu :

Avant redimensionnement :
UBound(aOut, 1): 21
UBound(aOut, 2): 100
Ligne ptr d’entrée actuel : 90
GROWTH_FACTOR: 100
Ligne ptr dans 2. Section Global : 90
!!! ERREUR dans MettreAJourAOut !!!
Description : L’indice n’appartient pas à la sélection.
Numéro : 9
Ligne en cours : 90
Clé en cours :

Comment résoudre ce problème ?

Merci d’avance ! :grinning:

bonjour Atlas, voir PJ
atlas.xlsm (55,7 Ko)

1 « J'aime »

vous avez choisi quelle méthode ?

Bonjour Cow18,

J’ai opté pour la méthode 2 de transposition de aOut, ce qui m’a permis de corriger efficacement le code problématique.

Mon code précédent :

fonctionne maintenant après l’avoir corrigé :

ReDim Preserve aOut(1 To UBound(aOut), 1 To newSize)

    If (ptr + 10) >= UBound(aOut, 2) Then
        newSize = UBound(aOut, 2) + GROWTH_FACTOR
        If newSize > 0 Then
            ReDim Preserve aOut(1 To UBound(aOut), 1 To newSize)
        Else
            Debug.Print "Erreur : newSize n'est pas valide."
            Exit Sub
        End If
    End If

Merci encore Cow18 pour tes precieuses suggestions :slightly_smiling_face:

1 « J'aime »

il y a un petit danger, mais je ne sais plus la limite (16.000, 32.000 ou 64.000 lignes ou colonnes) pour transposer, mais je suppose que vous parler jamais de 16.000 lignes ou colonnes, je me trompe ?

Re,

Peut-être des centaines de lignes au max.

Question : Est-ce que la transposition peut affecter le formatage des dates ?

Car après avoir utilisé la transposition de aOut dans la feuille, j’ai un problème avec la colonne de dates, qui s’affichent dans le tableau des résultats par intermittence entre le format de date français et le format de date anglais !!!?

On peut voir dans l’exemple suivant, qu’il y a problème de formatage dans les dates du 05/04/2024 et le 12/04/2024 qui sont au format anglais mm/dd/yyyy:

29/03/2024
29/03/2024
04/05/2024
04/05/2024
04/05/2024
04/05/2024
04/05/2024
04/12/2024
04/12/2024
04/12/2024
04/12/2024
19/04/2024
19/04/2024
19/04/2024
19/04/2024

il faut utiliser le format « double » ou « long » au lieu de « date ». Alors, on n’a pas ce problème. Pour cela, il faut utiliser « value2 » au lieu de « value »,
arr=range(« A1:M20 »).value2
Comme çà, vous dates seront des doubles, vos valeurs monetaires ne seront pas affectées, etc.

voir PJ et la macro « comparer », lire une plage avec « value2 » est plus vite qu’avec « value » et le résultat est plus pratique !!!
atlas.xlsm (60,4 Ko)

1 « J'aime »

Bonsoir Cow18,

La syntaxe suivante ne fonctionnait pas à tous les coups :

aOut(COL_DATE, ptr) = Format(Vendredi, "dd/mm/yyyy")

Je l’ai remplacée par cette ligne, qui produit le même résultat :

aOut(COL_DATE, ptr) = Format(CLng(Vendredi), "dd/mm/yyyy")

Enfin, j’ai testé une autre méthode en utilisant directement la conversion en Long avec la ligne suivante, tout en formatant la colonne correspondante (Vendredi) dans le tableau de sortie « TbDistributionGain » en date :

aOut(COL_DATE, ptr) = CLng(Vendredi) ' Col 5: Vendredi

Cela m’a permis d’obtenir le bon résultat.

Merci pour l’astuce de convertir la date en Long, cela évite effectivement les problèmes liés à l’affichage des dates.

:grinning:

1 « J'aime »