Aide VBA (correction annal 2) - VB/VBA/VBS - Programmation
Marsh Posté le 10-10-2013 à 21:46:22
gebruiko a écrit : Question 2 : |
La lisibilité d'un programme est une affaire assez importante dans le monde professionnel, mais qui est assez négligée dans le monde scolaire.
Voici mes conseils :
1. Mettre le plus possible de commentaires. Notamment, mettre un bloc de commentaires en haut du programme, au début de chaque fonction ou procédure, et un peu partout dans le code. Au total, il faut un quart à un tiers de lignes de commentaires.
2. Choisir des noms de variables qui donnent des informations sur le contenu de la variable et sur son type. Donc ce sera des noms assez longs, mais il vaut mieux ça que des noms trop courts.
3. Choisir des noms de fonctions et de procédures qui donnent des informations sur ce qu'il font.
4. Indenter correctement (ce que vous appelez peut-être "ajuster la marge" ).
Marsh Posté le 11-10-2013 à 19:21:19
Merci beaucoup pour ces précieux conseils.
Auriez vous une idée pour la question 4 ?
Je pense qu'il faut modifier/ajouter quelque chose dans le fichier en question, mais je ne sais pas quoi exactement.
Marsh Posté le 11-10-2013 à 22:25:45
gebruiko a écrit : |
Le résultat est un nombre entier de coups pour réussir à mettre la balle de golf dans le trou.
Je devine que ce nombre est stocké dans Joueurs(x).Trou(y).
Et je devine qu'il est possible qu'un joueur ne parvienne pas à mettre une balle dans certain trou, par exemple parce qu'il perd la balle dans un lac, ou parce que la nuit tombe avant qu'il n'ait eu le temps de finir son parcours, ou parce qu'il abandonne avant la fin. Donc, il est possible que Joueurs(x).Trou(y) ne contienne rien.
En voyant le code de remplissage des Joueurs(x).Trou(y), on s'aperçoit qu'il y manquera des valeurs.
Pour faire une somme, on a la solution bourin que j'aime bien qui est de faire une boucle sur chaque élément et de tester si c'est vide et d'additionner ou pas. Ou alors, on peut utiliser des raccourcis du genre de NB.SI ou countif().
gebruiko a écrit : Question 3 : |
Quand il n'y a que deux choix, un if then else end if est plus lisible qu'un select, case à mon humble avis, mais ce n'est pas très important.
Et au lieu de tester 6 et 7, il est plus lisible de tester vbYes et vbNo.
Marsh Posté le 12-10-2013 à 13:05:22
olivthill a écrit : |
Alors dans cet exemple, les joueurs vont jusqu'au bout des 18 trous.
Schématiquement (puisque je ne peux pas copier le tableau):
Participant
Nom Prénom Parcours Date
Potreau Gilles Forêt Verte 10/10/2011
B ... ... ...
C
D
E
F
Trou1 Trou 2 Trou3 Trou4 Trou5 Trou6 Trou7 Trou8 Trou9 Aller
Trou10 Trou11 Trou12 Trou13 ... Trou 18 Retour Total
=> La range "A3" Correspond donc à Potreau. La case Total correspond à Y1 (Y2: nombre de coups qu'on doit normalement faire, Y3: coups du joueur 1 (ici Potreau). Donc A3:Y3 forme bien une seule et même ligne, correspondant aux divers caractéristiques du joueur1 (potreau).
Effectivement faire une boucle de type:
Do Until IsEmpty(ActiveCell.Offset(x + 1, 0))
Call chargement_base(x, Joueurs)
x = x + 1
Loop
Semble bien adapter pour lire le nombre de joueurs verticalement (nombre de lignes)
Mais dans ce cas, à quoi servent les For ... To du fichier en question ??
On peut faire la même chose pour le nombre de colonnes avec une variable y:
Do Until IsEmpty(ActiveCell.Offset(x+1, 4+y))
y = y + 1
Loop
Mais là encore à quoi servent les For ... To du sujet ?
C'est une autre façon de faire une boucle alors ? Mais la question est déjà traitée alors, non ? Je ne pige pas.
Pourriez me formuler le programme en codes s'il vous plait ?
olivthill a écrit : |
Effectivement.
Marsh Posté le 12-10-2013 à 13:32:26
Citation : créez une procédure appelée « Compte_Joueurs » |
Les boucles For...To sont dans une procédure appelée « Chargement_Base»
Donc, je comprends qu'il y a une procédure de faite, mais qu'il faut en faire une autre.
Le but de la nouvelle procédure, Compte_Joueurs, n'est pas de transférer des données depuis la grille Excel vers un tableau en mémoire, mais de faire une petite synthèse des données.
Cette synthèse peut se faire, soit à partir des données de la grille, soit à partir du tableau en mémoire, puisqu'ils sont équivalents.
Faire un décompte en mémoire est théoriquement plus rapide et c'est peut-être ce qui est attendu par le professeur.
Le nombre de joueurs qui ont des résultats n'est pas forcément égal au nombre total de joueurs parce que certains joueurs peuvent abandonner ou autres.
Faire une boucle Do until est peut-être la solution. Cela revient au même que de faire For...Next avec un exit for sur une condition.
Marsh Posté le 13-10-2013 à 13:52:41
Oui, mais d'une part, ce n'est pas gênant que plusieurs forums cherchent à répondre à la même question, et d'autre part, on est meilleur ici, car un HFRien n'aurait jamais écrit la phrase suivante :
Citation : Il t'est demandé une procédure Sub car l'argument est passé par référence et il est donc modifié dans la Sub |
- Le HFRien sait que le mot argument est de l'anglais et que sa traduction en français est le mot paramètre.
- Le HFRien sait que le passage de données par référence est possible, aussi bien avec les sub qu'avec les function.
Par ailleurs, un HFRien ne va pas donner une solution qui se base sur une lecture des cellules de la grille, alors qu'on dispose d'un tableau en mémoire qui permet d'avoir un code plus optimisé et qui répond mieux à l'esprit du devoir.
En plus, nous on a de bons smileys
Marsh Posté le 10-10-2013 à 13:34:39
Tout d'abord, un gros merci pour la réponse construite du 1er sujet. Cela m'a permis de mieux comprendre les bases. On aborde maintenant maintenant les boucles et les conditions sous VBA. Voilà un sujet type d'annale.
Question 1 :
Dans le module appelé « Résultats », créez un nouveau type de variable, appelé « Joueur »
comportant les caractéristiques suivantes :
« Nom » de type « String »,
« Prénom » de type « String »,
« Date » de type « Date » ,
« Parcours » de type « String »
« Trou » (champ tableau comportant 18 emplacements) de type « Byte ».
=> Je pense qu'il faut écrire:
Type Joueur
Nom as string
Prénom as string
Date as Date
Parcours as String
trou(18) as byte
Question 2 :
Améliorez la lisibilité de la procédure « Chargement_Base ».
=> Je crois qu'il faut ajuster à la marge les différentes instructions
Question 3 :
Écrivez une procédure1 devant s'exécuter à l'ouverture du classeur et assurer les tâches
suivantes :
• appeler la procédure « Chargement_Base » ;
• afficher la boîte de dialogue ci-contre ; "Voulez vous saisir un nouveau parcours (Bouton OUI) ou examiner les résultats (Bouton NON) ?
• si l'opérateur appuie sur « Oui », appeler
la procédure « Entrée » ;
• si l'opérateur appuie sur « Non », appeler
la procédure « Analyse ».
=> J'ai mis:
Private Sub Workbook_Open()
Call Chargement_Base
Sub Select_Case()
Dim Réponse As Byte
Réponse = MsgBox("Voulez vous saisir un nouveau parcours(bouton OUI) ou examiner les résultats (bouton NON).", vbYesNo)
Select Case Réponse
Case 6
Call Entrée
Case 7
Call Analyse
End Sub
Question 4 :
Dans le module « Résultat », créez une procédure appelée « Compte_Joueurs » déterminant le
nombre de lignes de la feuille « Base » comportant des résultats de joueurs.
=> Pas du tout compris --'
LE FICHIER du sujet se présente sous la forme suivante:
Sub Chargement_Base()
Dim Joueurs() As Joueur
Dim Nb_Joueurs As Integer
Dim x As Integer
Range("A3" ).Select
Call Compte_Joueurs(Nb_Joueurs)
ReDim Joueurs(Nb_Joueurs - 1)
For x = 0 To Nb_Joueurs - 1
Joueurs(x).Nom = ActiveCell.Offset(x, 0).Value
Joueurs(x).Prénom = ActiveCell.Offset(x, 1).Value
Joueurs(x).Parcours = ActiveCell.Offset(x, 2).Value
Joueurs(x).Date = ActiveCell.Offset(x, 3).Value
For y = 0 To 8
Joueurs(x).Trou(y) = ActiveCell.Offset(x, 4 + y).Value
Next
For y = 0 To 8
Joueurs(x).Trou(y + 9) = ActiveCell.Offset(x, 14 + y).Value
Next
Next
End Sub