patricktoulon
XLDnaute Barbatruc
APPLICATION.INDEX ET EVALUATE EPISODE 4(by patricktoulon)
bonjour a tous comme le sujet m'a été demandé plusieurs fois je vous propose aujourd'hui 2 petite fonctions qui convertissent un array base 0 en base 1 en une seule ligne
alors le principe est simple
imaginons que vous ayez un une variable tableau de 10 ligne 5 colonnes par exemple
vous la collez dans une plage et vous reprenez la plage.value vous vous retrouvez donc avec une variable tableau en base 1
sauf que l'on peut faire la même chose en mémoire avec application.index qui n' a que pour base 1(0 étant littéralement pour lui le retrait pur et simple de la dimension)
les argument dimensions 1 et 2 devront donc être des array explicites
pour ne pas m'ennuyer a coder des array explicite qui peuvent durer 3 kilomètres ,je vais utiliser un calque de dimension de plage avec evaluate
l'astuce avec evaluate est non seulement qu'elle dimensionne les array mais qu'elle intègre dans les items l'index d'item explicitement
exemple on crée un array avec evaluate et je l'affiche dans un message en le jointant pour en faire un string
Code:
Sub test()
Dim monarray
'je crée un array qui demarre de 3 a 10 '<<<<on se sert des colonne pour un array 1 dim >>>>
monarray = Evaluate("COLUMN(" & Columns(3).Resize(, 10 - 3 + 1).Address(0, 0) & ")")
MsgBox Join(monarray, ",")
End Sub
voilà nous y sommes
convertir une variable tableau 2 dimensions en base 1
VB:
Sub TestMultiDim()
Dim t(5, 4)
x = ConvertMultiDimBase0ToBase1(t)
MsgBox " 1er index ligne " & LBound(x) & vbCrLf & " dernier index ligne " & UBound(x) & vbCrLf & UBound(x, 2) & " colonnes"
End Sub
Function ConvertMultiDimBase0ToBase1(t)
ConvertMultiDimBase0ToBase1 = Application.Index(t, Evaluate("ROW(1:" & UBound(t) + 1 & ")"), Evaluate("COLUMN(" & Columns(1).Resize(, UBound(t) + 1).Address(0, 0) & ")"))
End Function
convertir une variable array
VB:
ub TestOneDim()
Dim t(5)
x = ConvertOneDimBase0ToBase1(t)
MsgBox " 1er index items " & LBound(x) & vbCrLf & " dernier index items " & UBound(x) & vbCrLf & UBound(x) & " items"
End Sub
Function ConvertOneDimBase0ToBase1(t)
ConvertOneDimBase0ToBase1 = Application.Index(t, Evaluate("COLUMN(" & Columns(1).Resize(, UBound(t) + 1).Address(0, 0) & ")"))
End Function
Enjoy