convertir une variable tableau ou un array base 0 en base 1 en une seule ligne

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;)
 

Usine à gaz

XLDnaute Barbatruc
Supporter XLD
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;)
Hello Patrick : J'ai rien compris mais c'est super lol 🤣
Bon dimanche :)
 

soan

XLDnaute Barbatruc
Inactif
Bonjour patrick, sylvanu, le fil,

à première vue aucune
sauf que si tu dois avoir des array en base 0 et base 1 dans tes codes et ben ... tu es chocolat

oui ... mais faut pas oublier qu'on peut déclarer dans le même code VBA, ces 3 tableaux (par exemple) :​

Dim TblA(0 To 5) As String
Dim TblB(1 To 10) As Integer
Dim TblC(5 To 15) As Long

c'est sûr que ça marche sans instruction Option Base (0 ou 1) ; il me semble bien que ça marche aussi avec la même instruction Option Base (0 ou 1), car la déclaration explicite des limites de dimensions a priorité sur l'instruction Option Base. (je vous laisse vérifier ! 😜)

soan
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
@soan,
Sauf que souvent vous ne connaissez pas la taille de l'array, un simple exemple :
VB:
    Tablo = Range("A1:B" & Range("A65500").End(xlUp).Row)
    ReDim Tablo2(UBound(Tablo))
Dans cet ex, Tablo commence à 1, mais Tablo2 commence à 0.
D'où l'astuce à trouver pour rendre homogène les deux arrays.
 
Bonjour le fil le forum
Re,
@soan,
Sauf que souvent vous ne connaissez pas la taille de l'array, un simple exemple :
VB:
VB:
Tablo = Range("A1:B" & Range("A65500").End(xlUp).Row)
ReDim Tablo2(UBound(Tablo))
Dans cet ex, Tablo commence à 1, mais Tablo2 commence à 0.
D'où l'astuce à trouver pour rendre homogène les deux arrays.
pas vraiment gênant pour un redim, il suffit de le calquer
VB:
    Tablo = Range("A1:B" & Range("A65500").End(xlUp).Row)
    ReDim Tablo2(LBound(Tablo, 1) To UBound(Tablo, 1), LBound(Tablo, 2) To UBound(Tablo, 2))

Cordialement, @+
 

Discussions similaires

Réponses
6
Affichages
384
Réponses
19
Affichages
2 K
Réponses
0
Affichages
1 K