Interprétation code VBA

Fermé
elie-n Messages postés 23 Date d'inscription vendredi 23 février 2007 Statut Membre Dernière intervention 25 janvier 2011 - 25 janv. 2011 à 21:49
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 - 26 janv. 2011 à 08:54
Bonjour tout le monde !

J'ai besoin de votre aide pour comprendre un code VBA que je dois expliquer...
Le voici:

Sub test(n As Long, a() As Single, b() As Single)
Dim aT As Double
Dim bT As Double
Dim i As Long
Dim j As Long

For j = 2 To nb
aT = x(i)
bT = y(i)
For i = j - 1 To 1 Step -1
If (a(i) <= aT) Then GoTo 10
a(i + 1) = a(i)
b(i + 1) = b(i)
Next i
i = 0
10 a(i + 1) = aT
b(i + 1) = bT
Next j

End Sub

Merci de me dire ce que vous en pensez. A quoi ce type de code peut servir ? Quel est son résultat si l'on appelle avec un "Call...".

Merci à vous, bonne soirée.
A voir également:

3 réponses

' Réponse à cette question sous forme de commentaire inséré dans le code et en-dessous. La procédure Main sert à tester le Call en lui fournissant les paramètres attendus.

Sub Main()

Dim PremierTableau(99) As Single
Dim SecondTableau(99) As Single

Dim Indx As Integer ' Indice pour remplir les tableaux


' Traitements

' Call Test seul entraîne une erreur, les paramètres manquent

' Pour cette raison, j'ai déclaré les deux tableaux du haut

' On sait qu'ils contiennent des valeurs numériques à virgule (Single)
' Essayons de les remplir de nombres aléatoires.

Randomize Timer

For Indx = 0 To 99 ' 99 étant la borne supérieure de mes tableaux

' Placer des nombres aléatoires [-1000;+1000] à virgule

PremierTableau(Indx) = 2000 * Rnd - 1000
SecondTableau(Indx) = 2000 * Rnd - 1000

Next Indx

' Maintenant faisons notre Call Test avec les paramètres :)

Call Test(99, PremierTableau, SecondTableau)

' Enfin contrôlons le résultat

For Indx = 1 To 99

Debug.Print Indx, PremierTableau(Indx), SecondTableau(Indx)

Next Indx

End Sub

Sub Test(nb As Long, a() As Single, b() As Single)

' Cette sub admet trois paramètres, un nombre entier
' et deux tableaux de décimaux signés

' nb est le nombre de bouclages de 2 à ce maximum


Dim aT As Double
Dim bT As Double

Dim i As Long ' Variable de pile de la grande boucle for-next
Dim j As Long ' Variable de pile de la petite for-next

Dim x(99) As Variant ' D'abord non déclarés, ces deux tableaux causent une
Dim y(99) As Variant ' erreur empêchant l'exécution


For j = 2 To nb

aT = x(i) ' valant 0 car non défini :( au départ et vides sinon
bT = y(i) ' pareil... tableaux variant implicites (à éviter)

For i = j - 1 To 1 Step -1

' Si la valeur i du poste tableau a est négative,
' quitter la boucle for :

If (a(i) <= aT) Then GoTo 10

' Sinon décaler la valeur dans le poste au-dessus
' Rappel : on descend, voir Step - 1 plus haut.

a(i + 1) = a(i)
b(i + 1) = b(i)

Next i

i = 0

10: a(i + 1) = aT ' Le nombre dans le poste i + 1 sera remis à zéro
b(i + 1) = bT ' et ce du poste 2 à nb (faux en fait : de 2 inclus à
' nb excepté. C'est le dernier poste qui n'est pas
' remis à zéro. En raison du fait que aT = x(i) = 0
' et bT pareil...

Next j

End Sub


' Sans exécuter ce code je dirais qu'il remet à zéro une portion d'un tableau de Single.
' A quoi il peut servir : à une réinitialisation, mais il n'est pas très utile.

' Je viens de l'exécuter pour voir, et petit rectificatif : il met tous les postes à 0
' lentement et pas très efficacement sauf le dernier dans lequel il reste le valeur
' initiale.
0
Zoul67 Messages postés 1959 Date d'inscription lundi 3 mai 2010 Statut Membre Dernière intervention 30 janvier 2023 149
25 janv. 2011 à 23:43
Bonsoir,

Je te conseille d'essayer (avec le vrai code, ce sera mieux : nb, x, y ???)

++
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 312
Modifié par michel_m le 26/01/2011 à 08:56
Bonjour,

je rejoins tout à fait Zoul67 et API67

Cette procédure comporte a peu près tout ce qu'il ne faut pas faire

Variables non existantes (n,x, y) ???

Tableaux non indexé à 0: si on veut commencer à 1, il faut le préciser par un option base 1 en 1° ligne au dessus des macros ou déclarer par exemple
Dim Tablo(1 to 99)

emploi de goto !!! qui sent un basic-programmation spaghetti des années 80... Goto ne doit être utilisé que pour la gestion d'erreurs et clairement par ex: goto erreur10. il devrait être replacé par le traitement du cas suivi de exit for à l'intérieur de la boucle
si, un jour, tu passes un test de connaissances VBA (boulot, examen) le GOTO spaghetti est rédhibitoire.
par ex:
For i = j - 1 To 1 Step -1 
If (a(i) <= aT) Then 
    traitement 
    Exit For 
Else 
    traitement 
End If 
Next i 

Next j


Mis à part les compteurs de boucle pour lesquels il est toléré des variables à 1 lettre (i,,j,k) le nom des variables doit être explicite (3 ou 4 caractères mini): Une bonne procédure doit faciliter une compréhension et maintenance rapide ainsi que des modifications aisées... Un code doit donc obligatoirement être commenté

sur à quoi ca sert, Api l'a indiqué mais effectivement que c'est lourd et lent et difficile à comprendre (cf paragraphe au dessus)
Michel
0