Attribute VB_Name = "Module1"
'' Empeche la declaration implicite de variables (notamment en cas de
'' faute de frappe)
Option Explicit


'' *****************************************************************************
''
'' les commentaires commencant par '' servent a donner des indications
'' ceux commencant par ' sont des lignes de code désactivées, et à tester
'' ceux comprennant la mention TODO indiquent un énnoncé d'exercice
''
'' *****************************************************************************


'' Rappels: toute variable déclarée en dehors d'une procedure/fonction 
'' est globale, i.e. accessible par toute procedure/fonction.


'' spécifier l'emplacement du tableau des données dans la feuille
Const ligneDebut = 15
Const nIndividu = 20
Const colAge = 2, colTaille = 3, colLabel = 1


'' spécifier l'emplacement du tableau des effectifs par age dans la feuille
Const colonne_resultat_age = 6
Const colonne_resultat_effectif = 7
Const Colonne_resultat_moyenne_taille = 8


Dim nAge As Integer, moyAge As Single, minAge As Integer, maxAge As Integer


'' *****************************************************************************


'' Programme principal coordonnant l'appel de tous les sous-programmes
'' Pour apeller un sous-programme, il suffit d'effectuer:
'' Call  <nom du programme à appeler>


Sub Programme_Principal()

    '' se placer dans la feuille 1    
    Worksheets(1).Activate
    Worksheets(1).Copy after:=Worksheets(3)
    Worksheets(1).Name = "jules"
    
    'Worksheets(1).Range("A1", "L150").ClearContents
    'Worksheets(1).Range("A1", "L150").ClearFormats
    'Call remplirTableau
    'Call mettreEnFormeTableau
    'Worksheets(1).Range("A1", "L150").ClearFormats
    ' Call tableauMultiColor
    ' Worksheets(1).Range("A1", "L150").ClearFormats
    '' copier dans la feuille 2 avec les labels
    'Call copier

    '' se placer dans la feuille 2
    'Worksheets(2).Activate
    '' trier par age
    'Call TrierParAge
    '' Compléter par trier par Taille
    'Call calculEffectifParAge

End Sub


'' *****************************************************************************


Sub remplirTableau()

    MsgBox ("début de remplirTableau()")

    Dim ligne As Integer

    For ligne = ligneDebut To ligneDebut + nIndividu - 1
	Cells(ligne, colAge).Value = Int(Rnd() * (40 - 15) + 15)
	'' TODO: remplir aussi la colonne des poids avec des entiers entre 120 et 210
	Cells(ligne, colTaille).Value = Int(Rnd() * (240 - 140) + 140)
    Next ligne

    ''TODO facultatif: creer une fonction Aleatoire(borne_sup as Integer, borne_inf as Integer)

    Cells(ligneDebut - 1, colAge).Value = "AGE"
    '' TODO: écrire aussi le label POIDS

    MsgBox ("fin remplirTableau()")

End Sub


'' *****************************************************************************

'' Rappel: 
'' Cells(1, 2) ( <=> Cells("A2") ) désignent une seule cellule.
'' Range("A2", "B4") désigne un groupe de cellules
'' ( <=> Range(Cells("A2"), Cells(2, 4)) )


Sub mettreEnFormeTableau()

    MsgBox (" début de mettreEnFormeTableau()")

    Dim plage As Range
    Dim ligneFin As Integer
    ligneFin = ligneDebut + nIndividu - 1

    '' spécification de la plage
    Set plage = Range(Cells(ligneDebut, colAge), Cells(ligneFin, colAge))

    '' modifier les valeurs des propriétés suivantes de la plage
    plage.Interior.ColorIndex = 12
    plage.Borders.LineStyle = 1
    plage.Borders.Weight = 3     '' épaisseur
    plage.Font.Bold = True
    plage.Font.Italic = True

    '' TODO: mettre aussi en forme les poids

    MsgBox (" mettreEnFormeTableau()")

End Sub


'' *****************************************************************************


Sub tableauMultiColor()

    MsgBox (" début de tableauMultiColor()")

    Dim ligne As Integer

    '' TODO: Agir sur la fonction Mod pour que chaque ligne ait une couleur distincte

    For ligne = ligneDebut To ligneDebut + nIndividu - 1
	Range(Cells(ligne, colAge), Cells(ligne, colTaille)).Interior.ColorIndex = ligne Mod 10
    Next ligne

    MsgBox (" fin tableauMultiColor()")

End Sub


'' *****************************************************************************


Sub calculerMoyMinMax()

    MsgBox (" début de calculerMoyMinMax() ")

    '' calcul des moyennes, minimum, maximum

    Dim ligne As Integer, totalAge As Integer
    Dim ageCourant As Integer

    minAge = Cells(ligneDebut, colAge).Value

    For ligne = ligneDebut To ligneDebut + nIndividu - 1
	ageCourant = Cells(ligne, colAge).Value
	totalAge = totalAge + ageCourant
	
	If ageCourant < minAge Then
	   minAge = ageCourant
	End If
    
	''TODO: compléter pour le maximum
	''TODO: compléter pour les poids
    Next ligne

    '' ecrire dans feuille les resultats
    moyAge = totalAge / nIndividu

    ligne = ligneDebut - 2
    Cells(ligne, colLabel).Value = "moyenne"
    Cells(ligne, colAge).Value = moyAge
    ligne = ligneDebut - 3
    Cells(ligne, colLabel).Value = "minimum"
    Cells(ligne, colAge).Value = minAge
    ''TODO: compléter pour les poids

    MsgBox (" fin de calculerMoyMinMax()")

End Sub


'' *****************************************************************************


Sub Copier()
    
    MsgBox ("debut de copier()")

    '' copie par valeur des données + labels
    Dim plage As Range
    Set plage = Range(Cells(ligneDebut - 1, colAge), Cells(ligneDebut + nIndividu - 1, colTaille))
    plage.Copy Worksheets(2).Cells(ligneDebut - 1, colAge)

    MsgBox ("fin de copier()")

End Sub


'' *****************************************************************************


Sub TrierParAge()

    MsgBox ("debut de trierParAge()")

    Dim plage As Range
    '' ne selectionner que les données
    Set plage = Range(Cells(ligneDebut, colAge), Cells(ligneDebut + nIndividu - 1, colTaille))
    plage.Sort Cells(ligneDebut, colAge)

    MsgBox ("fin de trierParAge()")

End Sub


'' *****************************************************************************


Sub TrierParTaille()

    MsgBox ("debut de trierParTaille() Par Taille, --- A COMPLETER --- ")
    ''TODO: ecrire le code
    MsgBox ("fin de trierParTaille()")

End Sub


'' *****************************************************************************


Sub calculEffectifParAge()
   
    MsgBox (" debut de calculEffectifParAge() ")
    MsgBox ("debut de trier() Par Taille, --- A COMPLETER --- ")
    '' on suppose la plage déjà trié par age

    Dim plage As Range
    '' ne selectionner que les données
    Set plage = Range(Cells(ligneDebut, colAge), Cells(ligneDebut + nIndividu - 1 , colTaille))

    '' Définir les compteurs
    Dim ligne As Integer, ligneResultat As Integer
    Dim age As Integer, effectif As Integer
    Dim ageCourant As Integer
    Dim totalTaille As Integer, moyenneTaille As Single


    '' initialiser
    ligneResultat = ligneDebut
    age = Cells(ligneDebut, colAge).Value
    effectif = 1
    totalTaille = Cells(ligneDebut, colTaille).Value

    '' traiter toutes les lignes du tableau
    For ligne = ligneDebut + 1 To ligneDebut + nIndividu - 1
	ageCourant = Cells(ligne, colAge).Value

	If (ageCourant = age) Then
	     effectif = effectif + 1
	     totalTaille = totalTaille + Cells(ligne, colTaille).Value
	Else
	     Cells(ligneResultat, colonne_resultat_age).Value = age
	     Cells(ligneResultat, colonne_resultat_effectif).Value = effectif
	     Cells(ligneResultat, Colonne_resultat_moyenne_taille).Value = totalTaille / effectif
	     age = ageCourant
	     effectif = 1
	     ligneResultat = ligneResultat + 1
	End If
    Next ligne

    ' afficher les labels du tableau des resultats
    Cells(ligneDebut - 1, colonne_resultat_age).Value = "age"
    Cells(ligneDebut - 1, colonne_resultat_effectif).Value = "effectif"
    Cells(ligneDebut - 1, Colonne_resultat_moyenne_taille).Value = "moyenne"

    MsgBox (" fin de calculEffectifParAge() ")

End Sub


'' *****************************************************************************


Sub rechercheParAge()
    
    MsgBox ("debut recherchePar(age)")

    '' recherche de la première occurence d'une valeur
    '' dans un tableau non trié.
    '' "tableau": suite de cellules dans une feuille excel

    Dim ageRecherche As Integer, ageCourant As Integer
    Dim ligne As Integer, ligneTrouve  As Integer
    Dim trouve As Boolean

    ageRecherche = Val(InputBox("entrez l'âge à rechercher"))

    For ligne = ligneDebut To ligneDebut + nIndividu - 1
	ageCourant = Cells(ligne, colAge).Value
	If ageCourant = ageRecherche Then
	   trouve = True
	   ligneTrouve = ligne
	   Exit For
	End If
    Next ligne

    If trouve = True Then
       MsgBox ("j'ai trouvé " & ageRecherche & " à la ligne " & ligneTrouve)
    Else
	MsgBox ("je n'ai pas trouvé " & ageRecherche)
    End If

    MsgBox (" fin de rechercheParAge() ")

End Sub


'' *****************************************************************************
'' La suite du programme est purement facultative
'' *****************************************************************************


Sub calculQuartilesAge()

    MsgBox (" debut de calculQuartilesAge() ")

    '' a partir des tableau des fréquences
    '' nombre total individus déjà connus
    Dim quartile1 As Single, mediane As Single, quartile3 As Single

    Dim quartEffectif As Single, moitieEffectif As Single
    Dim troisQuartEffectif As Single

    quartEffectif = nIndividu / 4
    moitieEffectif = nIndividu / 2
    troisQuartEffectif = nIndividu * 3 / 4

    '' Définir les compteurs
    Dim ligne As Integer
    Dim age As Integer, effectif As Integer
    Dim ageCourant As Integer, ageprecedent As Integer
    Dim cumulEffectifCourant As Integer
    Dim cumulEffectifPrecedent As Integer

    cumulEffectifCourant = 0
    cumulEffectifPrecedent = 0
    ageCourant = Cells(ligneDebut).Value
    ageprecedent = Cells(ligneDebut, colAge).Value

    '' traiter toutes les lignes du tableau
    For ligne = ligneDebut To ligneDebut + nIndividu
	ageCourant = Cells(ligne, colonne_resultat_age).Value
	cumulEffectifPrecedent = cumulEffectifCourant
	cumulEffectifCourant = cumulEffectifCourant + Cells(ligne, colonne_resultat_effectif).Value
  
	If (cumulEffectifCourant >= quartEffectif) And (cumulEffectifPrecedent < quartEffectif) Then
	   quartile1 = (ageCourant - ageprecedent) / (cumulEffectifCourant - cumulEffectifPrecedent) * (quartEffectif - cumulEffectifPrecedent) + ageprecedent
	   '' TODO: continuer avec les deux autres quartiles
	   '' elseif    then
	End If
    Next ligne

    '' afficher les labels du tableau des resultats
    Cells(ligneDebut - 6, colonne_resultat_age).Value = "quartile1: 25%"
    Cells(ligneDebut - 6, colonne_resultat_age + 1).Value = quartile1

    MsgBox (" fin de calculQuartilesAge() ")

End Sub

