@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
"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
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
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 ?