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
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
A voir également:
- Interprétation code VBA
- Code asci - Guide
- Code puk bloqué - Guide
- Code telephone oublié - Guide
- Code activation windows 10 - Guide
- Code gta 4 ps4 - Guide
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.
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.
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
25 janv. 2011 à 23:43
Bonsoir,
Je te conseille d'essayer (avec le vrai code, ce sera mieux : nb, x, y ???)
++
Je te conseille d'essayer (avec le vrai code, ce sera mieux : nb, x, y ???)
++
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
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:
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
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