- Thème : plages et cellules (objets Range) | Durée : 35 min | Niveau : intermédiaire.
- Classeur de départ :
VBA13_commandes.xlsm (feuilles Commandes et Archive). - Contexte : le rapport des commandes de novembre doit être nettoyé et présenté avant diffusion. Vous désignez des plages par Range, Cells, Rows, CurrentRegion, Offset et Resize, vous supprimez et insérez des lignes, puis vous copiez le résultat dans la feuille Archive.
- Ouvrir le classeur, puis l'éditeur Visual Basic (Alt+F11) et le module
Module1. - Mettre en forme les en-têtes : macro
MettreEnFormeEntetes. - Supprimer les commandes annulées (quantité 0) : macro
SupprimerAnnulees. - Ajouter la ligne Total : macro
AjouterTotal. - Insérer deux lignes pour le titre : macro
InsererTitre. - Copier le rapport dans la feuille Archive : macro
Archiver. - Répondre au questionnaire de fin de lab (5 questions, 80 % pour valider).
Mettre en forme les en-têtes
Sub MettreEnFormeEntetes()
Dim feuille As Worksheet, plageZone As Range
Set feuille = ThisWorkbook.Worksheets("Commandes")
Set plageZone = feuille.Range("A1:E1")
plageZone.Font.Bold = True
plageZone.Interior.Color = RGB(221, 235, 247)
End Sub
- Une variable Range désigne une plage : on l'affecte une fois avec Set, puis on la réutilise. Le code est plus lisible et la plage n'est écrite qu'à un seul endroit.
- Résultat attendu :
- A1:E1 en gras sur fond bleu clair (RGB 221, 235, 247)
Supprimer les commandes annulées
Sub SupprimerAnnulees()
Dim feuille As Worksheet
Dim ligne As Long, derniere As Long
Set feuille = ThisWorkbook.Worksheets("Commandes")
derniere = feuille.Cells(feuille.Rows.Count, 1).End(xlUp).Row
For ligne = derniere To 2 Step -1
If feuille.Cells(ligne, 4).Value = 0 Then
feuille.Rows(ligne).Delete
End If
Next ligne
End Sub
- Supprimer une ligne décale les suivantes vers le haut. En parcourant de la dernière ligne vers la première (Step -1), aucune ligne n'est sautée.
- Résultat attendu :
- Les trois commandes à quantité 0 ont disparu (8 commandes restantes)
- L'ordre des autres commandes est conservé (CMD-2611 en ligne 2, CMD-2621 en ligne 9)
Sub AjouterTotal()
Dim feuille As Worksheet, plageZone As Range
Dim derniere As Long
Set feuille = ThisWorkbook.Worksheets("Commandes")
Set plageZone = feuille.Range("A1").CurrentRegion
derniere = plageZone.Rows.Count
Set plageZone = plageZone.Offset(1).Resize(plageZone.Rows.Count - 1)
feuille.Cells(derniere + 1, 1).Value = "Total"
feuille.Cells(derniere + 1, 5).Value = WorksheetFunction.Sum(plageZone.Columns(5))
feuille.Range("A1").Offset(derniere, 0).Resize(1, 5).Font.Bold = True
End Sub
- CurrentRegion renvoie le bloc de données autour d'une cellule (comme Ctrl+*). Offset(1) le décale d'une ligne et Resize retire une ligne : on obtient les données sans l'en-tête.
- Résultat attendu :
- La ligne 10 affiche Total en A et la somme des montants (55 616,58 €) en E
- La ligne Total est en gras
Insérer deux lignes pour le titre
Sub InsererTitre()
Dim feuille As Worksheet
Set feuille = ThisWorkbook.Worksheets("Commandes")
feuille.Range("1:2").Insert
feuille.Range("A1").Value = "Commandes de novembre 2026"
feuille.Range("A1").Font.Bold = True
feuille.Range("A1").Font.Italic = True
End Sub
- Range("1:2").Insert insère deux lignes entières au-dessus de la ligne 1 : tout le tableau descend de deux lignes, sans rien écraser.
- Résultat attendu :
- A1 affiche Commandes de novembre 2026 en gras italique
- Le tableau commence maintenant en ligne 3 (en-têtes) et la ligne Total est en ligne 12
Copier le rapport dans la feuille Archive
Sub Archiver()
Dim feuille As Worksheet, archive As Worksheet, plageZone As Range
Set feuille = ThisWorkbook.Worksheets("Commandes")
Set archive = ThisWorkbook.Worksheets("Archive")
archive.Cells.ClearContents
Set plageZone = feuille.Range("A3").CurrentRegion
plageZone.Copy Destination:=archive.Range("A1")
archive.Range("G1").Value = "Lignes archivées"
archive.Range("G1").Offset(0, 1).Value = plageZone.Rows.Count - 2
End Sub
- Copy Destination:= copie valeurs et mise en forme en une instruction, sans passer par le presse-papiers. Offset(0, 1) désigne la cellule voisine de droite.
- Résultat attendu :
- Archive!A1:E10 contient le tableau (en-têtes, 8 commandes, Total)
- Archive!H1 indique 8 lignes archivées