Microsoft 365 redim array ne marche pas

thenesol

XLDnaute Junior
bonjour à tous

j'ai un array "tablo1" dont je ne voudrais garder que les 100 premières lignes

mais le code suivant ne le modifie pas, c'est à dire qu'il a toujours ses 8000 lignes
pourquoi ?

ReDim Preserve tablo1(1 To 100, 1 To ncol)

merci...
 

patricktoulon

XLDnaute Barbatruc
@sylvanu , @thenesol
re je vous la redonne en intégrale
avec quelque commentaire vous comprendrez mieux
je l'ai aussi retransformé en fonction
VB:
Sub test()
    [A2:O1000].ClearContents
    Dim Tablo(1 To 100, 1 To 4), t
    ' Remplissage tablo
    For i = 1 To 100
        Tablo(i, 1) = 100 + i: Tablo(i, 2) = 200 + i: Tablo(i, 3) = 300 + i: Tablo(i, 4) = 400 + i
    Next i
    ' Restitution Tablo avant
    [A2].Resize(UBound(Tablo, 1), UBound(Tablo, 2)) = Tablo
    ' "réduction" nbre de lignes
    t = Redim_PreserveRow(Tablo, 1, 10)
    ' Restitution Tablo après
    [H2].Resize(UBound(t), UBound(t, 2)) = t    ' Restitution Tablo après
End Sub
Function Redim_PreserveRow(ByVal t, minLig, MaxLig)
    Dim L, C
    L = Evaluate("ROW(" & minLig & ":" & MaxLig & ")")
    C = Evaluate("COLUMN(" & Cells(1, 1).Resize(1, UBound(t, 2)).EntireColumn.Address(0, 0) & ")")

    'pour comprendre ce que fait evaluate
    MsgBox "lignes " & Join(Application.Transpose(L), ",")    'la matrice L est un tableau a 2 dimension(xlignes et 1 colonne)
    MsgBox "colonnes " & Join(C)    'la matrice contient un array(1 dimension)

    'ces deux variable(tableau et array contienne  dans leur items la vcaleur de leurs index item
    'return
    Redim_PreserveRow = Application.Index(t, L, C)

    'soit Redim_PreserveRow=application.index(matrice de lignes , matrice de colonnes)
End Function
 

laurent950

XLDnaute Barbatruc
Bonsoir @patricktoulon

"Super, cette astuce ! Je me souviens que tu m'as aidé sur cela.
De mémoire, pour C, tu m'avais aidé comme cela :
Avec l'avantage de l'ordre et du désordre.

Dim C As Variant
C = Array(1, 2, 3, 4) ' ou C = Array(2, 4, 3, 1) ou C = Array(4, 2)
etc.

Mais je suis resté sur Evaluate et j'ai essayé comme cela avec ROW :

Dim C As Variant
C = Application.Transpose(Evaluate("ROW(" & LBound(Tablo, 2) & ":" & UBound(Tablo, 2) & ")"))

Je n'ai pas trouvé avec ta méthode après avoir essayé avec : COLUMN
C = Evaluate("COLUMN(" & Cells(1, 1).Resize(1, UBound(t, 2)).EntireColumn.Address(0, 0) & ")")
Merci Patrick

J'ai pas encore compris cette partie avec Evaluate ?

Cas N°1 :
' Obtenir les indices des colonnes 1 à 4
C = Evaluate("COLUMN(1:4)")
j'obtient bien un tableau 1 dimension mais de (1 to 16384)

Cas N° 2 :
Puis la même chose avec cela
Idéme avec cela :
LBound(Tablo, 2) = 1
UBound(Tablo, 2) = 4
C = Evaluate("COLUMN(" & LBound(Tablo, 2) & ":" & UBound(Tablo, 2) & ")")
Ont pourait ici penser que Evaluate Evalue l'ensemble des colonnes comme les dimensions d'une variable tableau 2D ?
soit début dimension 2 à la fin dimension 2 "Les Colonnes" (Comme une variable tableau se qui expliquerait (1 to 16384)

Je n'avais jamais fait attention qu'avec Evaluate (les dimensions)
Avec Evaluate("ROW"), cela crée un tableau à 2 dimensions
et
Avec Evaluate("COLUMN"), cela crée des tableaux à 1 dimension.

J'ai corrigé le code de @sylvanu, ce qui m'a permis de comprendre.

VB:
Sub test()
    [A2:O1000].ClearContents
    Dim Tablo() As Variant
    ReDim Tablo(1 To 100, 1 To 4)
    ' Remplissage tablo
    For i = 1 To 100
        Tablo(i, 1) = 100 + i: Tablo(i, 2) = 200 + i: Tablo(i, 3) = 300 + i: Tablo(i, 4) = 400 + i
    Next i
    ' Restitution Tablo avant
    [A2].Resize(UBound(Tablo, 1), UBound(Tablo, 2)) = Tablo
    ' "réduction" nbre de lignes
    Tablo = Redim_preserveRow(Tablo, 1, 10)
    ' Restitution Tablo après
    [H2].Resize(UBound(Tablo, 1), UBound(Tablo, 2)) = Tablo ' Restitution Tablo après
End Sub
Function Redim_preserveRow(ByRef Tablo, minLig, MaxLig) As Variant()
    Dim L
    Dim C
    L = Evaluate("ROW(" & minLig & ":" & MaxLig & ")")
    C = Application.Transpose(Evaluate("ROW(" & LBound(Tablo, 2) & ":" & UBound(Tablo, 2) & ")"))
    Redim_preserveRow = Application.Index(Tablo, L, C)
End Function
 

patricktoulon

XLDnaute Barbatruc
rr
Bonjour Laurent
et oui la matrice de colonne est un array 1 dim
mais tu peux le faire avec evaluate "Row" en le transposant
effectivement on peut inverser les colonnes dans l'array pour créer le tableau rangé par colonne différemment que l'originalou même exepter des colonnes ou m^me exepter des lignes
 
Dernière édition:

thenesol

XLDnaute Junior
bonjour

je reviens sur la fonction "Redim_preserveRow" qui fonctionne très bien, sauf que

si une colonne de l'array contient un format date #10/11/2023# elle le restitue en format texte "10/11/2023" ce qui oblige à faire à chaque fois après l'appel
For i = 1 To UBound(tablo)
tablo(i, 2) = CDate(tablo(i, 2))
Next i

j'ai mis du temps à comprendre pourquoi mon programme ne marchait pas avant de constater ce pb

je ne sais pas si c'est aussi le cas pour d'autres types de contenus, mais y a t il un moyen d'éviter ces risques de pertes de format ?

merci !
 

Discussions similaires

Statistiques des forums

Discussions
314 626
Messages
2 111 299
Membres
111 094
dernier inscrit
MFrequence