Exos de base VBA
Transcription
Exos de base VBA
Programmation VBA/Excel Exercice On désire faire le calcul de la variance d'un tableau de données Excel et l'afficher dans une boite de dialogue. L'interface de saisie est une feuille Excel: Le contenu du tableau est rangé à partir de la cellule A5 , le titre est en A1, le nb de lignes en A2 et le nombre de colonnes en C2. 1) Faire un programme basique de calcul en VBA comprenant la récupération des valeurs, le calcul puis l'affichage 2) Isoler le calcul dans une fonction STD(mon_tableau) dont le paramètre d'entrée est le seul nom du tableau (utiliser un tableau dynamique, rechercher les dimensions du tableau d'entrée et appliquer le calcul) 3) On souhaite que le tableau soit directement sélectionné à la souris. Utiliser les propriétés de l'objet Selection pour récupérer les données. Master ASE – Systèmes d'Information pour l'Industrie – P. Bonnet 27 Programmation VBA/Excel Exercice (solution de base) Sub variance() nb_ligne = Cells(2,2) nb_col = Cells(3,2) ' calcul valeur moyenne du tableau somme = 0 For i = 1 To nb_ligne For j = 1 To nb_col somme = somme + Cells(i + 4, j) Next j Next i moyenne = somme / (nb_col * nb_ligne) ' calcul somme des écarts quadratiques somme_carres = 0 For i = 1 To nb_ligne For j = 1 To nb_col somme_carres = somme_carres + (Cells(i + 4, j) - moyenne)^2 Next j Next i ' calcul écart-type somme_carres = somme_carres / (nb_col * nb_ligne) ecart_type = somme_carres^0.5 MsgBox "L'écart-type des " & nb_ligne * nb_col & " éléments est " & ecart_type End Sub Master ASE – Systèmes d'Information pour l'Industrie – P. Bonnet 28 Programmation VBA/Excel Exercice (solution avec fonction STD et tableau dynamique) Option Base 1 Sub essai() Dim Mon_Tableau() As Double nb_ligne = Cells(2, 2) nb_col = Cells(3, 2) ReDim Mon_Tableau(nb_ligne, nb_col) For i = 1 To nb_ligne For j = 1 To nb_col Mon_Tableau(i, j) = Cells(i + 4, j) Next j Next i MsgBox "L'écart-type des " & nb_ligne * nb_col & " éléments est " & STD(Mon_Tableau) End Sub Function STD(Tableau1() As Double) As Double Nb_elements = (UBound(Tableau1, 1) - LBound(Tableau1, 1) + 1) * ... ...(UBound(Tableau1, 2) - LBound(Tableau1, 2) + 1) moyenne = 0 For i = LBound(Tableau1, 1) To UBound(Tableau1, 1) For j = LBound(Tableau1, 2) To UBound(Tableau1, 2) moyenne = moyenne + Tableau1(i, j) Next j Next i moyenne = moyenne / Nb_Elements somme_carres = 0 For i = LBound(Tableau1, 1) To UBound(Tableau1, 1) For j = LBound(Tableau1, 2) To UBound(Tableau1, 2) somme_carres = somme_carres + (Tableau1(i, j) - moyenne) ^ 2 Next j Next i STD = (somme_carres/Nb_Elements) ^ 0.5 End Function Master ASE – Systèmes d'Information pour l'Industrie – P. Bonnet 29 Programmation VBA/Excel Exercice (solution avec sélection directe et variant) Option Explicit Option Base 1 Sub essai() Dim Mes_Donnees As Variant If TypeName(Selection) = "Range" Then Mes_Donnees = Application.Selection.Value End If MsgBox "L'écart-type des éléments est " & STD(Mes_Donnees) End Sub Function STD(Tableau1 As Variant) As Double Dim i, j, Nb_elements As Integer Dim moyenne, somme_carres As Double Nb_elements = 0 moyenne = 0 For i = LBound(Tableau1, 1) To UBound(Tableau1, 1) For j = LBound(Tableau1, 2) To UBound(Tableau1, 2) Nb_elements = Nb_elements + 1 moyenne = moyenne + Tableau1(i, j) Next j Next i moyenne = moyenne / Nb_elements somme_carres = 0 For i = LBound(Tableau1, 1) To UBound(Tableau1, 1) For j = LBound(Tableau1, 2) To UBound(Tableau1, 2) somme_carres = somme_carres + (Tableau1(i, j) - moyenne) ^ 2 Next j Next i somme_carres = somme_carres / Nb_elements STD = somme_carres ^ 0.5 End Function Master ASE – Systèmes d'Information pour l'Industrie – P. Bonnet 30