Excel - Power Query - Power Pivot - VBA

VBA13 | Mettre en forme le rapport des commandes

Énoncé

  • 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.

Travail demandé

  • 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).

Corrigé

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)

Ajouter la ligne Total

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

Pour aller plus loin