Interprétation code VBA

elie-n Messages postés 27 Statut Membre -  
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   -
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.

3 réponses

  1. AP67
     
    ' 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
  2. Zoul67 Messages postés 2001 Statut Membre 149
     
    Bonsoir,

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

    ++
    0
  3. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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