Interprétation code VBA

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. Contributeur
    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
    1. Bonsoir,

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

      ++
      1. ' 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.