Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Traduction VBA d'un pseudo code

5 réponses
Avatar
Tatanka
Bonsoir,

J'essaie vainement de traduire ce pseudo code en VBA.
Où erre-je ?

DEBUT
Const N=//Valeur positive
VAR:
Tampon , i, k: ENTIER
Tab:
tableau(1..N) :ENTIER

POUR( i <-- 2 à N )
Tampon <--- Tab[i]
k <--- i

TANTQUE(k>1 et Tab[k-1]>Tampon)
Tab[k] <--- Tab[k-1]
k <--- k-1
FINTANTQUE

Tab[k] <--- Tampon
FINPOUR

FIN

Sub Trier1()
Dim table(1 To 5, 1 To 1)
table(1, 1) = 5
table(2, 1) = 6
table(3, 1) = 1
table(4, 1) = 8
table(5, 1) = 2
For i = 2 To 5
tampon = table(i, 1)
k = i
Do While (k > 1 And table(k - 1, 1) > tampon)
table(k, 1) = table(k - 1, 1)
k = k - 1
Loop
table(k, 1) = tampon
Next i
Range("A1:A5").Value = table
End Sub

Merci
Serge

5 réponses

Avatar
Charabeuh
Bonjour,

il me semble que :
l'instruction "Do While (k > 1 And table(k - 1, 1) > tampon)"
essaie toujours d'évaluer les deux arguments de l'opérateur "AND"
même si le premier est faux.
==> si k= 1 l'évaluation de "table(k - 1, 1)" conduit à référencer
"table(0,1)" qui n'existe pas.
En déclarant Dim table(0 To 5, 1 To 1) on évite cette erreur.
Dans ce cas remplacer : Range("A1:A5").Value = table
par : Range("A1:A6").Value = table

Cdlt

"Tatanka" a écrit dans le message de groupe
de discussion :
Bonsoir,

J'essaie vainement de traduire ce pseudo code en VBA.
Où erre-je ?

DEBUT
Const N=//Valeur positive
VAR:
Tampon , i, k: ENTIER
Tab:
tableau(1..N) :ENTIER

POUR( i <-- 2 à N )
Tampon <--- Tab[i]
k <--- i

TANTQUE(k>1 et Tab[k-1]>Tampon)
Tab[k] <--- Tab[k-1]
k <--- k-1
FINTANTQUE

Tab[k] <--- Tampon
FINPOUR

FIN

Sub Trier1()
Dim table(1 To 5, 1 To 1)
table(1, 1) = 5
table(2, 1) = 6
table(3, 1) = 1
table(4, 1) = 8
table(5, 1) = 2
For i = 2 To 5
tampon = table(i, 1)
k = i
Do While (k > 1 And table(k - 1, 1) > tampon)
table(k, 1) = table(k - 1, 1)
k = k - 1
Loop
table(k, 1) = tampon
Next i
Range("A1:A5").Value = table
End Sub

Merci
Serge



Avatar
db
Tatanka a écrit :
Bonsoir,





Sub Trier1()
Dim table(1 To 5, 1 To 1)
table(1, 1) = 5
table(2, 1) = 6
table(3, 1) = 1
table(4, 1) = 8
table(5, 1) = 2
For i = 2 To 5
tampon = table(i, 1)
k = i
Do While (k > 1 And table(k - 1, 1) > tampon)
table(k, 1) = table(k - 1, 1)
k = k - 1
Loop
table(k, 1) = tampon
Next i
Range("A1:A5").Value = table
End Sub




Bonjour,

D'accord avec Charabeuh sur la raison du dysfonctionnement.
Une solution possible :

Do While (k > 1)
If table(k - 1, 1) > tampon Then Exit Do
table(k, 1) = table(k - 1, 1)
k = k - 1
Loop


db
Avatar
Hervé
Bonjour,
Peut être ceci ? A adapter si ce n'est pas le cas :

Sub test()

Dim Tbl()
Dim I As Integer

Dim table(1 To 5, 1 To 1)
table(1, 1) = 5
table(2, 1) = 6
table(3, 1) = 1
table(4, 1) = 8
table(5, 1) = 2

Tbl = Tri(table)

For I = 1 To UBound(table)
Debug.Print table(I, 1)
Next I

End Sub

Function Tri(Tbl()) As Variant()
Dim Tempo
Dim I As Integer
Dim J As Integer


'éffectue un tri décroissant "<"
'pour un tri croissant ">"

'avec boucle Do Loop
Do While I < UBound(Tbl) - 1
I = I + 1
Do While J < UBound(Tbl)
J = J + 1
'sens du tri < ou >
If Tbl(I, 1) < Tbl(J, 1) Then
Tempo = Tbl(J, 1)
Tbl(J, 1) = Tbl(I, 1)
Tbl(I, 1) = Tempo
End If
Loop
J = I
Loop

'avec boucle For Next
'' For I = 1 To UBound(Tbl) - 1
'' For J = I + 1 To UBound(Tbl)
'' J = J + 1
'' 'sens du tri < ou >
'' If Tbl(I, 1) < Tbl(J, 1) Then
'' Tempo = Tbl(J, 1)
'' Tbl(J, 1) = Tbl(I, 1)
'' Tbl(I, 1) = Tempo
'' End If
'' Next J
'' Next I

End Function


Hervé.


"Tatanka" a écrit dans le message de
news:
Bonsoir,

J'essaie vainement de traduire ce pseudo code en VBA.
Où erre-je ?

DEBUT
Const N=//Valeur positive
VAR:
Tampon , i, k: ENTIER
Tab:
tableau(1..N) :ENTIER

POUR( i <-- 2 à N )
Tampon <--- Tab[i]
k <--- i

TANTQUE(k>1 et Tab[k-1]>Tampon)
Tab[k] <--- Tab[k-1]
k <--- k-1
FINTANTQUE

Tab[k] <--- Tampon
FINPOUR

FIN

Sub Trier1()
Dim table(1 To 5, 1 To 1)
table(1, 1) = 5
table(2, 1) = 6
table(3, 1) = 1
table(4, 1) = 8
table(5, 1) = 2
For i = 2 To 5
tampon = table(i, 1)
k = i
Do While (k > 1 And table(k - 1, 1) > tampon)
table(k, 1) = table(k - 1, 1)
k = k - 1
Loop
table(k, 1) = tampon
Next i
Range("A1:A5").Value = table
End Sub

Merci
Serge



Avatar
Tatanka
Salut Charabeuh, db et Hervé,

Merci pour vos précieux conseils.
Pour le moment je m'amuse avec ça :

Sub Trier_Sur_Une_Colonne()
'Selection : Plage de cellules adjacentes sur une colonne
'et contenant des valeurs numériques.
'La macro entre les valeurs triées dans la colonne
'juste à droite de la sélection.
Dim table
ordre = Application.InputBox _
(Prompt:="Entrez 1 pour croissant ou 2 pour décroissant.", _
Title:="Ordre du tri sur une colonne", Type:=1)
If Not (ordre = 1 Or ordre = 2) Then Exit Sub
table = Selection
If Selection.Columns.Count <> 1 Then Exit Sub
n = UBound(table, 1)
For i = 2 To n
tampon = table(i, 1)
k = i
Do While k > 1
Select Case ordre
Case 1: If table(k - 1, 1) < tampon Then Exit Do
Case 2: If table(k - 1, 1) > tampon Then Exit Do
End Select
table(k, 1) = table(k - 1, 1)
k = k - 1
Loop
table(k, 1) = tampon
Next i
Selection.Offset(0, 1).Value = table
End Sub

Sub Trier_Sur_Une_Ligne()
'Selection : Plage de cellules adjacentes sur une ligne
'et contenant des valeurs numériques.
'La macro entre les valeurs triées dans la ligne
'juste en-dessous de la sélection.
Dim table
ordre = Application.InputBox _
(Prompt:="Entrez 1 pour croissant ou 2 pour décroissant.", _
Title:="Ordre du tri sur une ligne", Type:=1)
If Not (ordre = 1 Or ordre = 2) Then Exit Sub
table = Selection
If Selection.Rows.Count <> 1 Then Exit Sub
n = UBound(table, 2)
For i = 2 To n
tampon = table(1, i)
k = i
Do While k > 1
Select Case ordre
Case 1: If table(1, k - 1) < tampon Then Exit Do
Case 2: If table(1, k - 1) > tampon Then Exit Do
End Select
table(1, k) = table(1, k - 1)
k = k - 1
Loop
table(1, k) = tampon
Next i
Selection.Offset(1, 0).Value = table
End Sub

Serge
Avatar
Hervé
Bonjour Serge,

Pour le moment je m'amuse avec ça :


Qu'importe le flacon pourvu qu'on est l'ivresse ;o)

Hervé


"Tatanka" a écrit dans le message de
news:
Salut Charabeuh, db et Hervé,

Merci pour vos précieux conseils.
Pour le moment je m'amuse avec ça :

Sub Trier_Sur_Une_Colonne()
'Selection : Plage de cellules adjacentes sur une colonne
'et contenant des valeurs numériques.
'La macro entre les valeurs triées dans la colonne
'juste à droite de la sélection.
Dim table
ordre = Application.InputBox _
(Prompt:="Entrez 1 pour croissant ou 2 pour décroissant.", _
Title:="Ordre du tri sur une colonne", Type:=1)
If Not (ordre = 1 Or ordre = 2) Then Exit Sub
table = Selection
If Selection.Columns.Count <> 1 Then Exit Sub
n = UBound(table, 1)
For i = 2 To n
tampon = table(i, 1)
k = i
Do While k > 1
Select Case ordre
Case 1: If table(k - 1, 1) < tampon Then Exit Do
Case 2: If table(k - 1, 1) > tampon Then Exit Do
End Select
table(k, 1) = table(k - 1, 1)
k = k - 1
Loop
table(k, 1) = tampon
Next i
Selection.Offset(0, 1).Value = table
End Sub

Sub Trier_Sur_Une_Ligne()
'Selection : Plage de cellules adjacentes sur une ligne
'et contenant des valeurs numériques.
'La macro entre les valeurs triées dans la ligne
'juste en-dessous de la sélection.
Dim table
ordre = Application.InputBox _
(Prompt:="Entrez 1 pour croissant ou 2 pour décroissant.", _
Title:="Ordre du tri sur une ligne", Type:=1)
If Not (ordre = 1 Or ordre = 2) Then Exit Sub
table = Selection
If Selection.Rows.Count <> 1 Then Exit Sub
n = UBound(table, 2)
For i = 2 To n
tampon = table(1, i)
k = i
Do While k > 1
Select Case ordre
Case 1: If table(1, k - 1) < tampon Then Exit Do
Case 2: If table(1, k - 1) > tampon Then Exit Do
End Select
table(1, k) = table(1, k - 1)
k = k - 1
Loop
table(1, k) = tampon
Next i
Selection.Offset(1, 0).Value = table
End Sub

Serge