Vous êtes sur la page 1sur 11

Développement d’application en VBA Excel

MOISE Ammar
Octobre 2023

Contents
1 Analyse des résultats des élèves lors d’un semestre 2

2 Multiplication matricielle 5

3 Algorithme de recherche dichotomique d’un entier x dans un tableau d’entiers


triés 8

4 Ecrire le pgcd de 2 nombres 10

1
1 Analyse des résultats des élèves lors d’un semestre
Nous allons dans cet exercice étudier les résultats des étudiants du département GIMA-ID durant le
semestre S7 de cette deuxième année. Le but est d’étudier le grade d’un élève qui va lui servir pour
son GPA. En plus de cela nous allons déterminer si l’élève en question peut passer ou s’il est obligé
de redoubler. Nous allons donc déterminer cela avec deux méthodes: la moyenne arithmétique et
la moyenne quadratique. Pour rappel, voici les équivalences notes et grades.

Moyenne Générale Appréciation


18-20 A
16-18 B
14-16 C
12-14 D
10-12 E
< 10 Redoublement

Nous allons d’abord générer aléatoirement les moyennes des élèves du département dans plusieurs
matières. Les moyennes seront comprises entre 7 et 20.Pour ce faire nous utilisons la fonction
ALEA.ENTRE.BORNES Voici le code et le résulat.

==ALEA.ENTRE.BORNES(7;20)

Nom Génie Industriel VBA Analyse de Données Théorie des jeux Anglais
Aliotti 6 17 18 18 15
Bouaouda 11 11 13 12 14
Chemin 5 7 15 16 17
Foubert 18 17 19 5 18
Danielgb 7 8 15 12 18
Godard 18 6 10 12 9
Guella 17 10 9 15 10
Hra 11 8 17 6 15
Lahmidi 14 19 19 5 16
Lamkadmi 6 6 18 13 19
Le-Douarec 14 17 20 15 14
Letartre 6 10 16 15 15
Maurin 17 8 6 10 16
Moise 7 12 20 13 8
Oulahna 10 19 17 19 8
Rahali 11 10 20 15 5
Reilhes 12 19 10 5 19
Speismann 7 7 14 5 13
Sutty 20 14 11 5 6
Tran-Ruesche 10 18 9 12 12
Aboubacker 12 18 13 16 14

2
Nous allons à présent traiter ces données à l’aide de VBA. Pour cela nous allons calculer la
moyenne générale de chaque élève, puis définir le grade associé et enfin décider le passage ou le
redoublement de l’étudiant.

Nom Moyenne Grade Passage ou Redoublement


Aliotti 14,8 C Passage
Bouaouda 12,2 D Passage
Chemin 12 D Passage
Foubert 15,4 C Passage
Danielgb 12 D Passage
Godard 11 E Passage
Guella 12,2 D Passage
Hra 11,4 E Passage
Lahmidi 14,6 C Passage
Lamkadmi 12,4 D Passage
Le-Douarec 16 B Passage
Letartre 12,4 D Passage
Maurin 11,4 E Passage
Moise 12 D Passage
Oulahna 14,6 C Passage
Rahali 12,2 D Passage
Reilhes 13 D Passage
Speismann 9,2 F Redoublement
Sutty 11,2 E Passage
Tran-Ruesche 12,2 D Passage
Aboubacker 14,6 C Passage

Voici le code VBA associé à notre étude.

1 Sub CalculateMeansAndGrades()
2 Dim ws As Worksheet
3 Set ws = ThisWorkbook.Sheets("Notes")
4

5 ws.Cells(1, 7).Value = "Moyenne"


6 ws.Cells(1, 8).Value = "Grade"
7 ws.Cells(1, 9).Value = "Passage ou Redoublement"
8

9 Dim lastRow As Long


10 lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
11

12 Dim i As Long
13

14 For i = 2 To lastRow
15 ’ Calculate arithmetic mean
16 Dim sum As Double
17 sum = 0
18 For j = 2 To 6 ’ Columns B to F

3
19 sum = sum + ws.Cells(i, j).Value
20 Next j
21 ws.Cells(i, 7).Value = sum / 5
22

23 ’ Calculate grade based on the mean


24 Dim mean As Double
25 mean = ws.Cells(i, 7).Value
26

27 Select Case mean


28 Case Is >= 18
29 ws.Cells(i, 8).Value = "A"
30 Case 16 To 17.99
31 ws.Cells(i, 8).Value = "B"
32 Case 14 To 15.99
33 ws.Cells(i, 8).Value = "C"
34 Case 12 To 13.99
35 ws.Cells(i, 8).Value = "D"
36 Case 10 To 11.99
37 ws.Cells(i, 8).Value = "E"
38 Case Else
39 ws.Cells(i, 8).Value = "F"
40 End Select
41

42 If mean < 10 Then


43 ws.Cells(i, 9).Value = "Redouble"
44 Else
45 ws.Cells(i, 9).Value = "Passage"
46 End If
47 Next i
48 End Sub

4
2 Multiplication matricielle
Nous allons effectuer la multiplication matricielle de deux matrices sur Excel grâce à VBA. Pour ce
faire, nous allons appliquer la célèbre formule calculant coefficient par coefficient et qui ne fonctionne
que si le nombre de colonne de la 1ère matrice est égal au nombre de colonnes de la 2ème. C’est
d’ailleur traité dans la 1ère partie de notre code VBA qui renvoie un message d’erreur si cette
condition n’est pas vérifiée.

2 Function MultiplicationdeMatrices(matrixA As Range, matrixB As Range) As Variant


3 ’ Vrifier que les dimensions des matrices sont compatibles pour la multiplication
4 If matrixA.Columns.Count <> matrixB.Rows.Count Then
5 MsgBox "Le nombre de colonnes de la matrice A doit tre gal au nombre de lignes de
la matrice B pour effectuer la multiplication.", vbExclamation
6 Exit Function
7 End If
8

9 Dim resultMatrix() As Variant


10 Dim rowsA As Long, colsA As Long, rowsB As Long, colsB As Long
11 Dim i As Long, j As Long, k As Long
12

13 ’ Obtenir les dimensions des matrices


14 rowsA = matrixA.Rows.Count
15 colsA = matrixA.Columns.Count
16 rowsB = matrixB.Rows.Count
17 colsB = matrixB.Columns.Count
18

19 ’ Initialiser la matrice rsultante


20 ReDim resultMatrix(1 To rowsA, 1 To colsB)
21

22 ’ Effectuer la multiplication
23 For i = 1 To rowsA
24 For j = 1 To colsB
25 resultMatrix(i, j) = 0
26 For k = 1 To colsA
27 resultMatrix(i, j) = resultMatrix(i, j) + matrixA.Cells(i, k).Value *
matrixB.Cells(k, j).Value
28 Next k
29 Next j
30 Next i
31

32 ’ Renvoyer la matrice resultante


33 MultiplicationdeMatrices = resultMatrix
34 End Function

Afin de simplifier l’usage de cet outil, nous avons décide de coder sous VBA un message(box)
qui demande à l’utilisateur de spécifier les plages de chacunes des deux matrices à multiplier (par
exemple A1:B6 pour la 1ère); et enfin de spécifier la plage où voudrait que la matrice résultante
s’affiche.

5
Figure 1: Multiplication de deux matrices

Voici le code :

1 Sub MultiplyMatricesWithFormulaMain()
2 ’ Demander l’utilisateur de spcifier la plage de la matrice A
3 On Error Resume Next ’ Permettre l’utilisateur d’annuler la bote de dialogue
4 Dim rangeA As Range
5 Set rangeA = Application.InputBox("Slectionnez la plage de la matrice A Par exemple:
A1:B6", Type:=8)
6 On Error GoTo 0 ’ Ractiver la gestion des erreurs
7

8 If rangeA Is Nothing Then


9 MsgBox "Vous avez annul la slection de la plage pour la matrice A.", vbInformation
10 Exit Sub
11 End If
12

13 ’ Demander l’utilisateur de spcifier la plage de la matrice B


14 On Error Resume Next
15 Dim rangeB As Range
16 Set rangeB = Application.InputBox("Slectionnez la plage de la matrice B.Par exemple:
A1:B6:", Type:=8)
17 On Error GoTo 0
18

19 If rangeB Is Nothing Then


20 MsgBox "Vous avez annul la slection de la plage pour la matrice B.", vbInformation
21 Exit Sub
22 End If
23

24 ’ Demander l’utilisateur de spcifier la plage pour stocker le rsultat


25 On Error Resume Next

6
26 Dim resultRange As Range
27 Set resultRange = Application.InputBox("Slectionnez la plage o stocker le rsultat de
la multiplication des matrices:", Type:=8)
28 On Error GoTo 0
29

30 If resultRange Is Nothing Then


31 MsgBox "Vous avez annul la slection de la plage pour le rsultat.", vbInformation
32 Exit Sub
33 End If
34

35 ’ Effectuer la multiplication des matrices en utilisant la formule


36 resultRange.Value = MultiplyMatricesWithFormula(rangeA, rangeB)
37

38 MsgBox "La multiplication des matrices a ete effectue avec succes. Le rsultat a t
place dans la plage specifiee.", vbInformation
39 End Sub

7
3 Algorithme de recherche dichotomique d’un entier x dans
un tableau d’entiers triés
On se propose à présent de de rechercher de manière dichotomique un entier x dans un tableau trié.
La recherche dichotomique est une recherche de complexité logarithmique il ne faudrait donc pas
implémenter de fontions annexes de complexité plus grande.
On demande d’abord à notre utilisateur de spécifier la plage de son tableau d’entiers.Par exem-
ple, une plage est soit une ligne soit une colonne (A1:A165 ou C23:O23). Comme dans le précédent
algorithme on peut code une interface pour demander la plage à l’utilisateur.
Puis on applique notre algorithme de recherche dichotomique avec le pivot et divisant succes-
sivement notre problème en 2. Voici un exemple pour un tableau très simple:

Figure 2: Recherche dichotomique

Voici le code associé à cet exercice:

1 Sub RechercheDichotomique()
2 Dim plage As Range
3 Dim elementRecherche As Integer
4 ’ Demander l’utilisateur de spcifier la plage
5 On Error Resume Next
6 Set plage = Application.InputBox("Slectionnez une plage :", Type:=8)
7 On Error GoTo 0
8 If plage Is Nothing Then
9 MsgBox "Aucune plage slectionne . Le programme va se terminer."
10 Exit Sub
11 End If

8
12 ’ Demander l’utilisateur de spcifier l’ lment rechercher
13 On Error Resume Next
14 elementRecherche = InputBox("Entrez l’lment rechercher :")
15 On Error GoTo 0
16 If elementRecherche = 0 Then
17 MsgBox "Aucun lment spcifi . Le programme va se terminer."
18 Exit Sub
19 End If
20 ’ Appliquer l’algorithme de recherche dichotomique
21 Dim celluleTrouvee As Range
22 Set celluleTrouvee = RechercheDichotomiqueDansPlage(plage, elementRecherche)
23

24 ’ Afficher le rsultat
25 If Not celluleTrouvee Is Nothing Then
26 MsgBox "L’ lment " & elementRecherche & " a t trouv dans la cellule " &
celluleTrouvee.Address
27 Else
28 MsgBox "L’ lment " & elementRecherche & " n’a pas t trouv dans la plage
spcifie ."
29 End If
30 End Sub
31

32 Function RechercheDichotomiqueDansPlage(plage As Range, elementRecherche As Integer) As


Range
33 Dim debut As Long
34 Dim fin As Long
35 Dim milieu As Long
36

37 debut = 1
38 fin = plage.Rows.Count
39

40 Do While debut <= fin


41 milieu = (debut + fin) \ 2
42

43 If plage.Cells(milieu, 1).value = elementRecherche Then


44 ’ lment trouv , retourner la cellule
45 Set RechercheDichotomiqueDansPlage = plage.Cells(milieu, 1)
46 Exit Function
47 ElseIf plage.Cells(milieu, 1).value < elementRecherche Then
48 ’ Rechercher dans la moiti suprieure
49 debut = milieu + 1
50 Else
51 ’ Rechercher dans la moiti infrieure
52 fin = milieu - 1
53 End If
54 Loop
55

56 ’ lment non trouv ,


57 Set RechercheDichotomiqueDansPlage = Nothing
58 End Function

9
4 Ecrire le pgcd de 2 nombres
Nous allons dans cet exercice calculer le pgcd de deuc nombres en utilisant l’algorithme d’Euclide.
Comme dans les deux précédents exercices, nous allons coder une interface sous VBA permettant
d’indiquer le 1er nombre puis le 2ème nombre. Voici des illustrations de notre interface:

Figure 3: Interface de l’exercice du PGCD

Figure 4: PGCD de deux nombres

Ci-dessous le code associé:

1 Sub CalculerPGCDDeuxNombres()
2 ’ Demander l’utilisateur de spcifier les deux nombres
3 Dim n1 As Integer
4 Dim n2 As Integer

10
5

6 On Error Resume Next


7 n1 = InputBox("Entrez le premier nombre :")
8 On Error GoTo 0
9

10 If n1 = 0 Then
11 MsgBox "Aucun nombre spcifi . Le programme va se terminer."
12 Exit Sub
13 End If
14

15 On Error Resume Next


16 n2 = InputBox("Entrez le deuxime nombre :")
17 On Error GoTo 0
18

19 If n2 = 0 Then
20 MsgBox "Aucun nombre spcifi . Le programme va se terminer."
21 Exit Sub
22 End If
23

24 ’ Calculer le PGCD des deux nombres


25 Dim pgcd As Integer
26 pgcd = CalculerPGCD(n1, n2)
27

28 ’ Afficher le rsultat
29 MsgBox "Le PGCD de " & n1 & " et " & n2 & " est " & pgcd
30 End Sub
31

32 Function CalculerPGCD(ByVal a As Integer, ByVal b As Integer) As Integer


33 ’ Algorithme d’Euclide pour calculer le PGCD
34 Do While b <> 0
35 Dim temp As Integer
36 temp = b
37 b = a Mod b
38 a = temp
39 Loop
40

41 CalculerPGCD = a
42 End Function

11

Vous aimerez peut-être aussi