Projet Rappel VBA 28/02/15 1
VBA : quoi & pourquoi? VBA : quoi? Langage et environnement de programma>on Orienté Objets A5aché aux documents MS Office VBA : pourquoi? Associer un comportement ac=f à des documents Office Calculs, vérifica>ons, etc. 2
VBA : documents MS Office Un document MS Office est composé des plusieurs éléments Fichier Access Tables (données) Requêtes Formulaires États (rapports) Modules (VBA) Feuilles Données Formules Modules (VBA) Fichier Excel MS Access MS Excel 3
Modèle Objets de VBA VBA : Modèle OO Les éléments manipulés par VBA sont des objets Worksheet (feuille de calcul), Range (cellules), Form (formulaire), Report (état), RecordSet (requête) Il est possible de créer de nouvelles classes è modules de classe Modèle OO Excel Modèle OO Access 4
VBA : Modèle OO Un objet VBA possède : Propriétés Comportement opéra>on sans retour de valeur opéra>on retournant une valeur A5ributs Procédures Événements Procédures Sub Func=on Procédure à opéra>on qu on appelle explicitement Ac>on de l u>lisateur (ou du système) sur un Property objet, déclenchant Ge#ers un traitement (Property Get) et Se#ers (Property Let) pour les aeributs 5
Collec=ons VBA : Modèle OO Ensemble d objets d un même type Worksheets (toutes feuilles de calcul), Forms (tous les formulaires), Controls (tous champs d un formulaire) Collec+on!["NomObjet"] Forms!["Employe"] Collec+on("NomObjet") Forms("Employe") Forms("Employe").Controls("Embauche") Worksheets("Feuil1").Cells(1,1) Formulaire «Employe» Cellule ( 1,1 ) Feuille «Feuil1» Contrôle «Embauche» 6
VBA : Modules Modules con>ennent le code VBA pour un document Plusieurs types de modules MS Objets Evènements Modules standards Procédures u>litaires Modules de classe Classes crées par l u>lisateur 7
VBA : concepts de base Environnement de programma>on (VBE) Excel : Ruban «Développeur» (onglet à ac>ver) Access : Ruban «Ou>ls de bases de données» 8
Variables VBA : concepts de base Une variable est un conteneur, on y garde une valeur Déclara>on est fortement recommandée, mais pas obligatoire Dim variable AS Type Dim auj As Date auj = Date 'date actuelle auj 24 / 11 / 2014 Types des données AS Integer à en>er AS Single à numérique (float) AS Boolean à booléen (True / False) AS String à chaîne de caractères AS Variant à n importe quel type de données AS Object à objet de n importe quelle classe 9
VBA : concepts de base Variables Une variable est un conteneur, on y garde une valeur qu on pourra u>liser plus tard! Dim a As Integer Dim b As Integer a = 2 b = a * a usage aeribu>on Pour les objets, l aeribu>on se fait à l aide de Set Dim cellule As Range Set cellule = Worksheets("Feuil1").Cells(1,1) MsgBox cellule.valeur Objet.Opéra@on Propriété Valeur de la classe Range 10
Fonc=ons (Func=on) VBA : concepts de base Opéra>on qui retourne une valeur correspondant au nom de la fonc>on Private Public Func=on MaFonc+on (paramètres ) AS Type MaFonc+on = valeur_à_retourner End Sub Public Func=on DateAujourdhui() As Date Dim auj As Date auj = Date DateAujourdhui = auj End Func=on 11
Procédures de type Sub VBA : concepts de base Exécu>on d une opéra>on qui ne retourne aucune valeur Private Public Sub NomProcédure (paramètre AS type )... End Sub Sub ValeurA1() Dim cellule As Range Set cellule = Worksheets("Feuil1").Cells(1, 1) MsgBox (cellule.value) End Sub 12
VBA : concepts de base Événements : Ac>ons réalisées par l u>lisateur (ou le système) sur un élément (feuille, formulaire, contrôle ) Exemples : ouverture d un document, clique sur un bouton, fermeture de l applica>on, ouverture d un formulaire Le type d événement varie en fonc>on de l élément qui reçoit l ac>on Sur une fenêtre (formulaire ou état) Open : à l ouverture, avant d afficher le 1 er registre Load : lorsque le 1 er registre est affiché Close : à la fermeture Contrôle Click : lorsqu on lui clique dessus Données (formulaire / contrôle associé à une source de données RecordSource /ControlSource) BeforeInsert / AderInsert: avant/après inser>on nouveau registre BeforeUpdate/AderUpdate: avant/après mise à jour registre Change : lors de la modifica>on d un contrôle 13
Evénements VBA : concepts de base Exemple : affichage d un message à l ouverture d un document Excel élément qui reçoit l ac>on («Workbook») quelle type d ac>on («Open») Private Sub Workbook_Open() MsgBox ("Bienvenue dans le document " _ & ThisWorkbook.Name & Chr(10) _ & "Feuille ac>ve : " _ & ThisWorkbook.Ac=veSheet.Name ) End Sub 14
& : concaténa+on _ : instruc+on sur plusieurs lignes VBA : évènements & procédures Evènements & Procédures A par>r d un événement, on peut invoquer une fonc>on ou une procédure Sub Private Sub Ancien_Click() annees = Anciennete (Forms("Employe").Controls("Embauche")) MsgBox "Anciennete de " & annees & " ans " _ & "à par+r du " & Forms("Employe").Controls("Embauche"), vbinforma+on End Sub Public Func=on Anciennete(dateEntree As Date) As Integer Dim auj As Date auj = Date 'date système actuelle Anciennete = DateDiff("yyyy", dateentree, auj) End Func=on 15
VBA : évènements & procédures Private Sub Ancien_Click() annees = Anciennete (Forms("Employe").Controls("Embauche")) MsgBox "Anciennete de " & annees & " ans " _ & "à par+r du " & Forms("Employe").Controls("Embauche"), _ vbinforma+on End Sub Public Func=on Anciennete(dateEntree As Date) As Integer Dim auj As Date auj = Date 'date système actuelle Anciennete = DateDiff("yyyy", dateentree, auj) End Func=on 16
VBA : évènements & procédures Objet_Evénement NomBouton _ Click 17
VBA : évènements & procédures Private Sub Annuel_Click() SalaireAnnuel Forms("Employe").Controls("Salaire") End Sub Public Sub SalaireAnnuel(Salaire As Single) Dim Annuel As Single Annuel = Salaire * 12 MsgBox "Salaire annuel est de " & Annuel End Sub 18
VBA : tableaux Tableaux Variables capables de garder plusieurs valeurs Variable au mul=plicité > 0 Première posi>on est 0, sauf indica@on contraire Dim tab_0_a_2(3) As Currency tab_0_a_2(1) = 1.5 tab_0_a_2 0 1.5 0 1 0 2 Dim tab_1_a_3(1 To 3) As Currency tab_1_a_3(1) = 1.5 tab_1_a_3 1.5 0 1 2 0 3 Dim tabbidim(2, 2) As Currency tabbidim(0, 0) = 1.5 tabbidim(1, 0) = 1.5 tabbidim 0 1 0 1 1.5 0 1.5 0 19
VBA : Instruc>ons de contrôle Instruc>ons condi>onnelles : if else If condi+on Then 'si condi+on vraie Else 'si condi+on faux End If op@onnel [ FAUX] If cond Bloc Else [ VRAI ] Bloc Then If mont <= 100 Then MsgBox "Frais " & mont & _ " inférieur à 100 : Validé!", vbinforma+on Else MsgBox "Frais " & mont & _ " supérieur à 100 : Valida>on par le directeur", _ vbokonly End If End If (suite) 20
VBA : Instruc>ons de contrôle Instruc>ons condi>onnelles : if elseif else If condi+on Then 'si condi+on vraie ElseIf condi>on2 Then 'si condi+on2 vrai Else 'si aucune des ' précédentes End If If mont > 0 And mont <= 50 Then MsgBox "Frais " & mont & _ " inférieur à 50 : Validé!", vbinforma+on ElseIf mont <= 100 Then MsgBox "Frais " & mont & _ " supérieur à 50 et inférieur à 100 : " _ & " Valida>on par le RH", vbokonly Else MsgBox "Frais " & mont & _ " supérieur à 100 : Valida>on par le directeur", _ vbokonly End If 21
VBA : Instruc>ons de contrôle Boucles : Do While Loop Do While condi+on ' exécute tant que la ' condi+on est vraie Loop [ FAUX] cond [ VRAI ] Bloc While 'tant qu il reste des registres dans le 'RecordSet Do While Not rsl.eof tot = tot + rsl("montant") rsl.movenext Loop (suite) Loop 22
VBA : Instruc>ons de contrôle Boucles : For Next, For each Next For début To fin Step n ' exécute de début ' jusqu à fin ' de n en n (step) Next For i = 0 To 2 Step 1 somme = somme + tab_0_a_2 ( i ) Next début i = 0 Bloc for Next i = i + step [ else ] fin? [ i = 2 ] 23
VBA : Instruc>ons de contrôle Boucles : For Next, For each Next On peut imbriquer plusieurs boucles For début To fin Step n ' exécute de début ' jusqu à fin ' de n en n (step) Next For i = 0 To 1 For j = 0 To 1 somme = somme + tabbidim ( i, j ) Next Next Pour chaque valeur de i, on fait j de 0 à 1 24
VBA : Instruc>ons de contrôle Boucles : For Next, For each Next On peut aussi parcourir toute une collec>on For Each var IN collec+on ' pour chaque élément var ' dans la collec+on ' (ou tableau) Next 'on va afficher les nombre de registres dans 'chaque table For Each t In CurrentDb.TableDefs MsgBox t.name & " : " & t.recordcount Next 25
VBA : accès aux données EXCEL Les données dans un document Excel (objet ThisWorkbook) s organisent en feuilles de calcul (objets Worksheet) et en cellules (objets Range) Quelques objets importants ThisWorkbook : document courant Ac=veWorkbook : document en 1 er plan (ac>f) Ac=veSheet : feuille de calcul ac>ve Les collec=ons vont permeere l accès aux différents objets de la classe correspondante Worksheets("Feuil1") à accès à la feuille «Feuil1» 26
Range VBA : accès aux données EXCEL La no>on de Range est essen>elle dans Excel. Un objet Range est une région dans une feuille contenant une ou plusieurs cellules Les opéra>ons de la classe Range vont nous permeere d interagir ou de modifier les cellules Ac>veSheet.Range("A1").Value Ac>veSheet.Cells(1, 2).Value A5en=on : les collec>ons démarrent en 1 (et pas 0) L opéra>on Value récupère la valeur de la cellule La collec>on Cells con>ent un ensemble d objets Range 27
VBA : accès aux données EXCEL Sub UnRange() MsgBox Ac=veSheet.Range("A1").Value MsgBox Ac=veSheet.Cells(1, 2).Value End Sub Private Sub ChangeA1() Worksheets("Feuil1").Cells(1, 1).Font.Size = 12 End Sub changement de la taille de la police 28
VBA : accès aux données ACCESS Accès aux données des tables peut se faire de différentes manières Par formulaires, par requête... Source : Form aeaché à une table On peut même ouvrir des bases sur d autres fichiers Ex.: un fichier Excel qui importe les données d un fichier Access 29
VBA : accès aux données ACCESS Exemple Employés Formulaire «Employe» (mode Créa=on) 30
VBA : accès aux données ACCESS Quelques objets importants DBEngine : objet qui gère l accès à une BdD Database : BdD ouverte bds = DBEngine.OpenDatabase("c:\docs\clients.accdb") bds = CurrentDb() RecordSet : ensemble d enregistrements Manipula>on des enregistrements Set rst = dbs.openrecordset("frais", dbopentable) Set rst = CurrentDb().OpenRecordset(sql) rst.movefirst rst.movenext rst.edit Requête modifiable Requête données en lecture seule 31
VBA : Accès aux BdD Exemple : calculer les frais matr = Me.Controls("Matricule") sql = "SELECT Frais.Montant FROM Frais WHERE Frais.Matricule=" & matr Set rsl = CurrentDb().OpenRecordset(sql) If rsl.recordcount > 0 Then rsl.movefirst Do While Not rsl.eof tot = tot + rsl("montant") rsl.movenext Loop End If MsgBox "Total des frais = " & tot, vbokonly Exécu>on de la requête SQL S il y a des enregistrements (RecordCount) Avance au premier enregistrement Tant qu on n arrive pas à la fin des enregistrements(eof) Avance au prochain enregistrement Récupère un champs rsl ("a\ribut") 32
VBA : modules de classe Modules de classes Défini>on d une classe A5ributs à variables Opéra=ons Property Get / Let Func=on / Sub Les a\ributs sont «exposés» en tant que «Property» par les Get et Let Usage : Dim msg AS New MessageBox Set msg = New MessageBox msg.titre = "nouveau =tre" msg.titre exécute Let Titre exécute Get Titre 33
VBA : modules de classe Aeributs Get : geeer (gettitre) Accès à la propriété Titre Let : seeer (settitre) Modifie la propriété Titre Func=on confirma>on Opéra>on 34
VBA : modules de classe Private Sub btnvalider_click() 'déclara>on d'un objet de type MessageBox Dim msg As New MessageBox 'usage de l'objet Msg msg.titre = "Valida=on frais " VBA appelle le Let Titre If msg.confirma=on("valider frais? ") = True Then valider Me.Frais.Controls("NumFrais"), True MsgBox "Frais confirmé!", vbokonly, msg.titre Else valider Me.Frais.Controls("NumFrais"), False MsgBox "Frais non accepté!", vbokonly + vbexclama+on, _ msg.titre ici VBA appelle le Get Titre End If End Sub 35
VBA : modules de classe MessageBox 36
Informa>que Modélisa>on UML Objec=fs : Exemple de projet en VBA
Rappel VBA VBA est un langage de programma>on (à l instar de PHP) qui est aeaché aux documents MS Office Un programme VBA n existe que s il est aeaché à un document MS Office (une fiche Excel, une base de données Acces) Grâce au VBA, on peut faire des calculs avancés, de vérifica>ons, etc. à l intérieur des documents MS Office 38
Exemple en VBA Exemple de projet Un employé d une société de vêtements a besoin d un pe>t système pour l aider à gérer les commandes qu il passe auprès des fournisseurs Le système doit enregistrer les produits et les commandes Si le stock est inférieur à un seuil (50 produits), le système doit conseiller l employé à passer une commande L employé doit être capable d enregistrer un nouveau fournisseur lors qu il passe une commande 39
Exemple VBA Démarche Établir les besoins : pour quoi faire? Diagrammes de cas d u=lisa=on Établir les données : que manipule- t- on? Premier diagramme de classes Diagramme objets pour illustrer le diagramme de classes Établir les processus : que faire? Dans quel ordre? Réfléchir aux processus mis en place Diagrammes d ac=vités Imaginer les interac=ons : Comment procède- t- on? Quels formulaires aurons- nous proposer? Quels états (rapports)? Réfléchir aux classes «contrôle» et aux modules nécessaires Améliorer / compléter le diagramme de classes 40
Exemple en VBA Diagramme de Cas d U>lisa>on : fonc=onnalités 41
Exemple VBA Diagramme de classes : données manipulées 42
Exemple VBA Diagramme objets : une commande 43
Exemple VBA Diagramme d ac>vités : éditer produits 44
Exemple VBA Diagramme d ac>vités : Passer une commande 45
Exemple VBA A par>r des diagrammes d ac>vités, nous pouvons établir les formulaires et états souhaités Formulaire pour nouveau produit Formulaire pour une nouvelle commande Rapport (état) sur une commande (pour l imprimer) Enrichir diagramme de classes : Ajouter les formulaires et les états Ajouter les éléments de «contrôle» (module de classes) contrôle de stock 46
Exemple VBA Diagramme de classes revisité 47
Exemple VBA Diagramme de paquetages 48
Exemple VBA Passage du projet à VBA Créa>on de la base de données Les tables correspondent aux classes de données Créa>on des formulaires Correspondant aux classes Form Créa>on des modules de programma>on Module de classe à correspond à la no>on de classe CtlStock : défini>on du seuil et vérifica>on du stock Module à ensemble d objets et d opéra>ons ModueGlobal : calculs variés (ex. : calculer total commande) 49
Exemple VBA Une «applica>on» VBA s u>lise un document MS Office, une base MS Access dans ce cas Créa>on des tables et formulaires prévus dans le diagramme de classes dans Access 50
Exemple VBA Formulaires : Produit 51
Exemple VBA Formulaires : Commande 52
Exemple VBA Formulaires : Fournisseur 53
Exemple VBA VBA va nous permeere de programmer les vérifica>ons qu on a indiqué dans les diagrammes d ac>vités (par des évènements) 54
Exemple VBA Vérifica>on stock lors de l édi>on des produits Aver=ssement à l entrée de FormProduit Aver=ssement dans FormProduit si stock < seuil 55
Exemple VBA Code VBA pour FormProduit Pour chaque produit on vérifie le stock À l ouverture du formulaire, on vérifie également Et lorsqu on modifie un produit, on aver>t aussi si stock<seuil 56
Exemple VBA Le seuil est le même pour toute l applica>on : Objet «controle» dans ModuleGlobal Dans les modules, on peut aussi ajouter les fonc=ons (opéra>ons) qu on n arrive pas à meere dans les formulaires 57
Exemple VBA Constructeur Les «Modules de Classe» correspondent à la no>on de classe. On y définit des propriétés et des opéra=ons Ge5er (Get) et Se5er (Let) pour la propriété stockmin Si on fait controle.stockmin = 30 on passe par le Let Opéra=on CheckStockMin 58
Exemple VBA Code VBA pour la ligne de commande À chaque mise à jour, on actualise la commande On vérifie le stock à chaque nouvelle ligne et on aver> l u>lisateur si le stock>seuil Les lignes de commande concernent la commande affichée 59
Exemple VBA Code VBA pour FormCommande Possibilité d impression Calcul total de la commande, effectué concrètement dans le ModuleGlobal 60
Exemple VBA Code VBA pour FormCommande Pour imprimer, on va u=liser un état capable d afficher la commande 61
Exemple VBA Code VBA pour FormCommande Pour imprimer, on va u=liser un état capable d afficher la commande 62