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

Documents pareils