Voici le point de départ de l'exercice (la base de données a été réduite à 1000 lignes) :
Le fichier : tableaux_exercice.xls
Sub mettre_a_jour()
Dim derniere_ligne As Integer
'Dernière ligne de la base de données
'...
'Enregistrement de la base de données dans un tableau dynamique
Dim tab_bd()
'...
End Sub
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Une solution :.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Sub mettre_a_jour()
Dim derniere_ligne As Integer
'Dernière ligne de la base de données
derniere_ligne = Sheets("BD").Range("A1").End(xlDown).Row
'Enregistrement de la base de données 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 va maintenant falloir transformer cette macro pour :
- Déterminer le choix de l'utilisateur ("OUI" ou "NON")
- Calculer le nombre de "OUI" ou "NON" de la base de données pour définir la taille du tableau (Redim)
- Enregistrer dans le tableau uniquement les lignes de la base de données avec "OUI" ou "NON" (il n'est donc plus utile d'enregistrer la 3e colonne)
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
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
'Dernière ligne de la base de données
derniere_ligne = Sheets("BD").Range("A1").End(xlDown).Row
'Valeur recherchée (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 données 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
'Valeur recherchée (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)
ReDim tab_bd(taille - 1, 1)
'N° d'insertion dans le tableau
ligne_insertion = 0
'Parcours de la base de données
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 enregistrée
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é enregistrée => le n° d'insertion dans le tableau augmente de 1
ligne_insertion = ligne_insertion + 1
End If
Next
Il nous reste encore à :
- Parcourir chaque cellule du "tableau" de la feuille "RES" à l'aide de 2 boucles (même principe que l'exercice du damier)
- Et y ajouter le nombre total d'entrées du tableau correspondant à l'année et au n° de client pour chaque cellule
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Une solution :.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
'Décomptes 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
'Boucle pour chaque ligne
For annee = 2011 To 2026
'Boucle pour chaque colonne
For no_client = 1 To 30
'Compteur réinitialisé
compteur = 0
'Parcours du tableau
For i = 0 To UBound(tab_bd)
'Vérifie si la ligne du tableau correspond à l'année et au n° de client
If Year(tab_bd(i, 0)) = annee And tab_bd(i, 1) = no_client Then
'Si l'année et le n° de client correspondent, le compteur augmente de 1
compteur = compteur + 1
End If
Next
'Après avoir parcouru le tableau, le total est entré dans la cellule correspondante
Cells(annee - 2009, no_client + 1) = compteur
Next
Next
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
'Dernière ligne de la base de données
derniere_ligne = Sheets("BD").Range("A1").End(xlDown).Row
'Valeur recherchée (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 données 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
'Décomptes 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
Aucun commentaire:
Enregistrer un commentaire