1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
|
'Tri des valeurs numériques par ordre croissant
'contenues dans la troisième dimension d'un tableau 3D de type variant
Public Function ShellTriTableau3D(ByRef avTab() As Variant, _
ByVal l2DNumCol As Long, _
ByVal l3DNumColTri As Long) As Boolean
Dim i As Long, j As Long, k As Long, l As Long, lInc As Long, n As Long
Dim lMin As Long, lLowerCol As Long, lUpperCol As Long
Dim lUpperBound As Long, lLowerBound As Long
Dim avRefLigne As Variant
On Error GoTo errtag
If l2DNumCol < LBound(avTab, 2) Or l2DNumCol > UBound(avTab, 2) Then Exit Function
lLowerCol = LBound(avTab, 3)
lUpperCol = UBound(avTab, 3)
If l3DNumColTri < lLowerCol Or l3DNumColTri > lUpperCol Then Exit Function
lUpperBound = UBound(avTab)
lLowerBound = LBound(avTab)
n = lUpperBound - lLowerBound - 1
ReDim avRefLigne(lLowerCol To lUpperCol)
lInc = 1
While lInc < n
lInc = lInc * 3 + 1
Wend
While lInc > 1
lInc = lInc \ 3
lMin = lInc + lLowerBound
For i = lMin To lUpperBound
j = i
k = j - lInc
For l = lLowerCol To lUpperCol
avRefLigne(l) = avTab(j, l2DNumCol, l)
Next l
Do While avRefLigne(l3DNumColTri) < avTab(k, l2DNumCol, l3DNumColTri)
For l = lLowerCol To lUpperCol
avTab(j, l2DNumCol, l) = avTab(k, l2DNumCol, l)
Next l
j = j - lInc
If j < lMin Then Exit Do
k = j - lInc
Loop
For l = lLowerCol To lUpperCol
avTab(j, l2DNumCol, l) = avRefLigne(l)
Next l
Next i
Wend
ShellTriTableau3D = True
Exit Function
errtag:
End Function |
Partager