Excel - Power Query - Power Pivot - VBA

VBA12 | Organiser les feuilles par région

Énoncé

  • Thème : feuilles (objets Worksheet) | Durée : 30 min | Niveau : intermédiaire.
  • Classeur de départ : VBA12_regions.xlsm (feuilles Modèle, Nord, Sud et Brouillon).
  • Contexte : le contrôle de gestion suit les objectifs par région, une feuille par région. Vous créez un sommaire, ajoutez une région à partir du modèle, colorez les onglets, supprimez le brouillon sans message de confirmation et écrivez la fonction EstFeuilleExiste.

Travail demandé

  • Ouvrir le classeur, puis l'éditeur Visual Basic (Alt+F11) et le module Module1.
  • Ajouter une feuille Sommaire et lister les feuilles : macro CreerSommaire.
  • Copier le modèle pour créer la région Est : macro CreerRegionEst.
  • Colorer les onglets : macro ColorerOnglets.
  • Supprimer la feuille Brouillon sans confirmation : macro SupprimerBrouillon.
  • Ajouter la région Ouest une seule fois, grâce à la fonction EstFeuilleExiste : macro AjouterOuest.
  • Répondre au questionnaire de fin de lab (5 questions, 80 % pour valider).

Corrigé

Ajouter une feuille Sommaire et lister les feuilles

Sub CreerSommaire()
    Dim feuilleSommaire As Worksheet, feuille As Worksheet
    Dim ligne As Long
    Set feuilleSommaire = ThisWorkbook.Worksheets.Add(Before:=ThisWorkbook.Worksheets(1))
    feuilleSommaire.Name = "Sommaire"
    ligne = 1
    For Each feuille In ThisWorkbook.Worksheets
        If feuille.Name <> feuilleSommaire.Name Then
            feuilleSommaire.Cells(ligne, 1).Value = feuille.Name
            ligne = ligne + 1
        End If
    Next feuille
End Sub
  • Worksheets.Add crée une feuille et la renvoie : on la range dans une variable pour la nommer et la remplir. For Each parcourt toutes les feuilles du classeur sans connaître leur nombre.
  • Résultat attendu :
    • La feuille Sommaire est la première du classeur
    • Sommaire!A1:A4 liste Modèle, Nord, Sud et Brouillon

Copier le modèle pour créer la région Est

Sub CreerRegionEst()
    Dim feuilleModele As Worksheet, feuilleRegion As Worksheet
    Set feuilleModele = ThisWorkbook.Worksheets("Modèle")
    feuilleModele.Copy After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)
    Set feuilleRegion = ActiveSheet
    feuilleRegion.Name = "Est"
    feuilleRegion.Range("B1").Value = "Est"
End Sub
  • Copy After:= place la copie après la feuille indiquée. La copie devient la feuille active : Set feuilleRegion = ActiveSheet la récupère aussitôt, avant toute autre manipulation.
  • Résultat attendu :
    • La feuille Est est la dernière du classeur, avec Est en B1
    • La feuille Est reprend la structure du modèle (Mois, Objectif, Réalisé, Écart)

Colorer les onglets

Sub ColorerOnglets()
    Dim feuille As Worksheet
    For Each feuille In ThisWorkbook.Worksheets
        Select Case feuille.Name
            Case "Nord", "Sud", "Est"
                feuille.Tab.Color = RGB(0, 176, 80)
            Case "Modèle"
                feuille.Tab.Color = 255
        End Select
    Next feuille
End Sub
  • Tab.Color fixe la couleur d'un onglet. RGB(rouge, vert, bleu) calcule le code d'une couleur ; 255 correspond au rouge pur. Select Case évite une série de If imbriqués.
  • Résultat attendu :
    • Les onglets Nord, Sud et Est sont verts
    • L'onglet Modèle est rouge

Supprimer la feuille Brouillon sans confirmation

Sub SupprimerBrouillon()
    Application.DisplayAlerts = False
    ThisWorkbook.Worksheets("Brouillon").Delete
    Application.DisplayAlerts = True
End Sub
  • Delete affiche normalement un message de confirmation qui bloque la macro. Application.DisplayAlerts = False le supprime ; on remet True aussitôt après pour ne pas masquer d'autres alertes.
  • Résultat attendu :
    • La feuille Brouillon n'existe plus
    • La macro a désactivé puis réactivé les alertes (DisplayAlerts)

Ajouter la région Ouest une seule fois

Function EstFeuilleExiste(sName As String) As Boolean
    Dim x As Object
    On Error Resume Next
    Set x = ActiveWorkbook.Sheets(sName)
    EstFeuilleExiste = (Err = 0)
End Function

Sub AjouterOuest()
    Dim feuilleRegion As Worksheet
    If EstFeuilleExiste("Ouest") Then
        MsgBox "La feuille Ouest existe déjà.", vbInformation
        Exit Sub
    End If
    ThisWorkbook.Worksheets("Modèle").Copy After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)
    Set feuilleRegion = ActiveSheet
    feuilleRegion.Name = "Ouest"
    feuilleRegion.Range("B1").Value = "Ouest"
    feuilleRegion.Tab.Color = RGB(0, 176, 80)
End Sub
  • Renommer une feuille avec un nom déjà pris provoque une erreur. La fonction EstFeuilleExiste teste l'existence avant d'agir : la macro peut être relancée sans risque.
  • Lancez AjouterOuest deux fois (F5 deux fois) : la seconde fois, un message indique que la feuille existe déjà.
  • Résultat attendu :
    • La feuille Ouest existe, avec Ouest en B1
    • AjouterOuest a été lancée au moins deux fois sans erreur

Pour aller plus loin