Vous êtes sur la page 1sur 5

Cours VBA : utilisations des tableaux (exercice) http://www.excel-pratique.com/fr/vba/tableaux_vba_exercice.

php

Pour mettre en pratique l'utilisation des tableaux, vous allez raliser par tapes la macro qui a servi
d'exemple pour dmontrer la rapidit des tableaux ...

Voici le point de dpart de l'exercice (la base de donnes a t rduite 1000 lignes) :

Le fichier : tableaux_exercice.xls

Objectif de l'exercice : la procdure devra parcourir la base de donnes en boucle et comptabiliser pour chaque anne et chaque n de client le nombre de "OUI"
ou "NON" (selon le choix de l'utilisateur) et entrer ce dcompte dans la cellule correspondante.

Compltez la macro suivante pour enregistrer la base de donnes de la feuille "BD" dans un tableau :

Sub mettre_a_jour()
Dim derniere_ligne As Integer

'Dernire ligne de la base de donnes


'...

'Enregistrement de la base de donnes dans un tableau dynamique


Dim tab_bd()
'...

End Sub

1 of 5 16/10/2016 14:27
Cours VBA : utilisations des tableaux (exercice) http://www.excel-pratique.com/fr/vba/tableaux_vba_exercice.php
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

Une solution :

Sub mettre_a_jour()
Dim derniere_ligne As Integer

'Dernire ligne de la base de donnes


derniere_ligne = Sheets("BD").Range("A1").End(xlDown).Row

'Enregistrement de la base de donnes dans un tableau dynamique


Dim tab_bd()
ReDim tab_bd(derniere_ligne - 2, 2)

For ligne = 2 To derniere_ligne


tab_bd(ligne - 2, 0) = Sheets("BD").Range("A" & ligne)
tab_bd(ligne - 2, 1) = Sheets("BD").Range("B" & ligne)
tab_bd(ligne - 2, 2) = Sheets("BD").Range("C" & ligne)
Next
End Sub

Il ne s'agit l que d'une rptition de ce qui a t vu la page prcdente ...

Il va maintenant falloir transformer cette macro pour :

Dterminer le choix de l'utilisateur ("OUI" ou "NON")


Calculer le nombre de "OUI" ou "NON" de la base de donnes pour dfinir la taille du tableau (Redim)
Enregistrer dans le tableau uniquement les lignes de la base de donnes avec "OUI" ou "NON" (il n'est donc plus utile d'enregistrer la 3e colonne)

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

2 of 5 16/10/2016 14:27
Cours VBA : utilisations des tableaux (exercice) http://www.excel-pratique.com/fr/vba/tableaux_vba_exercice.php
.
.
.
.
.
.
.
.
.
.

Une solution :

Sub mettre_a_jour()
Dim derniere_ligne As Integer, valeur_recherchee As String, ligne_insertion As Integer, valeur_oui_non As String, taille As Integer

'Dernire ligne de la base de donnes


derniere_ligne = Sheets("BD").Range("A1").End(xlDown).Row

'Valeur recherche (OUI ou NON)


If Sheets("RES").OptionButton_oui.Value = True Then
valeur_recherchee = "OUI"
Else
valeur_recherchee = "NON"
End If

'Nombre de OUI ou NON


taille = WorksheetFunction.CountIf(Sheets("BD").Range("C2:C" & derniere_ligne), valeur_recherchee)

'Enregistrement de la base de donnes dans un tableau


Dim tab_bd()
ReDim tab_bd(taille - 1, 1)

ligne_insertion = 0

For ligne = 2 To derniere_ligne


valeur_oui_non = Sheets("BD").Range("C" & ligne)
If valeur_oui_non = valeur_recherchee Then
tab_bd(ligne_insertion, 0) = Sheets("BD").Range("A" & ligne)
tab_bd(ligne_insertion, 1) = Sheets("BD").Range("B" & ligne)
ligne_insertion = ligne_insertion + 1
End If
Next
End Sub

Le choix de l'utilisateur est tout d'abord dtermin grce :

'Valeur recherche (OUI ou NON)


If Sheets("RES").OptionButton_oui.Value = True Then
valeur_recherchee = "OUI"
Else
valeur_recherchee = "NON"
End If

La fonction NB.SI (Countif) a t utilise pour calculer le nombre de OUI ou de NON :

'Nombre de OUI ou NON


taille = WorksheetFunction.CountIf(Sheets("BD").Range("C2:C" & derniere_ligne), valeur_recherchee)

La taille du tableau a t adapte au nombre de OUI ou de NON et rduite 2 colonnes :

ReDim tab_bd(taille - 1, 1)

Les donnes sont ensuite enregistres dans le tableau si la valeur de la 3e colonne correspond au choix de l'utilisateur :

'N d'insertion dans le tableau


ligne_insertion = 0

'Parcours de la base de donnes


For ligne = 2 To derniere_ligne
'Valeur de la colonne C (OUI ou NON)
valeur_oui_non = Sheets("BD").Range("C" & ligne)
'Si la valeur correspond au choix de l'utilisateur, la ligne est enregistre
If valeur_oui_non = valeur_recherchee Then
'Enregistrement de la valeur de la colonne A
tab_bd(ligne_insertion, 0) = Sheets("BD").Range("A" & ligne)
'Enregistrement de la valeur de la colonne B
tab_bd(ligne_insertion, 1) = Sheets("BD").Range("B" & ligne)
'Une ligne a t enregistre => le n d'insertion dans le tableau augmente de 1
ligne_insertion = ligne_insertion + 1
End If
Next

3 of 5 16/10/2016 14:27
Cours VBA : utilisations des tableaux (exercice) http://www.excel-pratique.com/fr/vba/tableaux_vba_exercice.php

Le tableau ne contient plus que les donnes qui nous intressent.

Il nous reste encore :

Parcourir chaque cellule du "tableau" de la feuille "RES" l'aide de 2 boucles (mme principe que l'exercice du damier)
Et y ajouter le nombre total d'entres du tableau correspondant l'anne et au n de client pour chaque cellule

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

Une solution :

'Dcomptes de "OUI"/"NON"
For annee = 2011 To 2026
For no_client = 1 To 30
compteur = 0
For i = 0 To UBound(tab_bd)
If Year(tab_bd(i, 0)) = annee And tab_bd(i, 1) = no_client Then
compteur = compteur + 1
End If
Next
Cells(annee - 2009, no_client + 1) = compteur
Next
Next

La solution en dtails :

'Boucle pour chaque ligne


For annee = 2011 To 2026
'Boucle pour chaque colonne
For no_client = 1 To 30
'Compteur rinitialis
compteur = 0
'Parcours du tableau
For i = 0 To UBound(tab_bd)
'Vrifie si la ligne du tableau correspond l'anne et au n de client
If Year(tab_bd(i, 0)) = annee And tab_bd(i, 1) = no_client Then
'Si l'anne et le n de client correspondent, le compteur augmente de 1
compteur = compteur + 1
End If
Next
'Aprs avoir parcouru le tableau, le total est entr dans la cellule correspondante
Cells(annee - 2009, no_client + 1) = compteur
Next
Next

Et pour finir, la macro complte :

4 of 5 16/10/2016 14:27
Cours VBA : utilisations des tableaux (exercice) http://www.excel-pratique.com/fr/vba/tableaux_vba_exercice.php
Sub mettre_a_jour()
Dim derniere_ligne As Integer, valeur_recherchee As String, ligne_insertion As Integer, valeur_oui_non As String, taille As Integer,
compteur As Integer

'Suppression du contenu
Range("B2:AE17").ClearContents

'Dernire ligne de la base de donnes


derniere_ligne = Sheets("BD").Range("A1").End(xlDown).Row

'Valeur recherche (OUI ou NON)


If Sheets("RES").OptionButton_oui.Value = True Then
valeur_recherchee = "OUI"
Else
valeur_recherchee = "NON"
End If

'Nombre de OUI ou NON


taille = WorksheetFunction.CountIf(Sheets("BD").Range("C2:C" & derniere_ligne), valeur_recherchee)

'Enregistrement de la base de donnes dans un tableau


Dim tab_bd()
ReDim tab_bd(taille - 1, 1)

ligne_insertion = 0

For ligne = 2 To derniere_ligne


valeur_oui_non = Sheets("BD").Range("C" & ligne)
If valeur_oui_non = valeur_recherchee Then
tab_bd(ligne_insertion, 0) = Sheets("BD").Range("A" & ligne)
tab_bd(ligne_insertion, 1) = Sheets("BD").Range("B" & ligne)
ligne_insertion = ligne_insertion + 1
End If
Next

'Dcomptes de OUI ou NON


For annee = 2011 To 2026
For no_client = 1 To 30
compteur = 0
For i = 0 To UBound(tab_bd)
If Year(tab_bd(i, 0)) = annee And tab_bd(i, 1) = no_client Then
compteur = compteur + 1
End If
Next
Cells(annee - 2009, no_client + 1) = compteur
Next
Next
End Sub

Et le fichier : tableaux_exercice_complete.xls

5 of 5 16/10/2016 14:27