Excel - Power Query - Power Pivot - VBA

VBA11 | Préparer la synthèse des ventes

Énoncé

  • Thème : classeurs (objets Workbook) | Durée : 30 min | Niveau : intermédiaire.
  • Classeur de départ : VBA11_ventes.xlsm (feuilles Ventes et Infos), avec le classeur Tarifs_2026.xlsx dans le même dossier.
  • Contexte : le service commercial veut une synthèse des ventes dans un classeur séparé, et le taux de TVA lu dans le classeur des tarifs. Vous manipulez des objets Workbook : ThisWorkbook, Workbooks.Open, Workbooks.Add, SaveAs et Close, puis vous écrivez la fonction EstClasseurOuvert.

Travail demandé

  • Ouvrir le classeur, puis l'éditeur Visual Basic (Alt+F11) et le module Module1.
  • Déclarer et affecter un classeur : macro InfosClasseur.
  • Ouvrir un classeur, le lire puis le fermer : macro LireTarifs.
  • Créer, enregistrer et fermer un nouveau classeur : macro CreerSynthese.
  • Écrire la fonction EstClasseurOuvert et la tester : macro TesterClasseurs.
  • Enregistrer le classeur au format .xlsm par macro : macro EnregistrerCorrige.
  • Répondre au questionnaire de fin de lab (5 questions, 80 % pour valider).

Corrigé

Déclarer et affecter un classeur

Sub InfosClasseur()
    Dim classeurVente As Workbook
    Set classeurVente = ThisWorkbook
    With classeurVente.Worksheets("Infos")
        .Range("B1").Value = classeurVente.Name
        .Range("B2").Value = classeurVente.Path
        .Range("B3").Value = classeurVente.Worksheets.Count
    End With
End Sub
  • Une variable de type Workbook désigne un classeur. Set l'affecte : ThisWorkbook est le classeur qui contient la macro, même s'il n'est pas le classeur actif.
  • Résultat attendu :
    • La feuille Infos affiche le nom du classeur, son dossier et le nombre de feuilles (B1:B3)

Ouvrir un classeur, le lire puis le fermer

Sub LireTarifs()
    Dim classeurTarif As Workbook
    Set classeurTarif = Workbooks.Open(ThisWorkbook.Path & "\Tarifs_2026.xlsx")
    ThisWorkbook.Worksheets("Infos").Range("B4").Value = _
        classeurTarif.Worksheets("Tarifs").Range("B1").Value
    classeurTarif.Close SaveChanges:=False
End Sub
  • Workbooks.Open ouvre un fichier et renvoie le classeur : on le range dans une variable pour le lire. Close SaveChanges:=False le referme sans rien modifier. Le trait de soulignement ( _ ) prolonge une instruction sur la ligne suivante.
  • Résultat attendu :
    • Infos!B4 contient le taux de TVA lu dans Tarifs_2026.xlsx (0,2)
    • Tarifs_2026.xlsx a été ouvert puis refermé par la macro

Créer, enregistrer et fermer un nouveau classeur

Sub CreerSynthese()
    Dim classeurVente As Workbook, classeurSynthese As Workbook
    Set classeurVente = ThisWorkbook
    Set classeurSynthese = Workbooks.Add
    classeurVente.Worksheets("Ventes").Range("A1").CurrentRegion.Copy _
        Destination:=classeurSynthese.Worksheets(1).Range("A1")
    classeurSynthese.Worksheets(1).Name = "Synthèse"
    classeurSynthese.SaveAs Filename:=classeurVente.Path & "\Synthese_2026.xlsx", _
        FileFormat:=xlOpenXMLWorkbook
    classeurSynthese.Close
End Sub
  • Workbooks.Add crée un classeur vide et l'active. La variable classeurSynthese permet de le désigner sans ambiguïté, même quand plusieurs classeurs sont ouverts. FileFormat:=xlOpenXMLWorkbook donne un fichier .xlsx.
  • Résultat attendu :
    • Le fichier Synthese_2026.xlsx existe dans le dossier de travail
    • Le nouveau classeur a été fermé après l'enregistrement

Écrire la fonction EstClasseurOuvert

Function EstClasseurOuvert(sNomClasseur As String) As Boolean
    Dim x As Workbook
    On Error Resume Next
    Set x = Workbooks(sNomClasseur)
    EstClasseurOuvert = (Err = 0)
End Function

Sub TesterClasseurs()
    Debug.Print "VBA11_ventes.xlsm ouvert : "; EstClasseurOuvert("VBA11_ventes.xlsm")
    Debug.Print "Synthese_2026.xlsx ouvert : "; EstClasseurOuvert("Synthese_2026.xlsx")
End Sub
  • On Error Resume Next laisse passer l'erreur 9 si le classeur n'est pas ouvert : Err vaut alors 9 au lieu de 0. La fonction renvoie True ou False sans arrêter la macro.
  • Lancez TesterClasseurs (F5) : le résultat s'affiche dans la fenêtre Exécution (Ctrl+G).
  • Résultat attendu :
    • La fenêtre Exécution affiche Vrai pour VBA11_ventes.xlsm et Faux pour Synthese_2026.xlsx

Enregistrer le classeur au format .xlsm par macro

Sub EnregistrerCorrige()
    ThisWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\VBA11_corrige.xlsm", _
        FileFormat:=xlOpenXMLWorkbookMacroEnabled
End Sub
  • SaveAs enregistre le classeur sous un autre nom. FileFormat:=xlOpenXMLWorkbookMacroEnabled (52) garde les macros : avec le format .xlsx, elles seraient perdues.
  • Résultat attendu :
    • Classeur enregistré sous VBA11_corrige.xlsm dans le dossier de travail

Pour aller plus loin