46 0 6MB
TP sur VBA pour Excel (version 2021 et Microsoft 365) Créez des applications professionnelles : Exercices et corrigés Ce livre est destiné aux utilisateurs d’Excel 2021 ou d’Excel Microsoft 365 voulant se former à une véritable utilisation pratique du langage VBA appliqué à Excel. Il est donc recommandé d’aborder l’ouvrage en ayant une connaissance suffisante des fondamentaux du langage. Avec plus de 230 exercices de difficulté croissante, basés sur des exemples concrets, l’ouvrage couvre les domaines suivants : l’automatisation des tâches répétitives, l’ajout de fonctions personnalisées, le contrôle des principaux objets d’Excel (classeur, feuille, cellule, graphique), la collaboration et l’échange de données avec les autres applications de la suite Office (2021 ou Microsoft 365), la prise en charge des informations au format XML, la publication de documents Excel sur le Web, l’analyse de données, la gestion du multimédia, la gestion du système de fichiers, ou encore la mise en oeuvre de requêtes basées sur la technologie Power Query. Au terme de cette mise en pratique, vous pourrez étendre les fonctionnalités d’Excel pour répondre à vos besoins. Vous disposerez de tous les éléments qui vous permettront de développer une application professionnelle avec VBA pour Excel 2021 ou Microsoft 365. Les fichiers nécessaires à la réalisation des exercices, ainsi que les corrigés, sont en téléchargement depuis cette page. 179 QCM - 238 travaux pratiques et leurs corrigés - Plus de 40 H de mise en pratique. Auteur(s) Claude DUIGOU
Ingénieur et MBA HEC, Claude DUIGOU exerce ses activités de Formateur et de Consultant en entreprise depuis plus de 20 ans. Ses différentes missions le conduisent à intervenir auprès d'entreprises de tailles diverses pour la réalisation, notamment en VBA, de logiciels dans des domaines tels que l'aide à la décision, le contrôle de gestion, la gestion des stocks, la gestion du temps, le contrôle budgétaire. Les systèmes qu'il développe font largement appel aux possibilités et fonctionnalités avancées d'Excel. Cette expérience complète et variée lui permet de proposer un livre très pragmatique sur VBA Excel. Réf. ENI : TP21EXCV | ISBN : 9782409033353
Public du livre Vous êtes utilisateur d’Excel Microsoft 365 ou d’Excel 2021 et vous souhaitez vous initier à VBA (Visual Basic for Application) pour Excel ou approfondir vos connaissances de ce langage, ce livre vous est destiné. Des notions élémentaires en programmation sont recommandées mais non indispensables dans la mesure où la première partie de l’ouvrage est consacrée aux fondamentaux et propose une introduction à la programmation objet. S’agissant d’un recueil d’exercices pratiques basés sur des exemples concrets, nous vous recommandons pour tout complément théorique de vous reporter au livre VBA Excel (versions 2019 et Office 365) - Programmer sous Excel : macros et langage VBA, dans la collection Ressources informatiques des Éditions ENI.
Objectif du livre Au terme de votre pratique, vous serez en mesure d’automatiser des tâches répétitives, d’ajouter des fonctions et caractéristiques répondant à des besoins spécifiques, de personnaliser totalement votre espace de travail et d’ouvrir Excel à son environnement (applications Microsoft et Internet). Vous disposerez en définitive de tous les éléments qui permettent de développer une application "clés en main".
Utilisation du livre Bien qu’il soit possible d’aborder chaque chapitre indépendamment, l’ordre prévu influe sur le bon déroulement de l’apprentissage. Il est donc conseillé de suivre la chronologie du livre pour obtenir une meilleure efficacité. Chaque chapitre présente différentes sections :
Objectifs Prérequis Énoncés Indices Corrigés (en fin d’ouvrage)
1. Objectifs Cette section décrit le contenu des exercices qui vont être abordés tout au long du chapitre.
2. Prérequis
Cette section permet de vérifier vos connaissances théoriques. Elle se compose de questions à choix multiples ou de questions ouvertes portant sur les notions qui doivent être acquises avant d’aborder la réalisation des exercices. Chacune des questions de cette section est numérotée afin de retrouver plus facilement la réponse à la fin de l’ouvrage.
3. Énoncés et corrigés Cette section regroupe les énoncés des exercices. Comme pour les prérequis, chaque énoncé et sa correction sont numérotés. Pour réaliser certains exercices, vous devez télécharger ou visualiser des éléments. Les fichiers correspondants sont disponibles en téléchargement depuis la page Informations générales. Pour la suite de cet ouvrage, cette information est précédée du symbole
.
4. Indices Les indices fournis pour certains points de l’énoncé rappellent les points importants de théorie à connaître. Ils permettent d’avancer plus vite dans la suite de l’exercice sans toutefois dévoiler les solutions.
Aide à la réalisation des travaux pratiques 1. Écriture du code VBA L’interface de programmation : Visual Basic Editor Pour écrire vos procédures, vous devez accéder à l’éditeur de Visual Basic, Visual Basic Editor (VBE). Sous Excel, choisissez dans le ruban l’onglet Développeur puis l’icône Visual Basic, ou utilisez le raccourci-clavier : [Alt][F11]. Attention ! si l’onglet Développeur n’apparaît pas dans le ruban, faites Fichier - Options Personnaliser le ruban et cochez la case Développeur dans la liste des onglets à droite de la boîte de dialogue.
L’espace où vous saisissez votre code VBA est appelé "fenêtre de code". Elle comporte deux parties : la partie déclaration et la partie procédures. Il faut écrire toutes les procédures après les déclarations. Vous pouvez constater que VBE n’est qu’une partie de l’environnement de développement VBA pour Excel, l’IDE (Integrated Development Environment). La fenêtre Projet affiche les projets ouverts avec trois types de dossiers contenant respectivement : les objets Excel (feuilles de calcul et classeur), les formulaires (maladroitement désignés par "feuilles") et les modules. La fenêtre Propriétés présente les propriétés de l’objet sélectionné, ici l’objet ThisWorkBook. La fenêtre Exécution permet de tester du code et d’observer le résultat en mode "console". D’autres fenêtres sont disponibles permettant de personnaliser son environnement de développement. Les intitulés de ces fenêtres sont disponibles dans le menu Affichage.
Les modules Pour créer un module, choisissez dans le menu Insertion - Module. Les modules sont destinés à recevoir les procédures et fonctions publiques. La déclaration des variables Pour éviter les erreurs de dénomination et programmer efficacement, il faut déclarer explicitement toutes les variables. Pour étendre cette déclaration à l’ensemble du projet, choisissez dans le menu Outils - Options puis l’onglet Éditeur. Choisissez l’option Déclaration des variables obligatoire.
Les types de données La précision (ou déclaration) du type de données que peuvent stocker les variables ne fait pas partie des options proposées. Toujours dans un souci d’efficacité, lors de l’écriture de votre code toutes les variables doivent être déclarées en précisant le type de données. Choisissez le plus spécifique. Par exemple, pour une variable destinée à stocker des entiers courts, le type Integer (-32 768 à 32 767) convient mieux que le type Long (-2 147 483 648 à 2 147 483 647). Le caractère de continuation Une instruction VBA peut être longue et dépasser la largeur d’une page écran. Pour l’écrire sur plusieurs lignes, il faut insérer le caractère de soulignement à l’endroit où vous voulez effectuer une coupure, précédé d’un espace, puis appuyer sur la touche [Entrée]. Exemple : Private Sub cCalendrier_Click() Dim . . . . . . With . . . For . . . . . . If . . . frmCalendrier.Label1 = strMessage & " : " _ & CDate(frmCalendrier.lstDates. _ List(intCompteur, 1)) End If Next End With End Sub
L’indentation
L’exemple précédent vous montre la structure d’une procédure avec indentation. Les décalages correspondent à des blocs logiques de prise de décision ou de structures répétitives. Le code est ainsi plus lisible et plus aisé à corriger en cas d’erreur. Pour indenter une ligne ou plusieurs lignes (à sélectionner auparavant), appuyez sur la touche [Tab] pour une tabulation et sur la combinaison de touches [Shift][Tab] pour effectuer un retrait. Vous pouvez préciser la largeur de la tabulation par le menu Outils - Options.
2. Aide à la saisie du code VBA Lors de la saisie d’un mot-clé, vous pouvez saisir les premières lettres suivies de la combinaison de touches [Ctrl][Espace]. VBE complète votre saisie ou vous propose une liste.
L’appui sur la touche [Tab] reporte votre choix à la suite du curseur. La touche [Entrée] effectue la même action avec en plus un saut de ligne. Pour bénéficier de l’aide complète, accédez à la boîte d’options (cf. ci-dessus) puis vérifiez que toutes les options de la partie Paramètres du code sont cochées. La Vérification automatique de la syntaxe et le Complément automatique des instructions sont des assistances particulièrement utiles. Exemple :
3. Test du code VBA Pour tester votre code, placez le curseur dans une procédure (Sub) et appuyez sur la touche [F5]. Une fois le code validé, vous pouvez si nécessaire créer un bouton formulaire dans une feuille de calcul Excel qui appelle cette procédure lorsque vous cliquez sur le bouton. Pour cela, dans l’onglet Développeur, groupe Contrôles, cliquez sur Insérer, puis choisissez le bouton dans la liste des Contrôles de formulaire.
Une fois le bouton de formulaire implanté par tracé de sa diagonale, VBA vous propose de lui affecter une procédure :
Vous pouvez aussi créer un bouton de type Contrôle ActiveX dans une feuille de calcul. Une fois le bouton placé sur la feuille de calcul, cliquez à l’aide du bouton droit et choisissez l’option de menu Visualiser le code. Vous accédez alors à la procédure événementielle Click du bouton. À l’intérieur de la procédure Click vous pouvez soit inclure directement le code VBA du traitement voulu, soit appeler une procédure déjà existante. Exemple :
En cas d’erreur lors du test, VBE bloque le déroulement de la procédure et vous informe de la nature du problème par un message. Exemple :
VBE vous signale ensuite la procédure où l’erreur s’est produite.
Pour arrêter le contrôle et procéder à la correction, choisissez dans le menu Exécution Réinitialiser ou cliquez sur le bouton Réinitialiser de la barre d’outils standards :
4. Débogage Il est possible de procéder à une vérification syntaxique globale du code, en choisissant dans la barre de menus Débogage - Compiler VBAProject. Ceci est particulièrement intéressant pour des projets conséquents comportant de nombreuses procédures. Vous disposez également d’un environnement complet pour le débogage de vos procédures. Nous allons utiliser le débogueur au travers d’un exemple simple. Le tableau suivant doit être rempli avec des nombres de 1 à 5. Ensuite le total est affiché. 1 2 3 4 5 15 Ligne Instruction 1 Sub Exemple() 2 Dim intCompteur As Integer 3 Dim lngTotal As Long 4 Dim intTableau(0 To 5) As Integer 5 For intCompteur = 1 To 5 6 intTableau(intCompteur-1) = intCompteur 7 lngTotal = lngTotal + intCompteur 8 Next intCompteur 9 End Sub
Affichage simple des données Pour vérifier que le total est bien égal à 15, on peut faire appel aux instructions MsgBox ou Debug.Print. Pour contrôler la valeur de chaque case du tableau, Debug.Print, qui affiche en une seule fois les résultats dans la fenêtre d’exécution, est plus approprié.
Ligne Instruction 1 Sub Exemple() 2 Dim intCompteur As Integer 3 Dim lngTotal As Long 4 Dim intTableau(0 To 5) As Integer 5 For intCompteur = 1 To 5 6 intTableau(intCompteur-1) = intCompteur 7 Debug.Print intCompteur 8 lngTotal = lngTotal + intCompteur 9 Next intCompteur 10 MsgBox lngTotal 11 End Sub Interrompre le programme Pour interrompre l’exécution d’un programme, appuyez sur les touches [Ctrl][Pause/Attn]. Faites un essai par exemple avec : Dim intTableau (0 To 5000) As Integer For intCompteur = 1 To 5000
Cet arrêt forcé est bien utile pour sortir d’une boucle sans fin. L’IDE affiche une boîte de dialogue.
Le bouton Débogage permet de revenir au code VBA, à l’instruction où l’arrêt s’est produit, que cet arrêt soit forcé ou qu’il soit dû à une erreur. Barre d’outils de débogage Pour faire apparaître cette barre d’outils, utilisez le menu Affichage - Barre d’outils.
Placer un point d’arrêt Un point d’arrêt permet d’interrompre le programme à une instruction précise de la procédure.
Placez le curseur devant l’instruction Next intCompteur puis cliquez sur le bouton
.
Le point d’arrêt apparaît sous forme d’un cercle marron dans la barre grise à gauche de la fenêtre de code.
La procédure s’arrête à l’instruction comportant le point d’arrêt (celle-ci n’est pas exécutée). Pour poursuivre le programme, appuyez sur [F5] ou cliquez sur le bouton . Pour supprimer le point d’arrêt, le curseur étant sur la même ligne, cliquez à nouveau sur le bouton
.
Pas à pas détaillé Cette fonctionnalité permet d’exécuter la procédure instruction par instruction. Ainsi, pour la boucle For-Next de la procédure Exemple, l’exécution va se répéter 5000 fois ! Pour arrêter l’exécution, cliquez sur le bouton
.
Testez à nouveau la procédure en limitant, cette fois-ci, le compteur à 5. Placer un espion (espion express) Un espion permet de connaître la valeur de la variable sélectionnée. Désactivez ou supprimez les instructions permettant l’affichage des données. ‘Debug.Print intCompteur ... ‘MsgBox lngTotal
Nous allons recourir à un espion pour connaître la valeur des variables intCompteur et lngTotal. Lancez une exécution pas à pas détaillée. Le programme s’arrête une première fois à la ligne 5. Sélectionnez la variable intCompteur puis cliquez sur le bouton Espion Express . Une boîte de dialogue indique la valeur contenue dans la variable intCompteur.
Si en plus vous désirez visualiser les différentes valeurs prises par les variables, cliquez sur le bouton Ajouter. La fenêtre Espions est affichée.
Poursuivez le pas à pas. Faites de même avec la variable lngTotal.
Le principe est le même qu’il s’agisse d’une variable de type scalaire ou de type objet. Il est ainsi possible de connaître les valeurs des propriétés d’un objet si celles-ci sont appelées à être modifiées. Il est également possible de sélectionner une variable et de la faire glisser dans la fenêtre Espions. Consultez l’aide en ligne de VBA pour plus d’informations sur l’utilisation du débogueur.
5. Commenter le code Il est particulièrement recommandé de commenter le code. Les commentaires facilitent la compréhension du code, sa maintenance et les évolutions possibles. VBA utilise l’apostrophe pour ouvrir une ligne de commentaire.
6. L’onglet Développeur Nous avons vu précédemment dans ce chapitre comment faire apparaître l’onglet Développeur si celui-ci n’est pas affiché.
7. Ajouter un contrôle à une feuille de calcul Cliquez sur l’onglet Développeur puis sur le bouton suivant :
Vous pouvez maintenant placer facilement un contrôle de type formulaire ou un contrôle ActiveX sur la feuille de calcul. Contrôles de formulaire Les contrôles de formulaire requièrent l’affectation d’une macro-commande. Placez un contrôle sur la feuille de calcul puis choisissez une macro.
Contrôles ActiveX Placez un contrôle sur la feuille de calcul puis effectuez un clic droit sur celui-ci. Choisissez ensuite Visualiser le code. Vous basculez alors dans la fenêtre de VBE.
Complétez la procédure en saisissant votre code.
Pour tester le contrôle, désactivez le mode Mode Création en cliquant sur le bouton
.
Après utilisation, pour modifier le contrôle, cliquez sur le même bouton.
8. Création de formulaire Accédez à l’IDE et créez un nouveau formulaire.
Au besoin, affichez la boîte à outils par le menu Affichage. Choisissez ensuite les contrôles à ajouter et déposez-les dans le formulaire.
9. Ajout de contrôles supplémentaires à la boîte à outils
La boîte à outils contient par défaut un certain nombre de contrôles : ce sont les contrôles VBA. Pour en ajouter d’autres, effectuez un clic droit sur celle-ci puis cochez les nouveaux contrôles à ajouter à la boîte.
10. Aide sur les API Windows Téléchargez l’application ApiViewer, les données ainsi que le Language Pack French sur le site ActiveVB : http://www.activevb.de/rubriken/apiviewer/index-apiviewereng.html
Lancez l’exécutable apv2004-v310.exe.
Décompressez le fichier apvdata19122008.zip. Lancez l’application. Sélectionnez le fichier de données : Win32api.apv, menu Fichier - Options - Démarrage. Testez la visionneuse.
11. Ajout de nouvelles librairies au projet Librairies par défaut Pour fonctionner, VBA dispose d’un minimum de librairies (ou bibliothèques) référencées par défaut.
Référence pour les formulaires Lors de la création d’un formulaire, la DLL Microsoft Forms 2.0 Object Library est automatiquement ajoutée :
Ajout de nouvelles références Il suffit de cocher, dans la boîte de références, celles qui sont utiles au projet.
12. Enregistrement des classeurs Les classeurs Excel Microsoft 365 comportant du code VBA doivent être enregistrés dans un format particulier dont l’extension est .xlsm.
Introduction Durée : 55 minutes Mots-clés procédure générale, procédure événementielle, fonction, portée, argument, paramètre, passage d’arguments par référence, par valeur, appel d’une procédure Objectifs Connaître les différents types de procédure et leur portée. Savoir les utiliser pour structurer le code en unités logiques pour une meilleure maintenance et évolutivité. Découvrir la possibilité de constituer des bibliothèques de procédures pouvant être utilisées dans différents projets.
Prérequis Pour valider les prérequis nécessaires, avant d’aborder le TP, répondez aux questions ci-après (certaines questions peuvent nécessiter plusieurs réponses) : 1. 2. 3. 4. 5. 6.
Les trois types de procédures sont : a. Sub b. Call c. Function d. Property Les procédures sont généralement classées en : a. procédures générales. b. procédures événementielles. c. procédures objet. Une procédure débute toujours par : a. Public b. Private c. Sub Une procédure Sub peut : a. retourner une valeur. b. modifier la valeur d’une variable qui lui est passée. c. être imbriquée avec d’autres procédures. Une procédure Function : a. retourne une valeur. b. peut être utilisée par Excel. c. réagit à un événement. Par défaut, les procédures sont : a. publiques.
b. privées. c. locales. 7. Les procédures suivantes peuvent être appelées par toutes les procédures du projet : a. MaProcédure1() b. Private Sub MaProcédure2() c. Public Sub MaProcédure3() 8. La procédure ci-après n’est pas correcte car : Public Sub MaProcédureA() MaProcédureB() End Sub
a. MaProcédureB doit être précédé du mot Sub. b. MaProcédureB ne doit pas avoir de parenthèses. c. il est interdit d’inclure le nom d’une procédure dans le corps d’une autre procédure. 9. Quand une variable est passée par valeur à une procédure, celle-ci : a. dispose seulement d’une copie de cette variable. b. peut accéder au contenu de la variable proprement dite et modifier sa valeur. 10. Les arguments (ou paramètres) d’une procédure peuvent parfois être très nombreux. Lors de l’appel d’une procédure, il est possible de spécifier uniquement ceux dont on a besoin en utilisant : a le passage par référence. b les paramètres nommés. c le passage par valeur.
Énoncé 1.1 Créer et utiliser une procédure privée Durée estimative : 5 minutes Ajoutez dans l’environnement VBE, un module nommé Module1. Créez dans ce module une procédure privée nommée DemandeNom. Récupérez la saisie de l’utilisateur dans une variable. Voici le résultat à obtenir.
Indice Dans la partie déclaration, saisissez : Dim strNom As String
Pour afficher la boîte de dialogue et récupérer le nom saisi : strNom = InputBox("Quel est votre nom ?")
Note Le curseur étant placé dans la procédure, appuyez sur la touche [F5] pour l’exécuter.
Énoncé 1.2 Créer et utiliser une procédure publique Durée estimative : 5 minutes Créez la procédure publique BonjourVous, affichant la boîte suivante :
Indice Pour l’affichage : MsgBox ("Bonjour. Bonne lecture.")
Énoncé 1.3 Appeler une procédure à partir d’une autre procédure Durée estimative : 5 minutes Créez la procédure BonjourVousAppelProc qui appelle la procédure DemandeNom puis qui affiche un message personnalisé de bienvenue. Exemple :
Indice Pour l’affichage : MsgBox ("Bonjour") & strNom & (". Bonne lecture.")
Énoncé 1.4 Appeler une procédure à partir d’un autre module Durée estimative : 5 minutes Créez un nouveau module nommé Module2. Créez dans ce module une procédure nommée TestAppelExtérieur qui appelle la procédure BonjourVous du module Module1. Exemple :
Énoncé 1.5 Appeler une procédure à partir d’un contrôle VBA Durée estimative : 10 minutes Créez dans la feuille Feuil1 un bouton de commande VBA. Complétez le code du bouton VBA ci-après avec un appel à la procédure BonjourVous.
Indice Private Sub CommandButton1_Click() . . . End Sub
Énoncé 1.6 Utiliser une procédure à partir d’une feuille de calcul Excel Durée estimative : 5 minutes Créez une procédure événementielle qui affiche le message de bienvenue grâce à un appel à la procédure BonjourVous à chaque fois que la deuxième feuille du classeur (Feuil2) est activée. Indice Private Sub Worksheet_Activate() . . . End Sub
La procédure doit être saisie dans la zone de code de la feuille de calcul concernée. Effectuez un clic droit sur l’onglet de la feuille Feuil2.
Énoncé 1.7 Utiliser une procédure à partir d’un classeur Excel Durée estimative : 5 minutes Créez une procédure événementielle qui, à chaque ouverture du classeur, affiche le message de bienvenue. Indice Private Sub Workbook_Open() . . . End Sub
La procédure doit être saisie dans la zone de code de ThisWorkbook.
Énoncé 1.8 Créer une fonction Durée estimative : 5 minutes Créez dans Module1 une fonction nommée CalculCarré qui calcule le carré d’un nombre. Indice Utilisez le passage d’arguments par valeur.
Énoncé 1.9 Utiliser une fonction Durée estimative : 5 minutes Créez dans Module1 une procédure nommée RechercheCarré qui permet de calculer le carré d’un nombre saisi par l’utilisateur et qui affiche le résultat.
Énoncé 1.10 Utiliser des paramètres nommés Durée estimative : 5 minutes Créez dans Module1 une procédure nommée TestParamètresNommés qui appelle la fonction suivante en utilisant les noms des paramètres : Function Message(strDébutPhrase As String, Optional strNom As _ String, Optional strFinPhrase As String) As String Message = strDébutPhrase & strNom & vbCrLf & vbCrLf & strFinPhrase End Function
N’utilisez que les premier et dernier paramètres en les nommant. Résultat :
Indice Pensez à saisir ou à copier au préalable cette fonction.
Prérequis 1. a., c. et d.
2. a. et b. La procédure générale est appelée explicitement par le programme et réalise une tâche particulière. La procédure événementielle est appelée par un objet qui est programmé pour réagir à un événement précis suite à une action de l’utilisateur. La meilleure technique de programmation consiste à placer des instructions communes dans une procédure générale qui peut être appelée par des procédures événementielles. 3. c. 4. b. 5. a. et b. 6. a. 7. a. et c. 8. b. Sans paramètres attendus, la procédure MaProcédureB, appelée par la procédure MaProcédureA, ne doit pas comporter de parenthèses. Il est possible aussi d’utiliser l’instruction facultative Call. Les deux instructions cidessous sont équivalentes : Call MaProcédureB MaProcédureB Si vous utilisez l’instruction Call, obligatoirement entre parenthèses.
les
éventuels
arguments
sont
9. a. 10. b. En outre, les paramètres nommés peuvent être mentionnés dans un ordre quelconque.
Corrigé 1.1 Créer et utiliser une procédure privée Dans la section Déclarations du module, saisissez : Private strNom As String
Saisissez ensuite la procédure : Private Sub DemandeNom() strNom = InputBox("Quel est votre nom ?") End Sub
Commentaire Par défaut les procédures sont de type Public. On peut aussi le mentionner explicitement :
Public Sub DemandeNom()
Le mot-clé Private indique que la procédure ne peut être appelée que par les procédures de son module.
Corrigé 1.2 Créer et utiliser une procédure publique Sub BonjourVous() MsgBox ("Bonjour. Bonne lecture.") End Sub
Précédent Corrigé 1.1 Créer et utiliser une procédure privée Suivant
Corrigé 1.3 Appeler une procédure à partir d’une autre procédure Sub BonjourVousAppelProc() Call DemandeNom MsgBox ("Bonjour ") & strNom & (". Bonne lecture.") End Sub
Commentaire La syntaxe suivante est équivalente à Call DemandeNom : DemandeNom
Pour une meilleure lisibilité du code VBA, il est toutefois conseillé d’utiliser le mot-clé Call. Les procédures d’un même module peuvent s’appeler mutuellement quel que soit leur type (Public ou Private).
Corrigé 1.4 Appeler une procédure à partir d’un autre module
Sub TestAppelExtérieur() Call BonjourVous End Sub
Commentaire La procédure BonjourVous du module Module1 est une procédure publique. Toutes les procédures du projet peuvent donc l’appeler. Notez qu’elle contient elle-même un appel à la procédure privée DemandeNom appartenant aussi au module Module1. Ceci ne pose aucun problème de portée puisque la procédure TestAppelExtérieur n’appelle pas directement cette dernière.
Corrigé 1.5 Appeler une procédure à partir d’un contrôle VBA Private Sub CommandButton1_Click() Call BonjourVous End Sub
Commentaire L’appel d’une procédure à partir d’un contrôle VBA obéit aux même règles que celles vues précédemment (exercice 1.4). Le code est à placer dans le bouton VBA. Il peut être lu et modifié aussi à partir du code de la feuille de calcul Excel (clic droit sur l’onglet de la feuille Feuil1).
Corrigé 1.6 Utiliser une procédure à partir d’une feuille de calcul Excel Private Sub Worksheet_Activate() Call BonjourVous End Sub
Commentaire À placer dans la zone de code de la feuille Feuil2. L’appel d’une procédure à partir d’une feuille de calcul obéit aussi aux mêmes règles vues précédemment (exercice 1.4).
Corrigé 1.7 Utiliser une procédure à partir d’un classeur Excel Private Sub Workbook_Open() Call BonjourVous End Sub
Commentaire Les exercices 1.5, 1.6 et 1.7 font intervenir le concept d’événement, concept très important dans la programmation orientée objet. Il est l’objet de nombreux exercices dans les chapitres Formulaires et Contrôles.
Corrigé 1.8 Créer une fonction Function CalculCarré(ByVal dblNombre As Double) As Double CalculCarré = dblNombre * dblNombre End Function
Commentaire Lorsqu’on utilise des valeurs décimales, il est préférable de les typer en Double plutôt qu’en Single. On obtient ainsi la meilleure précision possible.
Il est impossible d’exécuter directement une procédure Function. Elle doit être appelée par une procédure Sub, ou par une autre Function.
Corrigé 1.9 Utiliser une fonction Sub RechercheCarré() Dim dblNombre As Double dblNombre = InputBox("Entrer un nombre.") dblNombre = CalculCarré(dblNombre) MsgBox dblNombre End Sub
Commentaire Pour toute demande de saisie, le risque d’erreur est présent. Les chapitres suivants traitent le contrôle de saisie et la gestion des erreurs.
Corrigé 1.10 Utiliser des paramètres nommés Fonction Message : Function Message(strDébutPhrase As String, Optional strNom As _ String, Optional strFinPhrase As String) As String Message = strDébutPhrase & strNom & vbCrLf & vbCrLf & strFinPhrase End Function
Commentaire La constante Visual Basic vbCrLf permet de générer à l’affichage un saut de ligne forcé. Procédure qui appelle la fonction Message : Sub TestParamètresNommés() Dim strMessageAffiché As String strMessageAffiché = Message(strDébutPhrase:="Bonjour ", _ strFinPhrase:="à tous") MsgBox strMessageAffiché End Sub
Commentaire Appel de la fonction sans arguments nommés :
Sub TestParamètresNommés() Dim strMessageAffiché As String ' Les trois arguments sont fournis. strMessageAffiché = Message("Bonjour ", "à tous", "Au revoir") MsgBox strMessageAffiché End Sub
Également : Sub End
TestParamètresNommés() Dim strMessageAffiché As String ' Le deuxième argument facultatif est omis. strMessageAffiché = Message("Hello", , "A bientôt") MsgBox strMessageAffiché Sub
Chapitre 2 : Variables - Constantes - Types de données
Introduction Durée : 1 heure 05 Mots-clés déclaration, portée, durée de vie, type, affectation, argument, type de données VBA, type de données utilisateur, membre, conversion, variable de type objet Objectifs Maîtriser l’emploi des variables et des constantes pour l’écriture des procédures et la réalisation de programmes.
Prérequis Pour valider les prérequis nécessaires, avant d’aborder le TP, répondez aux questions ci-après (certaines questions peuvent nécessiter plusieurs réponses) : 1. La déclaration des variables dans VBA : a. est réalisée avec l’instruction Option Explicit dans la partie déclaration du module. b. peut être étendue à l’ensemble des modules.
2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
c. est obligatoire. d. doit être suivie obligatoirement du type de données. Un nom de variable : a. peut contenir un espace. b. doit commencer par une lettre. c. doit être unique au sein d’une même portée. Une variable est accessible uniquement par les procédures de son module quand elle est déclarée avec l’instruction : a. Dim, au sein de la procédure. b. Dim, dans la partie déclaration du module. c. Private. d. Public. Lorsqu’une variable perd sa portée : a. elle devient accessible à toutes les procédures. b elle n’a plus de valeur sauf si elle est déclarée statique. c elle perd son type. Les déclarations de variables suivantes sont correctes dans la partie déclaration du module : a. Public varTest1 b. Private dblTest2 As Double c. dblTest3 As Double Dans l’instruction suivante Dim strMot, strPhrase as String, la variable strMot est de type : a. String b. Variant c. inconnu Pour déclarer la constante publique Pi on écrit : a. Public Const Pi As Double = 3.1415926 b. Const Pi Public = 3.1415926 As Double c. Const Pi = 3.1415926 Le type de données par défaut des variables est : a. Byte b. String c. Variant La déclaration du type s’effectue avec l’instruction : a. To b. As c. VarType Une variable peut être de type : a. tableau b. objet c. feuille de calcul Excel Une variable de type objet : a. contient une référence à l’objet. b. contient l’objet lui-même. c. contient la valeur de l’objet.
12. 13. 14. 15.
Le type de données numériques le plus précis est : a. Single b. Currency c. Double La conversion des données est possible : a. oui b. non c. uniquement pour les chaînes de caractères. La création de ses propres types de données est possible : a. oui b. non c. seulement pour les tableaux ou collections. Pour connaître le type de données d’une variable, on utilise le mot réservé : a. Is b. Cvar c. VarType
Énoncé 2.1 Déclarer et utiliser une variable Durée estimative : 20 minutes 2.1.1 : Déclarer et utiliser une variable de niveau projet Dans le module Module1, déclarez une variable publique nommée strMessagePublic de type String. Créez une procédure nommée Message qui affiche le message suivant :
Indice Pour afficher la boîte de dialogue, utilisez la fonction MsgBox. 2.1.2 : Utiliser une variable de niveau projet Dans un deuxième module nommé Module2, créez une procédure nommée AppelExtérieur qui utilise la variable strMessagePublic du Module1 pour afficher le message suivant :
Indice Pour forcer un saut de ligne : vbCrLf. Utilisez l’opérateur de concaténation & pour composer le message. 2.1.3 : Déclarer et utiliser une variable de niveau module Dans le module Module1, déclarez une variable privée nommée strMessagePrivé de type String. Créez une procédure nommée MessageInterne qui affiche le message suivant :
2.1.4 : Déclarer et utiliser une variable de niveau procédure Dans le module Module1, créez une procédure nommée MessageLocal. Celle-ci utilise une variable locale nommée strMessageLocal de type String. Résultat :
2.1.5 : Déclarer et utiliser plusieurs variables de même type Dans le module Module1, créez une procédure nommée VariablesLigne dont voici le code : Sub VariablesLigne() Dim intv1, intv2, intv3 As Integer MsgBox ("intv1 : " & VarType(intv1) & vbCrLf & "intv2 : " _ & VarType(intv2) & vbCrLf & "intv3 : " & VarType(intv3))
End Sub
Résultat :
Corrigez la déclaration de sorte que les trois variables soient effectivement de type entier.
Énoncé 2.2 Déclarer et utiliser une constante Durée estimative : 10 minutes 2.2.1 : Conversion Dans le module Module1, déclarez une constante publique nommée sglPouce de type Single. Affectez-lui la valeur 25,4. Créez une procédure nommée ConversionPouceEnmm qui convertit les pouces en millimètres. Exemple :
Indice Faites attention au séparateur décimal. 2.2.2 : Utiliser des constantes VBA pour le choix des boutons des boîtes de messages
VBA possède de nombreuses constantes internes qui simplifient la programmation. Avec elles, il est possible par exemple de choisir facilement les boutons de la boîte de dialogue standard. Affichage seulement du bouton OK : Sub ConstanteVBA() Dim intRésultat As Integer intRésultat = MsgBox("Bouton OK seul", vbOKOnly) End Sub
Indice Voici un extrait de l’aide en ligne de VBA Excel :
Énoncé 2.3 Utiliser la date système Durée estimative : 10 minutes Créez la procédure ConversionDate qui effectue une conversion de la date système en type String. Procédez aux deux affichages suivants. Exemple :
Indice Utilisez la fonction VBA Date pour avoir la date système. Utilisez la fonction VBA CStr pour la conversion. Syntaxe : CStr(expression) Utilisez la fonction VBA Format pour la présentation de la date après conversion en texte. Syntaxe simplifiée : Format(expression)
Énoncé 2.4 Créer un type de données "Région" défini par l’utilisateur Durée estimative : 5 minutes Créez un type public nommé Région. Les membres de ce nouveau type sont : Nom, Superficie, ChefLieu et Population. Indice Public . . . Région NomRégion As . . . SuperficieRégion. . . ChefLieuRégion . . .
PopulationRégion . . . End Type
Énoncé 2.5 Utiliser le type "Région" Durée estimative : 10 minutes Complétez la procédure NouvelleRégion ci-après. Elle permet de saisir une nouvelle région et affecte chaque saisie à une cellule de la première feuille de calcul Excel. Sub NouvelleRégion() Dim uneRégion As ... On Error GoTo Erreur With Worksheets("Feuil1") uneRégion.NomRégion = InputBox("Saisir le nom") .Range("I2").Value = ... ... = InputBox("Saisir le chef-lieu") .Range("I3").Value = uneRégion.ChefLieuRégion . . . End With Erreur: End Sub
Énoncé 2.6 Renommer une feuille de calcul Excel Durée estimative : 10 minutes Créez la procédure RenommerFeuille qui renomme la deuxième feuille de calcul du classeur par un nom saisi.
Indice Utilisez l’instruction Set pour l’affectation de la deuxième feuille de calcul à la variable objet.
Prérequis 1. a. et b. Il est toutefois fortement recommandé de déclarer toutes les variables explicitement et de les typer pour disposer d’un code rigoureux et du contrôle de VBE. 2. b. et c. 3. b. et c. Préférez toutefois l’instruction Private à Dim dans la partie déclaration. 4. b. La déclaration Static concerne habituellement des variables locales (au sein d’une procédure). 5. a. et b. Dans la partie déclaration, les variables doivent être précédées par les instructions Public, Private ou Dim. 6. b. Lorsque plusieurs variables sont présentes dans une même déclaration, le type de données ne concerne que la dernière variable. Les autres reçoivent le type par défaut, à savoir le type Variant. 7. a. 8. c. 9. b. 10. Les trois réponses sont bonnes. 11. a. 12. b. Le type de données Currency est utile pour les calculs monétaires et pour les calculs à virgule fixe dans lesquels la précision revêt une importance
particulière.
13. a. 14. a. 15. c. Par défaut, les constantes sont de type Private.
Corrigé 2.1 Déclarer et utiliser une variable 2.1.1 : Déclarer et utiliser une variable de niveau projet Déclaration de la variable publique dans la partie déclaration du module. Public strMessagePublic As String
Écriture de la procédure. Sub Message() strMessagePublic = "Utilisation d'une variable publique" MsgBox strMessagePublic End Sub
2.1.2 : Utiliser une variable de niveau projet Sub AppelExtérieur() strMessagePublic = "Utilisation d'une variable publique" & _ vbCrLf & vbCrLf & "Appel à partir d'un autre module" MsgBox strMessagePublic End Sub
2.1.3 : Déclarer et utiliser une variable de niveau module Déclaration de la variable privée dans la partie déclaration du module. Private strMessagePrivé As String
Écriture de la procédure. Sub MessageInterne strMessagePrivé = "Utilisation d'une variable privée" MsgBox strMessagePrivé End Sub
2.1.4 : Déclarer et utiliser une variable de niveau procédure Sub MessageLocal() Dim strMessageLocal As String strMessageLocal = "Utilisation d'une variable locale" MsgBox strMessageLocal End Sub
2.1.5 : Déclarer et utiliser plusieurs variables de même type
Sub VariablesLigne() Dim intv1 As Integer, intv2 As Integer, intv3 As Integer MsgBox ("intv1 : " & VarType(intv1) & vbCrLf & "intv2 : " _ & VarType(intv2) & vbCrLf & "intv3 : " & VarType(intv3)) End Sub
Corrigé 2.2 Déclarer et utiliser une constante 2.2.1 : Conversion Déclaration de la constante dans la partie déclaration du module. Public Const sglPouce As Double = 25.4
Écriture de la procédure. Sub ConversionPouceEnmm() Dim dblNBPouce As Double Dim dblRésultatmm As Double On Error GoTo Sortie_Sur_Erreur dblNBPouce = InputBox("Nombre de pouces") dblRésultatmm = dblNBPouce * dblPouce MsgBox dblNBPouce & " pouces = " & dblRésultatmm & " mm" Sortie_Sur_Erreur: End Sub
2.2.2 : Utiliser des constantes VBA pour le choix des boutons des boîtes de messages Sub ConstanteVBA() Dim intRésultat As Integer intRésultat = MsgBox("Bouton OK seul", vbOKOnly) intRésultat = MsgBox("Boutons Oui et Non", vbYesNo) intRésultat = MsgBox("Boutons Recommencer et Annuler", _ vbRetryCancel) End Sub
Corrigé 2.3 Utiliser la date système Sub ConversionDate() Dim datDate As Date Dim strChaîne1 As String Dim strChaîne2 As String Dim strChaîne3 As String datDate = Date MsgBox "Affichage de la date système : " & datDate strChaîne1 = "Conversion de la date en texte" & vbCrLf strChaîne2 = "Nous sommes le "
strChaîne3 = Cstr(datDate) strChaîne3 = Format(datDate, "dd mmmm yyyy") MsgBox strChaîne1 & strChaîne2 & strChaîne3 End Sub
L’écriture peut être plus concise. Celle qui est présentée ici permet de bien dissocier la conversion du formatage du texte.
Corrigé 2.4 Créer un type de données "Région" défini par l’utilisateur Déclaration du type dans la partie déclaration du module. Public Type Région NomRégion As String * 30 SuperficieRégion As Long ChefLieuRégion As String * 20 PopulationRégion As Long End Type
Corrigé 2.5 Utiliser le type "Région" Sub NouvelleRégion() Dim uneRégion As Région On Error GoTo Erreur With Worksheets("Feuil1") uneRégion.NomRégion = InputBox("Saisir le nom") .Range("I2").Value = uneRégion.NomRégion uneRégion.ChefLieuRégion = InputBox("Saisir le chef-lieu") .Range("I3").Value = uneRégion.ChefLieuRégion uneRégion.PopulationRégion = InputBox("Saisir la population") .Range("I4").Value = uneRégion.PopulationRégion uneRégion.SuperficieRégion = InputBox("Saisir la superficie (en km²)") .Range("I5").Value = uneRégion.SuperficieRégion End With Erreur: End Sub
Corrigé 2.6 Renommer une feuille de calcul Excel
Sub RenommerFeuille() On Error GoTo Sortie_Sur_Erreur Dim wksFeuille As Worksheet Dim strNom As String Set wksFeuille = ActiveWorkbook.Worksheets(2) strNom = InputBox("Saisir le nouveau nom pour la 2ème feuille") wksFeuille.Name = strNom Sortie_Sur_Erreur: End Sub
Introduction Durée : 1 heure 15 Mots-clés appel d’une fonction, passage de paramètres, opérande, ordre de priorité, opération, concaténation, comparaison Objectifs Utiliser les fonctions et connaître les principaux opérateurs pour effectuer des calculs, des comparaisons, des concaténations et des opérations logiques.
Prérequis Pour valider les prérequis nécessaires, avant d’aborder le TP, répondez aux questions ci-après (certaines questions peuvent nécessiter plusieurs réponses) : 1. Les signes suivants sont des opérateurs arithmétiques VBA : a. ^ b. \ c. § 2. Résultat du calcul : (10 - 8) / 2 + 4 - 3 * 2 a. 0 b. 4 c. -1 3. La variable strRésultat suivante a pour valeur : Dim strVar1 As String Dim intVar2 As Integer
Dim strRésultat As String strVar1 = "2" intVar2 = 2 strRésultat = Var1 & Var2
a. 0 b. 22 c. 4 4. La variable blnC suivante a pour valeur : Dim intA Dim intB Dim blnC intA = 5 blnC = A
As Integer As Integer As Boolean * 2 : intB = 8 > B Xor A < 12
a. vrai b. faux 5. L’opérateur Is compare : a. des références d’objets b. des objets c. des valeurs d’objets 6. Opérateur qui divise deux nombres en ne renvoyant que le reste : a. Modulo b. Mod c. Div 7. Opérateurs logiques VBA : a. & b. Not c. Xor
1. Note préliminaire Dans ce chapitre, ainsi que dans toute la suite de l’ouvrage, les fonctions intégrées de VBA seront préfixées par le nom de leur bibliothèque. Ainsi, on écrit VBA.Right plutôt que Right. La deuxième syntaxe, bien que correcte, peut, et de façon aléatoire, ne pas fonctionner sur certaines installations d’Excel. L’utilisateur prudent, amené à distribuer ses développements sur plusieurs postes de travail, s’imposera donc la discipline d’écriture du code spécifiée ici.
Énoncé 3.1 Diviser deux nombres Durée estimative : 5 minutes
Créez la procédure Division qui demande de saisir deux nombres puis divise le premier par le second. Affichez le résultat. Exemple : 60 : 50
Énoncé 3.2 Obtenir le reste d’une division entière Durée estimative : 5 minutes À partir des deux dialogues de départ de l’énoncé précédent, créez la procédure DivisionEntièreReste qui effectue la division entière de deux nombres et qui affiche également le reste. Exemple :
Indice
Utilisez la constante vbCrLf pour obtenir un saut de ligne
Énoncé 3.3 Comparer des nombres et rechercher le plus petit d’entre eux Durée estimative : 10 minutes Créez une fonction TrouvePetit qui compare deux nombres et affiche le plus petit d’entre eux. Testez ensuite cette fonction dans une procédure RéponsePetit. Exemple :
Indice Utilisez l’opérateur logique And pour traiter le cas de nombres égaux. Pour la fonction, utilisez la structure conditionnelle : If ... Else ... End If.
Énoncé 3.4 Donner le résultat d’un nombre élevé à la puissance N Durée estimative : 10 minutes
Créez une procédure Puissance qui élève un nombre à une puissance donnée et qui affiche le résultat. Exemple : 7,48
Indice Utilisez la fonction VBA.Format pour la présentation du résultat.
Énoncé 3.5 Comparer deux chaînes de caractères Durée estimative : 10 minutes Créez une fonction TestChaîne qui compare deux chaînes de caractères. Testez ensuite cette fonction dans une procédure EX5. Exemple, saisissez les mots suivants : SOLEIL et Soleil.
Note VBA fait une distinction entre minuscules et majuscules, de même pour les accents.
Énoncé 3.6 Effectuer un calcul factoriel Durée estimative : 10 minutes Créez une fonction nommée Factorielle qui calcule la factorielle d’un nombre entier. Testez ensuite cette fonction dans une procédure qui demande la saisie d’un nombre entre 1 et 20 puis affiche le résultat. Exemple :
Indice Le résultat retourné par la fonction doit être de type Double car le calcul factoriel donne rapidement de très grands nombres.
Note Ne saisissez pas de nombres entiers trop grands pour ne pas arriver en dépassement de capacité.
Énoncé 3.7 Calculer le pourcentage Durée estimative : 10 minutes Créez une fonction nommée CalculPourcentage qui exprime le pourcentage d’un nombre par rapport à un deuxième nombre. Créez ensuite une procédure AppelPourcentage qui appelle cette fonction et demande à l’utilisateur d’entrer le premier nombre (numérateur), puis le second (dénominateur). Exemple pour une classe de 30 élèves dont 18 garçons, trouvez le pourcentage de garçons.
Indice Pour la fonction, utilisez le passage d’arguments par valeur.
Énoncé 3.8 Formater un mot Durée estimative : 5 minutes
Créez une procédure FormateMot qui demande la saisie d’un nom et qui le retourne converti en majuscules et sans espaces avant et après. Exemple :
Indice Utilisez les fonctions de gestion de chaînes de caractères VBA.LTrim(), VBA.RTrim et VBA.UCase().
Énoncé 3.9 Rechercher un mot Durée estimative : 5 minutes Créez une procédure ChercheMot qui permet de vérifier la présence d’un mot dans une phrase ou dans un texte. Un message est affiché en fonction du résultat de la recherche. Exemples :
Indice
Utilisez la fonction VBA.InStr().
Énoncé 3.10 Extraire une information d’une chaîne de caractères Durée estimative : 5 minutes La cotation suivante d’un des titres du CAC 40 a été importée d’un site boursier : « 2021-0908,5052.879883,5061.600098,4935.379883,4973.520020,4973.520020,85589800 ». Elle est structurée selon sept champs : Date, Open, High, Low, Close, Adj Close, Volume. Créez la procédure ExtraireInfo permettant d’extraire la date de cette chaîne de caractères.
Indice Utilisez les fonctions VBA.Left() et VBA.CDate().
Prérequis 1. 2. 3. 4. 5. 6. 7.
a.et b. c. b. b. a. b. b. et c.
Corrigé 3.1 Diviser deux nombres Sub Division() Dim dblNombre1 As Double Dim dblNombre2 As Double Dim dblRésultat As Double On Error GoTo Sortie_Sur_Erreur dblNombre1 = InputBox("Entrez le dividende") dblNombre2 = InputBox("Entrez le diviseur") dblRésultat = dblNombre1 / dblNombre2 MsgBox "Résultat : " & dblRésultat Sortie_Sur_Erreur: End Sub
Commentaire Pour toute demande de saisie, le risque d’erreur existe. Les chapitres Structures de contrôle et Tableaux traitent du contrôle de saisie. La gestion des erreurs est traitée au chapitre Introduction à la programmation objet.
Corrigé 3.2 Obtenir le reste d’une division entière Sub DivisionEntièreReste() Dim dblNombre1 As Double Dim dblNombre2 As Double Dim dblReste As Double Dim dblRésultat As Double Dim strChaîne1 As String Dim strChaîne2 As String Dim strChaîne3 As String On Error GoTo Sortie_Sur_Erreur dblNombre1 = InputBox("Entrez le dividende") dblNombre2 = InputBox("Entrez le diviseur") dblReste = dblNombre1 Mod dblNombre2 dblRésultat = dblNombre1 \ dblNombre2 strChaîne1 = "Division de " & dblNombre1 & " par " & dblNombre2 strChaîne2 = dblNombre1 & ":" & dblNombre2 & "=" & dblRésultat strChaîne3 = " reste : " & dblReste MsgBox strChaîne1 & vbCrLf & strChaîne2 & vbCrLf & strChaîne3 Sortie_Sur_Erreur: End Sub
Corrigé 3.3 Comparer des nombres et rechercher le plus petit d’entre eux
Code de la fonction : Function TrouvePetit(ByVal dblN1 As Double, ByVal dblN2 As Double) _ As Double If dblN1 < dblN2 Then TrouvePetit = dblN1 Else TrouvePetit = dblN2 End If End Function
Code de la procédure : Sub RéponsePetit() Dim dblNombre1 As Double Dim dblNombre2 As Double Dim dblNBPetit As Double On Error GoTo Sortie_Sur_Erreur dblNombre1 = InputBox("Entrez le 1er nombre") dblNombre2 = InputBox("Entrez le 2ème nombre") dblNBPetit = TrouvePetit(dblNombre1, dblNombre2) If dblNombre1 = dblNBPetit And dblNombre2 = dblNBPetit Then MsgBox "Nombres égaux" ElseIf dblNombre1 = dblNBPetit Then MsgBox dblNombre1 & " < " & dblNombre2 ElseIf dblNombre2 = dblNBPetit Then MsgBox dblNombre2 & " < " & dblNombre1 End If Sortie_Sur_Erreur: End Sub
Corrigé 3.4 Donner le résultat d’un nombre élevé à la puissance N Sub Puissance() Dim dblNombre As Double Dim dblPuissance As Double Dim dblRésultat As Double Dim strChaîne As String On Error GoTo Sortie_Sur_Erreur dblNombre = InputBox("Entrer le nombre") dblPuissance = InputBox("Entrer la puissance") dblRésultat = dblNombre ˆ dblPuissance strChaîne = dblNombre & " ˆ " & dblPuissance & " = " MsgBox strChaîne & VBA.Format(dblRésultat, "### ### ###.00") Sortie_Sur_Erreur: End Sub
Corrigé 3.5 Comparer deux chaînes de caractères Code de la fonction : Function TestChaîne(strT1 As String, strT2 As String) As String If strT1 = strT2 Then TestChaîne = "Ces deux mots sont identiques." Else TestChaîne = "Ces deux mots ne sont pas identiques." End If End Function
Code de la procédure : Sub EX5() Dim strMot1 As String Dim strMot2 As String Dim strRésultat As String strMot1 = InputBox("Entrer le premier mot") strMot2 = InputBox("Entrer le deuxième mot") strRésultat = TestChaîne(strMot1, strMot2) MsgBox strRésultat End Sub
Corrigé 3.6 Effectuer un calcul factoriel Code de la fonction : Function Factorielle(intNombre As Integer) As Double If intNombre > 0 Then Factorielle = Factorielle(intNombre - 1) * intNombre Else Factorielle = 1 End If End Function
Commentaire Cette fonction est dite récursive puisque la fonction Factorielle s’appelle elle-même. Elle peut être écrite de manière plus classique : Function Factorielle(intNombre As Integer) As Double Dim intNombreEnCours As Integer Dim dblRésultat As Double dblRésultat = 1 For intNombreEnCours = 1 To intNombre Factorielle = dblRésultat * intNombreEnCours intRésultat = Factorielle Next intNombreEnCours End Function
Code de la procédure : Sub AppelFactorielle() Dim intNombreEntier As Integer Dim dblRésultat As Double On Error GoTo Sortie_Sur_Erreur intNombreEntier = _ InputBox("Saisir un nombre entier entre 1 et 20") dblRésultat = Factorielle(intNombreEntier) MsgBox intNombreEntier & "! =" & dblRésultat Sortie_Sur_Erreur: End Sub
Note Pour formater le nombre, utiliser la fonction VBA.Format. VBA.Format(dblRésultat, "##,##0")
Exemple : MsgBox intNombreEntier &"!="&VBA.Format(dblRésultat, "##,##0")
Corrigé 3.7 Calculer le pourcentage Code de la fonction : Function CalculPourcentage(ByVal dblN1 As Double, ByVal dblN2 As _ Double) As Double CalculPourcentage = dblN1 / dblN2 * 100 End Function
Code de la procédure : Sub AppelPourcentage() Dim dblNumérateur As Double Dim dblDénominateur As Double Dim dblPourcentage As Double On Error GoTo Sortie_Sur_Erreur dblNumérateur = InputBox("Numérateur") dblDénominateur = InputBox("Dénominateur") dblPourcentage = CalculPourcentage(dblNumérateur, dblDénominateur) dblPourcentage = VBA.Round(dblPourcentage, 2) MsgBox "Pourcentage :" & dblPourcentage & "%" Sortie_Sur_Erreur: End Sub
Corrigé 3.8 Formater un mot
Sub FormateMot() Dim strMot As String, strMotFormate As String strMot = InputBox("Saisir un nom :") strMotFormate = VBA.LTrim(strMot) strMotFormate = VBA.RTrim(strMotFormate) strMotFormate = VBA.UCase(strMotFormate) MsgBox "Nom saisi : '" & strMot & "'" & vbCrLf & _ "Nom converti : '" & strMotFormate & "'" End Sub
Corrigé 3.9 Rechercher un mot Sub ChercheMot() Dim strPhrase As String, strMot As String Dim intPositionDebut As Integer strPhrase = InputBox("Saisir une phrase :") strMot = InputBox("Saisir le mot à chercher :") intPositionDebut = VBA.InStr(strPhrase, strMot) If intPositionDebut = 0 Then MsgBox "Le mot " & strMot & " n'est pas présent." Else MsgBox "Le mot " & strMot & " est présent." End If End Sub
Corrigé 3.10 Extraire une information d’une chaîne de caractères Sub ExtraireInfo() Dim strChaine As String Dim datDate As Date strChaine = "2021-09-08,5052.879883, 5061.600098,4935.379883,4973.520020,4973.520020,85589800" datDate =VBA.CDate(VBA.Left(strChaine, 10)) MsgBox datDate End Sub
Introduction Durée : 1 heure 55 Mots-clés
condition, choix, alternative, branchement conditionnel, compteur, itération, incrémenter, décrémenter, sortie, boucle, test Objectifs Maîtriser les structures de décision afin de tester des conditions puis effectuer des actions différentes selon le résultat obtenu. Maîtriser les instructions d’itération qui, associées aux instructions conditionnelles, permettent d’écrire du code Visual Basic pour la prise de décision et la répétition des actions. Vous retrouverez ces structures dans la suite du livre. Dans ce chapitre, nous nous limitons à l’emploi des boîtes de dialogue déjà rencontrées.
Prérequis Pour valider les prérequis nécessaires, avant d’aborder le TP, répondez aux questions ci-après (certaines questions peuvent nécessiter plusieurs réponses) : 1 . 2 .
Les structures suivantes sont des structures de décision : a. If ... Then ... Else ... End If b. Do ... Loop c. Select Case ... Case ... End Select Résultat = IIf(7 / 2 > 3, IIf(2.8 * 3.3< 11, "X", "Y"), "Z") La variable Résultat contient la valeur : a. X b. Y c. Z Les instructions suivantes appartenant chacune à une structure de contrôle différente sont correctes : a. Case If N1 > N2 b. Case A, B, C c. Case 1 to 10 d. Case Nombre, Is > 50 Le mot-clé ElseIf :
3 . 4 . a. peut apparaître de suite après une clause Else. b. est facultatif.
5 . 6 . 7 . 8 . 9 .
c. peut être utilisé plusieurs fois dans un bloc If. Répétition d’instructions tant qu’une condition a la valeur True : a. For Each ... Next b. For ... Next c. Do ... Loop d. While ... Wend e. With ... End With Utilisation d’un compteur pour exécuter des instructions un certain nombre de fois : a. For Each ... Next b. For ... Next c. Do ... Loop d. While ... Wend e. With ... End With Répéter un groupe d’instructions pour chaque élément d’un tableau ou d’une collection : a. For Each ... Next b. For ... Next c. Do ... Loop d. While ... Wend e. With ... End With Répéter un groupe d’instructions le nombre de fois indiqué : a. For Each ... Next b. For ... Next c. Do ... Loop d. While ... Wend e. With ... End With Exécuter une série d’instructions appliquées à un seul objet ou à un type défini par l’utilisateur : a. For Each ... Next b. For ... Next c. Do ... Loop d. While ... Wend e. With ... End With
Énoncé 4.1 Vérifier que la saisie est numérique Exercice 1 Durée estimative : 10 minutes Créez la procédure ContrôleSaisie qui propose une boîte de saisie et vérifiez qu’il s’agit d’un nombre. Si c’est le cas, effectuez l’opération qui consiste à multiplier le nombre par lui-même, sinon affichez un message. Exemple :
Indice Utilisez la fonction VBA.IsNumeric pour tester la saisie. Exercice 2 Durée estimative : 5 minutes Complétez la procédure précédente qui vérifie que l’utilisateur a cliqué sur le bouton OK. Dans le cas contraire, affichez un message. Exemple :
Énoncé 4.2 Dire au revoir Durée estimative : 5 minutes Complétez la procédure AuRevoir. Celle-ci propose une boîte de dialogue demandant si l’on souhaite ou non quitter Excel. Elle affiche le message "A bientôt" si l’utilisateur clique sur le bouton Oui, et le message "Poursuivons" sinon. Exemple :
Sub AuRevoir() Dim strMessage As String Dim intStyle As Integer Dim intChoix As Integer strMessage = "Souhaitez-vous quitter Excel ?" intStyle = vbYesNo + vbDefaultButton2 ... = MsgBox(strMessage, intStyle) If ... = vbYes Then MsgBox "A bientôt." ... MsgBox "Poursuivons."
... End Sub
Indice Voici un extrait de l’aide VBA en ligne. L’aide complète se trouve à l’adresse suivante : https://docs.microsoft.com/fr-fr/office/vba/language/reference/user-interfacehelp/msgbox-function
Énoncé 4.3 Contrôler la saisie d’une consonne ou voyelle Durée estimative : 10 minutes Créez la procédure ConsonneVoyelle qui demande de saisir une voyelle ou une consonne. Affichez un message selon la saisie : "Voyelle", "Consonne" ou un message approprié en cas d’erreur. Exemple :
Indice Pour tester la lettre en majuscule, on effectuera la transformation suivante : varChoix = VBA.UCase(varChoix)
Énoncé 4.4 Afficher un message selon l’âge et le genre Durée estimative : 15 minutes Créez la procédure VotreAge qui demande le sexe et l’âge de l’utilisateur. Les messages affichés seront différents selon l’âge et selon qu’il s’agisse d’un homme
ou d’une femme. Prenez également en considération l’abandon de la saisie et la saisie de lettres pour l’âge. Pour les hommes : 0 - 17 ans : "Gamin" 18 - 30 ans : "Vous êtes jeune" 31 - 50 ans : "Vous êtes encore jeune" > 50 ans : "Vous commencez à vieillir" Pour les femmes, un seul message : "On ne demande pas son âge à une femme". Exemple :
Indices Déclaration des variables : Dim Dim Dim Dim
strHomme As String * 1 strFemme As String * 1 intChoixSexe As Integer dblAge As Double
Pour afficher la première boîte de dialogue : intChoixSexe = MsgBox("Vous êtes un homme ?", vbYesNo, "Votre âge")
Pour afficher la deuxième boîte de dialogue : dblAge = InputBox("Quel âge avez-vous ?", , 0)
Énoncé 4.5 Dire bonjour N fois Durée estimative : 10 minutes 4.5.1 : Dire bonjour N fois avec la structure For ... Next Créez la procédure Bonjour10FoisAvecFor avec la structure For ... Next qui dit 10 fois bonjour.
4.5.2 : Dire bonjour N fois avec la structure Do ... Loop Créez la procédure Bonjour10FoisAvecDo qui réalise la même action que précédemment mais avec une structure différente. Note Avec les structures répétitives pour un énoncé donné, il existe souvent plusieurs solutions possibles. Les solutions dans la partie Corrigés ne sont donc pas uniques.
Énoncé 4.6 Compter de N en N jusqu’à M Durée estimative : 10 minutes 4.6.1 : Compter de 13 en 13 jusqu’à 100 Créez la procédure CompterDe13en13 qui compte de 13 en 13 jusqu’à 100 en utilisant la structure Do While.
4.6.2 : Paramétrer une procédure pour compter de N en N jusqu’à M À partir de la procédure précédente, créez la procédure CompterDeNenN de sorte qu’elle propose à l’utilisateur le nombre à ajouter (N) et le nombre limite (M). Exemple :
Énoncé 4.7 Rendre obligatoire une saisie et contrôler la sortie Durée estimative : 15 minutes Créez la procédure paramétrée SaisieObligatoire utilisant une structure répétitive de votre choix qui effectue des conversions de pouces en millimètres (1 pouce = 25,4 mm). L’opération se poursuit tant que l’utilisateur ne clique pas sur le bouton Non. En
outre, dès que l’utilisateur a cliqué sur le bouton Oui, il ne peut poursuivre le traitement que si un nombre est saisi. Dans le cas contraire, il "boucle" indéfiniment. Exemple :
Note Saisissez d’abord des lettres (exemple : ENI) pour tester le contrôle puis un nombre (exemple : 13).
Énoncé 4.8 Inverser l’ordre des caractères Durée estimative : 10 minutes Créez la procédure TexteALenvers qui renvoie les caractères saisis en ordre inverse.
Exemple :
Énoncé 4.9 Vérifier si un nombre est premier Durée estimative : 15 minutes Créez la fonction DétermineNombrePremier qui détermine si un nombre est premier. Testez ensuite cette fonction dans une procédure nommée NombrePremier. La procédure doit être répétitive jusqu’à ce que l’utilisateur décide de cliquer sur le bouton Annuler.
Énoncé 4.10 Compter le nombre d’occurrences d’un nombre Durée estimative : 10 minutes
Créez la procédure OccurrencesNombre qui compte le nombre de fois où un nombre entier choisi entre 1 et 100 par l’utilisateur correspond à un tirage aléatoire d’un nombre entier entre 1 et 100, tirage effectué 500 fois.
Note Utilisez des nombres aléatoires pour générer une suite de nombres. Voir dans l’aide : l’instruction Randomize et la fonction VBA.Rnd.
Prérequis 1. 2. 3. 4. 5. 6. 7. 8. 9.
a. et c. a. b., c. et d. b. et c. c. et d. b. a. b. e.
Corrigé 4.1 Vérifier que la saisie est numérique Exercice 1
Sub ContrôleSaisie() Dim varTestSaisie As Variant Dim dblNombre As Double varTestSaisie = InputBox(prompt:="Entrer un nombre", _ Title:="Multiplication du nombre par lui-même") If varTestSaisie "" Then If VBA.IsNumeric(varTestSaisie) Then dblNombre = varTestSaisie * varTestSaisie MsgBox "C'est un nombre : " _ & varTestSaisie & " x " & varTestSaisie _ & " = " & dblNombre Else MsgBox "Vérifier votre saisie" End If End If End Sub
Commentaire Au chapitre précédent, nous avons utilisé la méthode Inputbox qui permet également de contrôler la saisie. Exercice 2 Sub ContrôleSaisiebis() . . . MsgBox "Vérifier votre saisie" End If Else MsgBox "Annulation de l'opération" End If End Sub
Corrigé 4.2 Dire au revoir Sub AuRevoir() Dim strMessage As String Dim intStyle As Integer Dim intChoix As Integer strMessage = "Souhaitez-vous quitter Excel ?" intStyle = vbYesNo + vbDefaultButton2 intChoix = MsgBox(strMessage, intStyle) If intChoix = vbYes Then MsgBox "A bientôt." Else MsgBox "Poursuivons." End If End Sub
Corrigé 4.3 Contrôler la saisie d’une consonne ou voyelle
Sub ConsonneVoyelle() Dim strConsonne As String * 1 Dim strVoyelle As String * 1 Dim varTestSaisie As Variant Dim varChoix As Variant varTestSaisie = InputBox("Saisir une consonne ou voyelle") If Not VBA.IsNumeric(varTestSaisie) Then varChoix = VBA.UCase(varTestSaisie) Select Case varChoix Case "A", "E", "I", "O", "U", "Y" MsgBox "Voyelle" Case "B", "C", "D", "F", "G", "H", "J", "K", "L", "M", _ "N", "P", "Q", "R", "S", "T", "V", "W", "X", "Z" MsgBox "Consonne" Case Else If varChoix "" Then MsgBox "Saisissez une consonne ou une voyelle (et une seule !)" End If End Select Else MsgBox "Vous avez saisi un nombre !" End If End Sub
Corrigé 4.4 Afficher un message selon l’âge et le genre Sub VotreAge() Dim strHomme As String * 1 Dim strFemme As String * 1 Dim intChoixSexe As Integer Dim dblAge As Double Dim varTestSaisieAge As Variant intChoixSexe = MsgBox("Vous êtes un homme ?", _ vbYesNo, "Votre âge") If intChoixSexe = vbYes Then varTestSaisieAge = InputBox("Quel âge avez-vous ?", , 0) If varTestSaisieAge "" Then If VBA.IsNumeric(varTestSaisieAge) Then dblAge = varTestSaisieAge Select Case dblAge Case 0 To 17 MsgBox "Gamin !" Case 18 To 30 MsgBox "Vous êtes jeune." Case 31 To 50 MsgBox "Vous êtes encore jeune." Case Else MsgBox "Vous commencez à vieillir..." End Select Else MsgBox "Vous n'avez pas saisi un nombre" End If Else MsgBox "Vous n'avez pas répondu à la question..." End If Else MsgBox "On ne demande pas son âge à une femme..." End If End Sub
Corrigé 4.5 Dire bonjour N fois 4.5.1 : Dire bonjour N fois avec avec la structure For ... Next Sub Bonjour10FoisAvecFor() Dim intCompteur As Integer Dim strMot As String Dim strMessage As String intCompteur = 0 strMot = "Bonjour..." For intCompteur = 1 To 10 strMessage = strMessage & " " & strMot Next intCompteur intCompteur = intCompteur - 1 MsgBox strMessage & vbCrLf & vbCrLf _ & "Je vous ai dit " & _ intCompteur & " fois bonjour." End Sub
4.5.2 : Dire bonjour N fois avec avec la structure Do ... Loop Sub Bonjour10FoisAvecDo() Dim intNombre As Integer Dim strMot As String Dim strMessage As String intNombre = 0 strMot = "Bonjour..." Do While intNombre < 10 intNombre = intNombre + 1 strMessage = strMessage & " " & strMot Loop MsgBox strMessage & vbCrLf & vbCrLf _ & "Je vous ai dit " & intNombre & " fois bonjour." End Sub
Corrigé 4.6 Compter de N en N jusqu’à M 4.6.1 : Compter de 13 en 13 jusqu’à 100 Sub CompterDe13en13() Dim intNombreDépart As Integer Dim intAjout As Integer Dim intNewNombre As Integer Dim strMessage As String strMessage = "0" intNombreDépart = 0 intAjout = 13 Do While intNombreDépart ", _ VBA.Format(intTab2D(intLigne, intColonne), "@@@") Next intColonne Next intLigne End Sub
Commentaire Le premier argument représente les lignes, le second les colonnes. Par défaut on a : Option Base 0. La déclaration suivante est donc aussi correcte : Dim intTab2D(4, 4)
Cette déclaration implique une modification des indices. For intLigne = 0 To 4 For intColonne = 0 To 4
Cette déclaration est cependant moins élégante que celle utilisant le mot-clé To. Une autre possibilité serait de changer d’option de base (à déclarer impérativement dans la partie Déclarations du module). Auquel cas, une troisième écriture est possible : Option Base 1 Dim intTab2D(5, 5)
Le parcours au niveau des indices reste identique à la solution donnée. For intLigne = 1 To 5 For intColonne = 1 To 5
Corrigé 5.7 Déclarer et utiliser un tableau à plus de deux dimensions Exercice 1 Déclaration du tableau dans la partie Déclarations du module. Private intTab3D(1 To 10, 1 To 10, 1 To 50) As Integer
La déclaration suivante est équivalente avec l’option base par défaut. Private intTab3D(9, 9, 49) As Integer
Exercice 2 Sub EX7() intTab3D(10, 10, 50) = 777 Debug.Print "5000ème élément :"; intTab3D(10, 10, 50) End SubI
Corrigé 5.8 Déclarer et utiliser un tableau dynamique Déclaration du tableau dans la partie Déclarations du module. Private dblTabDynamique() As Double
Commentaire En déclarant un tableau dynamique vous pouvez redimensionner le tableau pendant l’exécution du code. Notez que les parenthèses sont vides. Code de la procédure : Sub EX8() Dim intTaille As Integer On Error GoTo Erreur intTaille = Application.InputBox(prompt:="Indiquer la taille du tableau" _
& "(entre 1 et 10 000)", Type:=1) intTaille = VBA.CInt(intTaille) ReDim dblTabDynamique(1 To intTaille) dblTabDynamique(intTaille) = intTaille Debug.Print "dernier élément avec taille du tableau :"; _ dblTabDynamique(intTaille) Erreur: End Sub
Commentaire La taille maximale d’un tableau varie en fonction de votre système d’exploitation et de la mémoire disponible. L’utilisation d’un tableau dépassant la quantité de RAM disponible ralentit le traitement. VBA peut aussi arrêter l’exécution de la procédure.
ReDim permet de modifier la taille d’un tableau dynamique aussi souvent que nécessaire. Attention, ReDim ne peut être utilisé que dans une procédure.
Corrigé 5.9 Agrandir un tableau dynamique en préservant les valeurs initiales Sub EX9() Dim intTaille1 As Integer Dim intTaille2 As Integer intTaille1 = Application.InputBox _ (prompt:="Première taille du tableau", _ Type:=1, Title:=" Nombre entier positif < 32 767") ReDim dblTabDynamique(1 To intTaille1) dblTabDynamique(intTaille1) = intTaille1 Debug.Print "Première taille:"; dblTabDynamique(intTaille1) intTaille2 = Application.InputBox _ (prompt:="Deuxième taille du tableau", _ Type:=1, Title:="Nombre entier positif < 32 767") ReDim Preserve dblTabDynamique(1 To intTaille2) dblTabDynamique(intTaille2) = intTaille2 Debug.Print "Deuxième taille:"; dblTabDynamique(intTaille2)
End Sub
Commentaire Le mot-clé Preserve permet de conserver la valeur des éléments du tableau déjà existants. Sans lui, ces éléments seraient réinitialisés. À savoir également :
Preserve ne permet de redimensionner un tableau qu’en modifiant la dernière dimension.
Preserve ne permet pas de modifier le nombre de dimensions.
Corrigé 5.10 Exploiter un tableau à l’aide d’une boucle Sub EX10() Dim dblNombre As Double Dim intCompteur As Integer Dim dblTableMultiplication(1 To 10) As Double dblNombre = Application. _ InputBox(prompt:="Entrez le nombre pour la table" _ & " de multiplication.", Type:=1) If dblNombre 0 Then dblNombre = VBA.CDbl(dblNombre) For intCompteur = 1 To 10 dblTableMultiplication(intCompteur) = intCompteur * dblNombre Debug.Print dblNombre, "x", VBA.Format(intCompteur, "@@"), "=", _ VBA.Format(dblTableMultiplication(intCompteur), "@@@@") Next intCompteur End If End Sub
Corrigé 5.11 Afficher un tableau dans un formulaire Private Sub UserForm_Initialize() ' Déclaration du tableau Dim strMois(1 To 12) As String ' Déclaration du compteur Dim intMois As Integer ' Mise en place de la boucle For intMois = 1 To 12 strMois(intMois) = VBA.Format(VBA.DateSerial(1, intMois, 1), "mmmm") ' Ajout du mois dans le ComboBox frmMois.cboMois.AddItem strMois(intMois) ' Ajout du mois dans la zone de liste
frmMois.lstMois.AddItem strMois(intMois) Next intMois cboMois.ListIndex = 0 lstMois.ListIndex = 0 End Sub
Introduction Durée : 1 heure 50 Mots-clés objet, constructeur, accesseur, propriété, méthode, événement, classe, collection Objectifs Ce chapitre est une première approche de la programmation objet. Il s’agit de se familiariser d’une part avec la syntaxe générale des instructions et d’autre part avec les principaux objets d’Excel : les classeurs, les feuilles de calcul et les plages de cellules. Les exercices portent sur les points suivants : accès à l’objet, interrogation et modification des propriétés, utilisation des méthodes et gestion des événements. La gestion des erreurs provoquées par l’absence d’un objet est ensuite abordée. Le chapitre se termine par la création et l’utilisation d’une classe et d’une collection d’objets.
Prérequis Pour valider les prérequis nécessaires, avant d’aborder le TP, répondez aux questions ci-après (certaines questions peuvent nécessiter plusieurs réponses) : 1 . 2 .
Méthode pour passer un classeur au premier plan lorsque plusieurs classeurs sont ouverts : a. Select b. Activate c. Open Méthode pour activer une feuille de calcul : a. b.
Select Activate
3 . 4 . 5 . 6 . 7 . 8 .
c. Move Sont des collections d’objets : a. Worksheets b. Worksheet c. Sheets Sont des propriétés de Worksheets : a. Count b. Visible c. Add De manière générale, la valeur d’une propriété d’un objet : a. est modifiable. b. ne peut être modifiée. Instruction pour modifier la propriété privée d’un objet : a. Public Property Get b. Public Property Let c. Public Property Set Le constructeur de la classe doit obligatoirement être défini : a. oui b. non Procédures ou fonctions par défaut d’une collection : a. b. c. d.
Add Count Item Delete
Note Vérifiez avant de commencer que les options Déclaration des variables obligatoire et Complément automatique des instructions sont bien cochées dans les options de VBE. Pour accéder à la fenêtre d’options dans l’environnement VBE : Outils - Options.
Énoncé 6.1 Accéder à un objet Durée estimative : 5 minutes Classeurs Introduction Programmation Objet.xlsm et Classeur N2.xlsx.
6.1.1 : Accéder à un classeur Ouvrez ces deux classeurs. Sélectionnez (activez) le classeur Introduction Programmation Objet.xlsm. Créez dans un module de ce classeur une procédure qui active le second classeur Classeur N2.xlsx. Note Pour les énoncés de 6.1.2 à 6.1.4, laissez ces deux classeurs ouverts lors de l’écriture et du test de vos procédures. 6.1.2 : Accéder à une feuille d’un classeur À partir du classeur Introduction Programmation Objet.xlsm, activez la feuille Feuil3 du classeur Classeur N2.xlsx.
6.1.3 : Accéder à une cellule À partir du classeur Introduction Programmation Objet.xlsm, activez la cellule B2 de la feuille Feuil1 du classeur Classeur N2.xlsx.
6.1.4 : Sélectionner une plage de cellules À partir du classeur Introduction Programmation Objet.xlsm, sélectionnez la plage de cellules de A1 à C3 de la feuille Feuil1 du classeur Classeur N2.xlsx et rendez active la cellule B3.
Énoncé 6.2 Lire les propriétés d’un objet Durée estimative : 5 minutes 6.2.1 : Connaître le nom d’une feuille de calcul
Sous Excel, renommez la première feuille du classeur Introduction Programmation Objet.xlsm avec le mot Accueil. Créez une procédure qui affiche le nouveau nom de cette feuille.
6.2.2 : Connaître le nom d’une feuille de calcul en utilisant une variable objet Recréez la procédure précédente en utilisant les déclarations de variables suivantes : Dim wksFeuille As Worksheet Dim strNom As String
6.2.3 : Connaître le nombre de feuilles de calcul Affichez le nombre de feuilles de calcul du premier classeur.
Énoncé 6.3 Modifier les propriétés d’un objet Durée estimative : 15 minutes 6.3.1 : Renommer une feuille de classeur Par programmation et sans instruction d’activation, renommez la deuxième feuille du premier classeur avec le nom Essai.
6.3.2 : Affecter une nouvelle valeur à une cellule Sous Excel, saisissez la valeur 789 dans la cellule B2 de la feuille Accueil du premier classeur. Par programmation et sans instruction d’activation, transformez la valeur de cette cellule en texte VBA Excel.
6.3.3 : Mettre en gras une cellule Par programmation et sans instruction d’activation, mettez en gras la cellule B2 de la feuille Accueil du premier classeur.
6.3.4 : Modifier plusieurs propriétés d’un objet avec l’instruction With Modifiez les propriétés de la cellule B2 de sorte que le contenu soit en gras italique et de couleur bleue, que la police soit Comic Sans MS et que le contexte apparaisse en bleu italique. Note Vous pouvez agir simplement sur la couleur de la police avec la propriété ColorIndex. Voici les dix premières constantes pouvant être affectées à cette propriété :
Énoncé 6.4 Utiliser les méthodes d’un objet Durée estimative : 10 minutes 6.4.1 : Ajouter une nouvelle feuille au premier classeur Par programmation et sans instruction d’activation, ajoutez au premier classeur une nouvelle feuille derrière la dernière feuille. Renommez-la Tempo.
6.4.2 : Supprimer une feuille Supprimez la feuille Tempo. Excel vous demandera automatiquement une confirmation de suppression que vous n’aurez pas à gérer.
Énoncé 6.5 Gérer les collections Durée estimative : 10 minutes 6.5.1 : Connaître les noms de toutes les feuilles de calcul du classeur Affichez dans une boîte tous les noms des feuilles du classeur en utilisant la collection Worksheets.
6.5.2 : Modifier une ligne sur deux d’une plage de cellules Écrivez la procédure qui sélectionne la plage de cellules de B2 à D20 de la feuille Accueil et qui formate une ligne sur deux de cette plage selon les caractéristiques suivantes :
Police : Arial, taille 10 en gras et couleur bleu
Couleur de fond : jaune
Indice Pour la gestion des lignes alternées, vous pouvez faire appel à l’opérateur Mod.
Collections utiles : Range, Rows, Columns
Énoncé 6.6 Gérer les événements Durée estimative : 10 minutes 6.6.1 : Afficher le contenu d’une cellule Créez la procédure qui affiche le contenu d’une cellule par un double clic sur une cellule non vide de la feuille Accueil. Note Sélectionnez au préalable, dans l’IDE, l’objet Accueil puis le type d’objet et l’événement adéquats.
6.6.2 : Afficher un message de bienvenue Créez la procédure qui affiche un message de bienvenue à l’ouverture du classeur. Note Sélectionnez au préalable, dans l’IDE, l’objet ThisWorkbook puis le type d’objet et l’événement adéquats.
Énoncé 6.7 Gérer les erreurs
Durée estimative : 15 minutes 6.7.1 : Gérer simplement les erreurs Refermez le classeur Classeur N2.xlsx. Relancez la procédure de l’énoncé 6.1.1. Un message d’erreur apparaît puisque le deuxième classeur a été refermé. Créez une procédure simple pour gérer ce type d’erreur.
6.7.2 : Gérer les erreurs avec un message Améliorez la procédure de l’énoncé précédent de sorte qu’un message s’affiche en fonction du résultat de l’opération.
Note Les numéros d’erreurs et leurs significations sont consultables dans l’aide en ligne. En voici un extrait :
6.7.3 : Gérer les erreurs avec poursuite du traitement Améliorez encore la procédure de l’énoncé 6.7.1 de sorte que le traitement se poursuive si aucune erreur ne s’est produite.
Énoncé 6.8 Créer une classe avec un événement de classe Durée estimative : 5 minutes Mise en place Insérez un module de classe et renommez-le FordMustang.
Complétez la classe en créant :
les propriétés Immatriculation de type String, Puissance de type Integer et Vitesse de type Integer. Les propriétés Immatriculation et Vitesse seront en lecture/écriture et la propriété Puissance en lecture seule.
les procédures de classe Let Property et Get Property pour gérer les propriétés spécifiées ci-dessus.
la procédure Class_Initialize() déclenchée à l’instanciation de l’objet et permettant l’affichage d’un message de bienvenue.
l’événement EclatementPneu.
Note Vous pouvez utiliser la boîte de dialogue d’ajout de procédures de l’IDE.
Énoncé 6.9 Utiliser la classe créée Durée estimative : 20 minutes Note Attention ! Pour pouvoir utiliser un événement personnalisé (EclatementPneu), les procédures de tests doivent se trouver dans un module prenant en charge les événements. Un module standard ne peut donc pas convenir. On pourra par exemple choisir un module de feuille. Déclarez un objet de portée module, maMustang, de classe FordMustang.
Créez la procédure TestClasseMustang permettant de tester la classe créée. Affichez des boîtes de dialogue pour suivre la démarche de création des objets. Cette procédure comprendra une boucle Do... Loop dans laquelle sera effectuée une saisie de la variation de vitesse. Exemple :
Après un clic sur Annuler :
Essayez d’utiliser la propriété Puissance en écriture et vérifiez que vous obtenez bien un code d’erreur.
Énoncé 6.10 Déclencher l’événement de classe Durée estimative : 5 minutes Complétez la procédure d’écriture de la propriété Vitesse (Property Let Vitesse) dans le module de classe FordMustang pour que l’événement EclatementPneu se déclenche lorsque la vitesse dépasse 200 km/h. Complétez le module de feuille en programmant la procédure événementielle correspondant à cet événement. L’affichage d’un simple message signalant l’événement sera suffisant.
Énoncé 6.11 Créer et utiliser une collection d’objets Durée estimative : 10 minutes Créez une procédure Collection_ClubMustang() qui constitue, par saisies d’immatriculations, une collection de véhicules de classe FordMustang. Cette procédure affichera ensuite le nombre de membres du club ainsi que les immatriculations saisies au moment de la création des instances. Cette procédure peut être implantée dans un module standard. Note Pour éviter d’avoir un message d’accueil à chaque nouvelle instanciation d’objet, on peut mettre en commentaire le contenu de la procédure Class_Initialize() du module de classe FordMustang. Indice Pour le parcours de la collection, utilisez la boucle For Each ... Next.
Prérequis 1 . 2 . 3 . 4 . 5 . 6 .
b. a. Le fait de sélectionner une feuille la rend active a. et c. a. et b. a. b. et c.
Utiliser Property Set pour attribuer par référence un objet à une propriété. 7 b. . Si aucun constructeur n’est explicitement défini, le constructeur par défaut est appelé lors de l’instanciation de la classe. 8 a., b. et c. .
Corrigé 6.1 Accéder à un objet 6.1.1 : Accéder à un classeur Sub ActiveClasseurN2() Workbooks("Classeur N2.xlsx").Activate End Sub
ou : Sub ActiveClasseurN2Bis() Workbooks(2).Activate End Sub
Commentaire Le numéro d’index indique l’ordre dans lequel les classeurs ont été ouverts ou créés. Après une suppression, un numéro d’index peut alors référencer un autre classeur.
6.1.2 : Accéder à une feuille d’un classeur Sub SélectionFeuille() Workbooks("Classeur N2.xlsx").Activate Worksheets("Feuil3").Select End Sub
6.1.3 : Accéder à une cellule Sub SélectionCellule() Workbooks("Classeur N2.xlsx").Activate Worksheets("Feuil1").Select Range("B2").Select End Sub
Commentaire À la place de Range("B2"), vous pouvez écrire Cells(2, 2). 6.1.4 : Sélectionner une plage de cellules Sub SélectionPlage() Workbooks("Classeur N2.xlsx").Activate Worksheets("Feuil1").Select Range("A1:C3").Select Range("B3").Activate End Sub
Corrigé 6.2 Lire les propriétés d’un objet 6.2.1 : Connaître le nom d’une feuille de calcul Sub NomFeuille( MsgBox "Nom de la première feuille : " _ & Workbooks("Introduction Programmation Objet.xlsm"). _ Worksheets(1).Name End Sub
6.2.2 : Connaître le nom d’une feuille de calcul en utilisant une variable objet Sub NomFeuilleDéclaration() Dim wksFeuille As Worksheet Dim strNom As String Set wksFeuille = Workbooks("Introduction Programmation Objet.xlsm") _ .Worksheets(1) strNom = wksFeuille.Name MsgBox "Nom de la première feuille : " & strNom End Sub
6.2.3 : Connaître le nombre de feuilles de calcul Sub NombreFeuilles().Activate MsgBox "Nombre de feuilles de calcul : " _
& Workbooks("Introduction Programmation Objet.xlsm"). _ Worksheets.Count End Sub
Corrigé 6.3 Modifier les propriétés d’un objet 6.3.1 : Renommer une feuille de classeur Sub RenommeFeuilleCalcul() Dim wksFeuille As Worksheet Set wksFeuille = Workbooks("Introduction Programmation Objet.xlsm") _ .Worksheets(2) wksFeuille.Name = "Essai" End Sub
6.3.2 : Affecter une nouvelle valeur à une cellule Sub ChangeValeur() Dim wksFeuille As Worksheet Dim rngPlage As Range Set wksFeuille = Workbooks("Introduction Programmation Objet.xlsm") _ .Worksheets("Accueil") Set rngPlage = wksFeuille.Range("B2") rngPlage.Value = "VBA Excel" End Sub
6.3.3 : Mettre en gras une cellule Sub EnGras() Dim wksFeuille As Worksheet Dim rngPlage As Range Set wksFeuille = Workbooks("Introduction Programmation Objet.xlsm") _ .Worksheets("Accueil") Set rngPlage = wksFeuille.Range("B2") rngPlage.Font.Bold = True End Sub
6.3.4 : Modifier plusieurs propriétés d’un objet avec l’instruction With Sub ModifProprietes() Dim wksFeuille As Worksheet Dim rngPlage As Range Set wksFeuille = Workbooks("Introduction Programmation Objet.xlsm") _ .Worksheets("Accueil") Set rngPlage = wksFeuille.Range("B2") With rngPlage.Font .Italic = True .ColorIndex = 5 .Name = "Comic Sans MS" End With End Sub
Corrigé 6.4 Utiliser les méthodes d’un objet 6.4.1 : Ajouter une nouvelle feuille au premier classeur Sub AjoutFeuille() Dim wkbClasseur As Workbook Dim wksFeuille As Worksheet Set wkbClasseur = Workbooks("Introduction Programmation Objet.xlsm") wkbClasseur.Sheets.Add After:=Worksheets(Worksheets.Count) Set wksFeuille = wkbClasseur.Worksheets(Worksheets.Count) wksFeuille.Name = "Tempo" End Sub
6.4.2 : Supprimer une feuille Sub SupprimeFeuille() Sheets("Tempo").Delete End Sub
Corrigé 6.5 Gérer les collections 6.5.1 : Connaître les noms de toutes les feuilles de calcul du classeur Sub NomsDesFeuilles() Dim wkbClasseur As Workbook Dim wksFeuille As Worksheet Dim strNoms As String Set wkbClasseur = Workbooks("Introduction Programmation Objet.xlsm") For Each wksFeuille In wkbClasseur.Worksheets strNoms = strNoms & wksFeuille.Name & vbCrLf Next MsgBox strNoms End Sub
6.5.2 : Modifier une ligne sur deux d’une plage de cellules Sub ModifLigne_1sur2() Dim rngPlage As Range Dim intLigne As Integer, intColonne As Integer WorkSheets("Accueil").Select Set rngPlage = Range("B2:D20") For intLigne = 1 To rngPlage.Rows.Count If (intLigne Mod 2 = 0) Then For intColonne = 1 To rngPlage.Columns.Count With rngPlage.Cells(intLigne, intColonne) .Interior.ColorIndex = 6 With .Font .Name = "Arial" .Size = 10 .ColorIndex = 5 .Bold = True End With End With Next intColonne End If Next intLign
End Sub
Corrigé 6.6 Gérer les événements 6.6.1 : Afficher le contenu d’une cellule Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, _ Cancel As Boolean) If ActiveCell.Value "" Then MsgBox ActiveCell.Value End If End Sub
6.6.2 : Afficher un message de bienvenue Private Sub Workbook_Open() MsgBox "Bonjour" End Sub
Corrigé 6.7 Gérer les erreurs 6.7.1 : Gérer simplement les erreurs Sub GèreErreurSimple() On Error GoTo Sortie_Sur_Erreur Workbooks("Classeur N2.xlsx").Activate Sortie_Sur_Erreur: End Sub
6.7.2 : Gérer les erreurs avec un message Sub GèreErreurNumMessage() On Error GoTo Sortie_Sur_Erreur Workbooks("Classeur N2.xlsx").Activate Sortie_Sur_Erreur: If Err.Number = 9 Then MsgBox "Le classeur N2.xlsx n'est pas ouvert" Else MsgBox "Activation du deuxième classeur" End If End Sub
Commentaire Il est possible de reprendre l’exécution de la procédure à partir de la ligne qui a généré l’erreur avec l’instruction Resume.
Il est possible également d’éviter le blocage de la procédure en cas d’erreur, en ignorant totalement cette dernière. Ceci est réalisé simplement avec l’instruction On Error Resume Next. Cette instruction est à utiliser avec parcimonie et prudence car elle peut induire d’autres erreurs et, en définitive, bloquer tout un programme. Si vous l’utilisez néanmoins, pensez à restaurer ensuite le traitement d’erreur avec On Error Goto 0. 6.7.3 : Gérer les erreurs avec poursuite du traitement Sub GèreErreurNumMessage2() On Error GoTo Sortie_Sur_Erreur Workbooks("Classeur N2.xlsx").Activate ' poursuite du traitement MsgBox "Je poursuis d'autres actions car aucune erreur ne s'est produite." Exit Sub 'Arrêt de la procédure --> si OK, le message d'erreur n'est pas affiché Sortie_Sur_Erreur: MsgBox "Ce classeur n'est pas ouvert" End Sub
Corrigé 6.8 Créer une classe avec un événement de classe Option Explicit 'Déclaration de l'événement EclatementPneu Public Event EclatementPneu() ' Déclarations des variables de travail Private mImmatriculation As String Private mPuissance As Integer Private mVitesse As Integer Property Get Immatriculation() As String ' Propriété en lecture Immatriculation = mImmatriculation End Property Property Let Immatriculation(Immat As String) ' Propriété en écriture mImmatriculation = Immat End Property Property Get Puissance() As Integer ' Propriété en lecture seule Puissance = 280 End Property Property Get Vitesse() As Integer ' Propriété en lecture Vitesse = mVitesse End Property Property Let Vitesse(speed As Integer) ' Propriété en écriture mVitesse = speed End Property Private Sub Class_Initialize() MsgBox "Une Ford Mustang vient de sortir de l'usine !" & vbCrLf & _ "Elle ne roule pas encore !" mVitesse = 0
Corrigé 6.9 Utiliser la classe créée Attention ! Ce code est implanté dans un module de feuille. Option Explicit Private WithEvents maMustang As FordMustang Sub TestClasseMustang() Dim variationVitesse As String ' Instanciation d'un objet de la classe FordMustang Set maMustang = New FordMustang With maMustang '.Puissance = 200 ' erreur car propriété en lecture seule .Immatriculation = InputBox("Quelle est l'immatriculation de cette merveille ?") MsgBox Prompt:="La Ford Mustang immatriculée " & .Immatriculation & " est prête à démarrer" ' Boucle sur les changements de vitesse Do While True variationVitesse = InputBox(Prompt:="Accélérez ou ralentissez par paliers (en km/h)" & vbCrLf & _ "nombre positif pour accélérer, négatif pour ralentir" & vbCrLf & _ "Cliquez sur Annuler pour terminer le voyage" & vbCrLf & _ VBA.IIf(.Vitesse = 0, "Vous êtes à l'arrêt", "Vous roulez actuellement à " & _ .Vitesse & " km/h"), _ Title:="Conduite de la Mustang " & .Immatriculation, _ Default:=20) If variationVitesse = "" Then Exit Do Else .Vitesse = .Vitesse + VBA.CInt(variationVitesse) If .Vitesse < 0 Then maMustang.Vitesse = 0 MsgBox Prompt:="La Ford Mustang " & .Immatriculation & VBA.IIf(.Vitesse = 0, " est à l'arrêt", _ " roule à " & .Vitesse & " km/h."), Title:="Conduite de la Mustang " & .Immatriculation End If Loop .Vitesse = 0 MsgBox Prompt:="Le voyage est terminé. La Mustang " & .Immatriculation & " est maintenant à l'arrêt", _ Title:="Conduite de la Mustang " & .Immatriculation End With End Sub
Corrigé 6.10 Déclencher l’événement de classe
Private Sub maMustang_EclatementPneu() ' Gestion de l'événement MsgBox "Vous rouliez à " & maMustang.Vitesse & vbCrLf & _ "Un pneu a éclaté !" maMustang.Vitesse = 0 End Sub Property Let Vitesse(speed As Integer) ' Propriété en écriture mVitesse = speed If mVitesse > 200 Then RaiseEvent EclatementPneu End Property
Corrigé 6.11 Créer et utiliser une collection d’objets Sub Collection_ClubMustang() Dim ClubMustang As New Collection Dim uneMustang As FordMustang ' Création d'un membre de la collection Set uneMustang = New FordMustang uneMustang.Immatriculation = "FV-341-KL" ClubMustang.Add uneMustang ' Création d'un membre de la collection Set uneMustang = New FordMustang uneMustang.Immatriculation = "BJ-384-EF" ClubMustang.Add uneMustang ' Création d'un membre de la collection Set uneMustang = New FordMustang uneMustang.Immatriculation = "NB-715-UF" ClubMustang.Add uneMustang ' Création d'un membre de la collection Set uneMustang = New FordMustang uneMustang.Immatriculation = "PM-123-JM" ' Création d'un membre de la collection Set uneMustang = New FordMustang uneMustang.Immatriculation = "GJ-234-HN" ClubMustang.Add uneMustang MsgBox "Nombre de membres du Club Mustang : " & ClubMustang.Count ' Affichage des immatriculations For Each uneMustang In ClubMustang MsgBox uneMustang.Immatriculation Next End Sub
Introduction Durée : 2 heure 05
Mots-clés activer, sélectionner, réorganiser, méthode, propriété, procédure événementielle, déclenchement, liaison dynamique, report, mise à jour Objectifs Manipuler le classeur actif par programmation. Différencier le classeur actif de la fenêtre active. Utiliser les méthodes et les propriétés des classeurs pour réaliser les principales opérations sur ceux-ci : ouvrir, fermer, imprimer... Connaître et gérer les principaux événements auxquels réagissent les classeurs. Gérer plusieurs classeurs pour consolider des données. Établir des liens dynamiques.
Prérequis Pour valider les prérequis nécessaires, avant d’aborder le TP, répondez aux questions ci-après (certaines questions peuvent nécessiter plusieurs réponses) : 1 . 2 . 3 . 4 . 5
Il peut y avoir : a. plusieurs classeurs actifs en même temps. b. un et un seul classeur actif. c. au maximum 20 classeurs actifs en même temps. Le classeur actif peut être contenu dans plusieurs fenêtres dont une seule est active : a. oui b. non c. oui mais toutes les fenêtres sont actives Un classeur peut être désigné par : a. son index b. son nom c. une combinaison index - nom La méthode Open pour ouvrir un classeur appartient : a. à l’objet Workbook. b. à la collection Workbooks. c. à l’objet Application. Les procédures d’événements des classeurs sont placées dans :
. 6 . 7 . 8 . 9 .
a. les modules. b. la partie code des feuilles. c. la partie déclaration des feuilles. L’événement VBA pour exécuter du code automatiquement à l’ouverture du classeur est : a. Workbooks_Open b. Workbook_Open c. Workbooks_Open_Auto Il est possible de forcer l’enregistrement d’un classeur avant sa fermeture en gérant l’événement : a. Workbook_BeforeClose b. Workbooks_BeforeClose La liaison des données peut être réalisée : a. par Excel. b. par programmation. c. uniquement par programmation. Les mises à jour sont possibles si les classeurs : a. sont ouverts. b. sont fermés.
Énoncé 7.1 Connaître le classeur actif Durée estimative : 5 minutes Dans Excel, créez deux nouveaux classeurs. Enregistrez l’un d’entre eux sous le nom de Classeurs. Créez la procédure NomClasseurActif qui affiche le nom du classeur actif. Exemple :
Énoncé 7.2 Afficher le classeur actif Exercice 1 Durée estimative : 5 minutes Créez la procédure NouvelleFenêtre qui affiche le classeur actif dans une deuxième fenêtre sans aucune réorganisation particulière.
Exercice 2 Durée estimative : 5 minutes À partir de la procédure précédente, créez la procédure NouvelleFenêtreMosaique qui propose un affichage avec une réorganisation mosaïque, mais uniquement pour le classeur actif.
Énoncé 7.3 Changer de classeur actif Durée estimative : 5 minutes Dans Excel, créez un nouveau classeur. Créez la procédure ClasseurOrdreOuverture qui active le troisième classeur dans l’ordre d’ouverture.
Énoncé 7.4 Enregistrer le classeur actif Durée estimative : 5 minutes Créez la procédure qui enregistre le classeur actif. Indice Utilisez la méthode Save de l’objet WorkBook.
Énoncé 7.5 Ajouter un nouveau classeur Durée estimative : 5 minutes Créez la procédure NouveauClasseur qui crée un nouveau classeur. Indice Utilisez la méthode Add. Vérifiez dans l’aide en ligne de VBA s’il s’agit d’une méthode de l’objet Workbook ou de la collection Workbooks.
Énoncé 7.6 Enregistrer un classeur en précisant le dossier de destination Durée estimative : 15 minutes Créez l’arborescence ci-dessous sur votre disque dur. Créez la procédure EnregistreCheminSimple qui enregistre un classeur déjà ouvert. Ce classeur est enregistré sous le nom TestSimple dans le dossier "0.TEMPO".
Indice Pour consulter la liste des classeurs ouverts, choisissez l’onglet Affichage, groupe Fenêtre, bouton Changer de fenêtre. Précisez le chemin d’accès : C:\0.TEMPO\TestSimple.xlsx
Énoncé 7.7 Obtenir le chemin complet où se trouve le classeur Durée estimative : 5 minutes Dans un module du classeur principal Classeurs, créez la procédure qui donne le chemin complet de ce classeur. Exemple :
Indice Utilisez la propriété suivante : ThisWorkbook.Path
Énoncé 7.8 Fermer tous les classeurs en proposant de les enregistrer Durée estimative : 5 minutes
Créez une procédure FermerEnregistrerTout qui ferme en une seule fois tous les classeurs et qui propose d’effectuer les enregistrements nécessaires.
Énoncé 7.9 Accueillir l’utilisateur par un message de bienvenue à l’ouverture du classeur Durée estimative : 5 minutes Créez une procédure événementielle qui, à l’ouverture du classeur, affiche un message de bienvenue.
Indice Pour afficher l’heure, utilisez la fonction VBA Time.
Énoncé 7.10 Choisir la feuille de calcul à l’ouverture du classeur
Durée estimative : 5 minutes Modifiez la procédure précédente de sorte qu’après le message de bienvenue, la feuille de calcul Feuil3 du classeur soit sélectionnée.
Indice Pour sélectionner la troisième feuille : WorkSheets("Feuil3").Select
ou : WorkSheets(3).Select
Énoncé 7.11 Mettre à jour tous les calculs avant la fermeture du classeur Durée estimative : 5 minutes Excel permet de lancer la mise à jour des calculs à la demande. Pour cet exercice, choisissez l’option manuelle en sélectionnant l’onglet Fichier - Options - Formules puis :
Créez une procédure événementielle qui force la mise à jour des calculs avant la fermeture du classeur. Exemple :
Indice Pour forcer le recalcul avant l’enregistrement : Application.CalculateBeforeSave = True
Énoncé 7.12 Mettre à jour tous les calculs avant l’impression Durée estimative : 5 minutes Dans le même ordre d’idée que l’énoncé précédent, créez la procédure événementielle qui force au calcul avant impression. Exemple :
Indice Pour forcer le recalcul avant l’impression : Application.Calculate
Énoncé 7.13 Consolider des données à partir de plusieurs classeurs Durée estimative : 15 minutes Fermez tous les classeurs. Créez trois nouveaux classeurs nommés Classeur N1.xlsx, Classeur N2.xlsx et Classeur principal.xlsm. Bâtissez les tableaux suivants sans données numériques pour Classeur principal.xlsm. Créez dans un module du classeur Classeur principal la procédure ReportDonnées qui reporte les totaux du deuxième et troisième classeur dans le premier. Classeur principal
Classeur N1
Classeur N2
Contraintes Les trois classeurs sont créés dans le même dossier. Les classeurs sont ouverts. Indice Pour référencer une feuille : Worksheets("NomDeLaFeuille") Pour référencer une plage de cellules : Range("Adresse").Value Exemple : Range ("C8")
Énoncé 7.14 Mettre à jour des données consolidées à l’ouverture du classeur Durée estimative : 10 minutes Créez la procédure événementielle qui effectue la mise à jour des calculs dès l’ouverture du classeur de consolidation.
Indice Cette procédure peut appeler la procédure ReportDonnées créée précédemment. Pour obtenir le chemin du classeur actif : strChemin = ThisWorkbook.Path
Énoncé 7.15 Mettre à jour des données à partir de plusieurs classeurs de manière permanente Durée estimative : 5 minutes Créez la procédure LienPermanent qui établit une mise à jour permanente des calculs. Indice Utilisez la propriété Formula de l’objet Range.
Énoncé 7.16 Créer une page de garde permettant d’accéder à plusieurs classeurs Durée estimative : 10 minutes Dans Excel, ajoutez un nouveau classeur nommé Menu et bâtissez le menu ci-après dans la première feuille. Pour le premier élément, ajoutez directement avec Excel un lien hypertexte. Pour les deux autres éléments, créez une procédure événementielle sans lien hypertexte mais qui exécute la même action que celui-ci.
Indice Pour obtenir l’adresse de la cellule sélectionnée : strAdresse = ActiveCell.Address
Énoncé 7.17 Rechercher les références externes à d’autres classeurs Durée estimative : 10 minutes Dans le classeur Classeurs, créez la procédure RéférencesExternes qui donne la liste des classeurs Excel liés au classeur principal. Auparavant, créez ces références, par exemple en incluant dans une formule des informations présentes dans les classeurs N1 et N2. Indice Utilisez la collection LinkSources de l’objet ThisWorkBook.
Prérequis 1. 2. 3. 4. 5. 6. 7. 8. 9.
b. a. a. et b. b. b. b. a. a. et b. a.
Corrigé 7.1 Connaître le classeur actif
Sub NomClasseurActif() MsgBox "Le classeur actif est : " & _ ActiveWorkbook.Name End Sub
Corrigé 7.2 Afficher le classeur actif Exercice 1 Sub NouvelleFenêtre() ActiveWorkbook.NewWindow End Sub
Exercice 2 Sub NouvelleFenêtreMosaique() ActiveWorkbook.NewWindow Windows.Arrange ActiveWorkbook:=True End Sub
Important Pour retrouver l’option par défaut de réaffichage en mosaïque pour tous les classeurs ouverts, modifiez la valeur du paramètre ActiveWorkbook et relancez la procédure. Windows.Arrange.ActiveWorkbook:=False
Corrigé 7.3 Changer de classeur actif Sub ClasseurOrdreOuverture() On Error GoTo Sortie_Sur_Erreur Workbooks(3).Activate Sortie_Sur_Erreur : End Sub
Corrigé 7.4 Enregistrer le classeur actif Sub EnregistreClasseurActif() ActiveWorkbook.Save End Sub
Corrigé 7.5 Ajouter un nouveau classeur Sub NouveauClasseur() Workbooks.Add End Sub
Corrigé 7.6 Enregistrer un classeur en précisant le dossier de destination Sub EnregistreCheminSimple() Dim strNomClasseur As String On Error GoTo Sortie_Sur_Erreur strNomClasseur = _ InputBox("Entrez le nom du classeur à enregistrer") Workbooks(strNomClasseur).SaveAs "C:\0.TEMPO\TestSimple.xlsx" Exit Sub Sortie_Sur_Erreur: MsgBox "Problème d'enregistrement" End Sub
Corrigé 7.7 Obtenir le chemin complet où se trouve le classeur Sub CheminComplet() Dim strChemin As String strChemin = ThisWorkbook.Path MsgBox "Chemin du classeur " & ActiveWorkbook.Name & " : " _ & strChemin End Sub
Corrigé 7.8 Fermer tous les classeurs en proposant de les enregistrer Sub FermerEnregistrerTout() Workbooks.Close End Sub
Corrigé 7.9 Accueillir l’utilisateur par un message de bienvenue à l’ouverture du classeur Sub Workbook_Open() MsgBox ("Bonjour. Il est " & Time) End Sub
Commentaire Placez cette procédure dans la zone de code de ThisWorkbook.
Corrigé 7.10 Choisir la feuille de calcul à l’ouverture du classeur Sub Workbook_Open() MsgBox ("Bonjour. Il est " & Time) WorkSheets("Feuil3").Select End Sub
Commentaire Une technique, désormais obsolète mais néanmoins toujours utilisable, permet de gérer l’événement d’ouverture par une simple procédure qu’il faut alors nommer Auto_Open. Sub Auto_Open() MsgBox ("Bonjour. Il est " & Time) WorkSheets("Feuil3").Select End Sub
Corrigé 7.11 Mettre à jour tous les calculs avant la fermeture du classeur Private Sub Workbook_BeforeClose(Cancel As Boolean) MsgBox "Recalcul si sauvegarde avant de fermer le document" Application.CalculateBeforeSave = True End Sub
Corrigé 7.12 Mettre à jour tous les calculs avant l’impression Private Sub Workbook_BeforePrint(Cancel As Boolean) MsgBox "Recalcul avant impression du document" Application.Calculate End Sub
Commentaire La procédure peut être testée aussi bien avec l’impression directe qu’en mode aperçu.
Corrigé 7.13 Consolider des données à partir de plusieurs classeurs Sub ReportDonnées() Dim wksFeuillePrincipal As Worksheet Dim wksFeuilleN1 As Worksheet Dim wksFeuilleN2 As Worksheet Dim strChemin As String strChemin = ThisWorkbook.Path Set wksFeuillePrincipal = _ Workbooks("Classeur principal.xlsm").Worksheets("Feuil1") Set wksFeuilleN1 = _ Workbooks("Classeur N1.xlsx").Worksheets("Feuil1") Set wksFeuilleN2 = _ Workbooks("Classeur N2.xlsx").Worksheets("Feuil1") wksFeuillePrincipal.Range("C5").Value = _ wksFeuilleN1.Range("C8").Value wksFeuillePrincipal.Range("C6").Value = _ wksFeuilleN2.Range("C8").Value End Sub
Commentaire Écrivez cette procédure dans un module du classeur Classeur Principal.
Corrigé 7.14 Mettre à jour des données consolidées à l’ouverture du classeur Sub Workbook_Open() Dim strChemin As String strChemin = ThisWorkbook.Path Workbooks.Open Filename:=strChemin & "\Classeur N1.xlsx" Workbooks.Open Filename:=strChemin & "\Classeur N2.xlsx" ThisWorkBook.Activate WorkSheets("Feuil1").Activate Range("B2").Select MsgBox "Mise à jour à l'ouverture du dossier de consolidation" Call ReportDonnées End Sub
Commentaire À mettre dans la partie code de l’objet ThisWorkbook du projet VBA appartenant au classeur Classeur principal.
Corrigé 7.15 Mettre à jour des données à partir de plusieurs classeurs de manière permanente Sub LienPermanent() Workbooks("Classeur Principal.xlsm").Activate Range("G5").Formula = "='[Classeur N1.xlsx]Feuil1'!$C$8" Range("G6").Formula = "='[Classeur N2.xlsx]Feuil1'!$C$8" End Sub
Note Le tableau Total des ventes a été dupliqué en F4 (plage occupée : F4:G7).
Corrigé 7.16 Créer une page de garde permettant d’accéder à plusieurs classeurs Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, _ ByVal Target As Range) Dim strAdresse As String
strAdresse = Selection.Address Select Case strAdresse Case "$B$4" Range("B2").Select Workbooks("Classeur N1.xlsx").WorkSheets("Feuil1").Activate Case "$B$5" Range("B2").Select Workbooks("Classeur N2.xlsx").WorkSheets("Feuil1").Activate End Select End Sub
Commentaire À mettre dans la partie code de l’objet ThisWorkbook du classeur Menu.
Corrigé 7.17 Rechercher les références externes à d’autres classeurs Sub RéférencesExternes() Dim TableauRéférences() As Variant Dim intRéf As Integer TableauRéférences = ThisWorkbook.LinkSources(1) If Not VBA.IsEmpty(TableauRéférences) Then For intRéf = 1 To Ubound(TableauRéférences) MsgBox "Lien " & intRéf & " : " & TableauRéférences(intRéf) Next intRéf Else MsgBox ThisWorkbook.Name & " ne possède pas de références externes à d'autres classeurs" End If End Sub
Commentaire Avec les réponses obtenues, il est facile de retrouver toutes les cellules où les références externes sont utilisées.
Introduction Durée : 1 heure 40 Mots-clés activer, sélectionner, propriété, méthode, procédure événementielle, déclenchement Objectifs
Savoir manipuler la feuille active par programmation. Différencier feuille active et classeur actif. Connaître et gérer les principaux événements auxquels réagissent les feuilles de calcul. Se familiariser avec les principales propriétés et les méthodes des feuilles de calcul.
Prérequis Pour valider les prérequis nécessaires, avant d’aborder le TP, répondez aux questions ci-après (certaines questions peuvent avoir plusieurs réponses) : 1. 2. 3. 4. 5. 6. 7.
Il peut y avoir : a. plusieurs feuilles actives en même temps. b. une et une seule feuille active. c. au maximum 20 feuilles actives en même temps. Pour connaître le nom de la feuille active : a. Sheet.Name b. ActiveSheet.Name c. ActiveSheet.Caption La feuille active peut être contenue dans plusieurs fenêtres dont une seule est active : a. oui. b. non. c. oui mais toutes les fenêtres sont actives. Méthode pour activer une feuille de calcul : a. Activate b. Open c. First Les procédures d’événements des feuilles de calcul sont placées dans : a. les modules b. la partie code des feuilles de calcul. c. dans la partie code de l’objet ThisWorkbook. L’événement feuille de calcul qui réagit dès qu’une cellule quelconque est modifiée est : a. Worksheet_SelectionChange b. Worksheet_Change c. Worksheet_Deactivate Il est possible avec une procédure d’événements de feuille de calcul d’écrire du code pour connaître :
8.
a. l’adresse de la cellule qui a été modifiée. b. l’adresse de la cellule active. c. l’adresse de la future cellule active. L’événement feuille de calcul Worksheet_Deactivate se produit lorsque l’on désactive : a. un classeur. b. une feuille de calcul. c. une feuille graphique. 9. Pour créer une nouvelle feuille de calcul, le type d’objet le plus approprié est : a. Worksheets b. Sheets c. Worksheet 10 Pour supprimer une feuille de calcul, on utilise : . a. Delete b. Erase c. Del 11 Une feuille est dupliquée avec la méthode : . a. Move b. Copy c. Add 12 Pour connaître le nombre de feuilles de calcul d’un classeur, il faut : . a. utiliser une boucle avec la propriété Count. b. écrire la propriété Count après l’objet Worksheets. c. écrire la propriété Count après l’objet Worksheet.
Énoncé 8.1 Connaître le nom de la feuille active Durée estimative : 5 minutes Dans Excel, créez un classeur nommé Feuilles de calcul. Créez ensuite la procédure NomFeuilleActive qui donne le nom de la feuille de calcul active. Exemple :
Énoncé 8.2 Renommer la feuille active Durée estimative : 5 minutes Dans Excel, renommez les deux premières feuilles respectivement Note et Moyenne. Créez ensuite la procédure Renommer qui renomme la troisième feuille de calcul selon un nom saisi par l’utilisateur. Exemple :
Énoncé 8.3 Prévenir lors du changement de feuille active en rappelant le nom de l’ancienne feuille active Durée estimative : 5 minutes Créez deux procédures événementielles qui affichent respectivement le nom de l’ancienne feuille active et celui de la nouvelle feuille active. Exemple :
Indice Placez les procédures dans la zone de code de l’objet ThisWorkbook. Utilisez les événements SheetDeactivate et SheetActivate.
Énoncé 8.4 Effectuer un aperçu de la feuille active Durée estimative : 5 minutes Créez une procédure Aperçu qui présente un aperçu avant impression de la feuille active.
Indice
Ne pas oublier de saisir une donnée quelconque dans la feuille avant de tester la procédure.
Énoncé 8.5 Déclencher une action dès qu’une feuille est activée Durée estimative : 5 minutes Fermez le classeur Feuilles de calcul. Ajoutez un nouveau classeur sous Excel et enregistrez-le sous Suite Feuilles de calcul.xlsm. Créez une procédure événementielle qui affiche le nom de la première feuille dès que l’on clique sur son onglet.
Indice Écrire la procédure dans la zone de code de la première feuille.
Énoncé 8.6 Déclencher une action dès qu’une cellule de la feuille active est activée Durée estimative : 5 minutes Créez une procédure événementielle concernant la première feuille qui réagit dès que l’on clique sur une cellule. Exemple :
Indice Pour la présentation de la cellule : With ActiveCell.Font .Bold = True .Size = 14 .ColorIndex = 5 End With With Selection .Interior.ColorIndex = 36 .HorizontalAlignment = xlCenter .VerticalAlignment = xlBottom End With
Énoncé 8.7 Déclencher une action dès qu’une cellule de la feuille active est modifiée Durée estimative : 10 minutes Créez une procédure événementielle concernant la deuxième feuille qui réagit seulement si l’on modifie l’une de ses cellules. Cette procédure indique également l’adresse de la cellule qui a été modifiée et l’adresse de la cellule active. Exemple :
Énoncé 8.8 Déclencher une action dès que l’on double clique sur une cellule de la feuille active Durée estimative : 5 minutes Créez une procédure événementielle concernant la troisième feuille qui réagit seulement si l’on double clique sur l’une de ses cellules. Résultat :
Énoncé 8.9 Ajouter une nouvelle feuille de calcul Durée estimative : 5 minutes Fermez le classeur Suite Feuilles de calcul. Ajoutez un nouveau classeur sous Excel et enregistrez-le sous le nom Fin Feuilles de calcul. Créez la procédure Ajout qui ajoute à ce classeur une nouvelle feuille de calcul nommée Nouvelle ; celle-ci est placée en dernière position.
Énoncé 8.10 Supprimer une feuille de calcul Durée estimative : 5 minutes Créez une procédure qui supprime la nouvelle feuille de calcul.
Énoncé 8.11 Copier une feuille de calcul Durée estimative : 5 minutes Créez une procédure qui copie la première feuille après la dernière feuille.
Énoncé 8.12 Connaître le nombre de feuilles du classeur Durée estimative : 5 minutes Créez la procédure NombreFeuilles qui donne le nombre de feuilles de calcul d’un classeur.
Énoncé 8.13 Connaître les noms de toutes les feuilles de calcul Durée estimative : 5 minutes Créez la procédure NomsFeuilles qui affiche le nom de chaque feuille du classeur. Exemple :
, etc.
Indice Utilisez une structure répétitive : For Each . . . Next
Énoncé 8.14 Afficher les noms de toutes les feuilles de calcul sous forme de liste Durée estimative : 10 minutes
Un classeur peut parfois contenir de très nombreuses feuilles de calcul. Créez la procédure ListeNomsFeuilles qui :
renomme la première feuille en "Accueil".
affiche dans cette feuille les noms de toutes les feuilles de calcul sous forme de liste pour faciliter la lecture.
Exemple :
Indice Utilisez l’index pour désigner la première feuille : Worksheets(1)
Énoncé 8.15 Rechercher une feuille de calcul Durée estimative : 10 minutes Créez la procédure ChercherFeuille qui recherche une feuille dont on spécifie le nom. Si la feuille est trouvée, elle devient la feuille active. Exemple :
Énoncé 8.16 Protéger toutes les feuilles de calcul Durée estimative : 5 minutes Créez la procédure Protection qui protège toutes les feuilles de calcul d’un classeur.
Énoncé 8.17 Déprotéger toutes les feuilles de calcul Durée estimative : 5 minutes Créez la procédure RetirerProtection correspondante.
Prérequis
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
b. b. a. a. b. b. a. et b. b. c. a. b. b.
Corrigé 8.1 Connaître le nom de la feuille active Sub NomFeuilleActive() Dim strNom As String strNom = ActiveSheet.Name MsgBox "Nom de la feuille active : " & strNom End Sub
Corrigé 8.2 Renommer la feuille active Sub Renommer() Dim strNom As String strNom = InputBox("Nouveau nom pour la feuille active") ActiveSheet.Name = strNom End Sub
Corrigé 8.3 Prévenir lors du changement de feuille active en rappelant le nom de l’ancienne feuille active ' Première procédure événementielle Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
MsgBox "Ancienne feuille active : " & Sh.Name End Sub ------------------------------------------------------------ ' Deuxième procédure événementielle Private Sub Workbook_SheetActivate(ByVal Sh As Object) MsgBox "Nouvelle feuille active : " & Sh.Name End Sub
Corrigé 8.4 Effectuer un aperçu de la feuille active Sub Aperçu() ActiveSheet.PrintPreview End Sub
Corrigé 8.5 Déclencher une action dès qu’une feuille est activée Private Sub Worksheet_Activate() MsgBox "Je suis la feuille " & ActiveSheet.Name _ & ". Vous allez travailler avec moi." End Sub
Corrigé 8.6 Déclencher une action dès qu’une cellule de la feuille active est activée Private Sub Worksheet_SelectionChange(ByVal Target As Range) ActiveCell.Value = "ici" With ActiveCell.Font .Bold = True .Size = 14 .ColorIndex = 5 End With With Selection .Interior.ColorIndex = 36 .HorizontalAlignment = xlCenter .VerticalAlignment = xlBottom End With End Sub
Corrigé 8.7 Déclencher une action dès qu’une cellule de la feuille active est modifiée Private Sub Worksheet_Change(ByVal Target As Range) Dim strAdresseModifiée As String Dim strAdresseNouvelle As String strAdresseModifiée = Target.Address MsgBox "Je suis la cellule que vous venez de modifier : " _ & strAdresseModifiée strAdresseNouvelle = Selection.Address MsgBox "Je suis la cellule où vous êtes actuellement : " _ & strAdresseNouvelle End Sub
Corrigé 8.8 Déclencher une action dès que l’on double clique sur une cellule de la feuille active Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, _ Cancel As Boolean) MsgBox "Vous passez en mode édition." End Sub
Corrigé 8.9 Ajouter une nouvelle feuille de calcul Sub Ajout() Worksheets.Add after:=Sheets((Sheets.Count)) ActiveSheet.Name = "Nouvelle" End Sub
Corrigé 8.10 Supprimer une feuille de calcul Sub Suppression() Worksheets("Nouvelle").Delete End Sub
Corrigé 8.11 Copier une feuille de calcul Sub Copier() Worksheets(1).Copy after:=Worksheets(Sheets.Count) End Sub
Corrigé 8.12 Connaître le nombre de feuilles du classeur Sub NombreFeuilles() Dim intNombre As Integer intNombre = Sheets.Count MsgBox "Il y a " & intNombre & " feuilles dans le classeur." End Sub
Corrigé 8.13 Connaître les noms de toutes les feuilles de calcul Sub NomsFeuilles() Dim wksFeuille As Worksheet For Each wksFeuille In Worksheets MsgBox wksFeuille.Name Next wksFeuille End Sub
Corrigé 8.14 Afficher les noms de toutes les feuilles de calcul sous forme de liste Sub ListeNomsFeuilles() Dim wksFeuille As Worksheet Dim i As Integer On Error GoTo Sortie_Sur_Erreur Worksheets(1).Name = "Accueil" i = 4 For Each wksFeuille In Worksheets Worksheets(1).Cells(i, 2).Value = wksFeuille.Name i = i + 1 Next wksFeuille Exit Sub Sortie_Sur_Erreur:
MsgBox "Vérifiez si la feuille Accueil est présente en 1ère position" End Sub
Corrigé 8.15 Rechercher une feuille de calcul Sub ChercherFeuille() Dim wksFeuilleCherchée As Worksheet Dim strNomFeuille As String strNomFeuille = _ InputBox("Entrez le nom de la feuille à chercher") For Each wksFeuilleCherchée In Worksheets If VBA.UCase(wksFeuilleCherchée.Name) = VBA.UCase(strNomFeuille) Then wksFeuilleCherchée.Activate Exit Sub End If Next wksFeuilleCherchée End Sub
Corrigé 8.16 Protéger toutes les feuilles de calcul Sub Protection() Dim wksFeuille As Worksheet For Each wksFeuille In Worksheets wksFeuille.Protect Next wksFeuille End Sub
Corrigé 8.17 Déprotéger toutes les feuilles de calcul Sub RetirerProtection() Dim wksFeuille As Worksheet For Each wksFeuille In Worksheets wksFeuille.Unprotect Next wksFeuille End Sub
Introduction Durée : 3 heure 35 Mots-clés plage, cellule, activer, désactiver, sélectionner, propriété, méthode, adressage direct, adressage indirect, zone, liste, formule, référence absolue, référence relative, liaison, lien dynamique Objectifs Connaître les principales propriétés et méthodes permettant de gérer les plages de cellules. Modifier la valeur ou l’aspect d’une cellule ou d’une plage de cellules avec ou sans sélection préalable.
Prérequis Pour valider les prérequis nécessaires, avant d’aborder le TP, répondez aux questions ci-après (certaines questions peuvent nécessiter plusieurs réponses) : 1. 2. 3. 4.
Les expressions suivantes renvoient la cellule active : a. ActiveCell b. Application.ActiveCell c. ActiveWindow.ActiveCell d. ActiveCells Pour une sélection comportant plusieurs cellules : a. toutes les cellules sont actives. b. une seule cellule est active. Pour sélectionner la cellule B6 : a. Range("B6") b. Range(B6) c. Cells(6,2) d. Cell(6,2) Pour sélectionner toutes les cellules d’une feuille : a. Range.Select b. Cells.Select c. Columns.Select
5. 6. 7. 8.
d. Rows.Select L’instruction Range("A1").Offset(4, 2).Select sélectionne : a. la cellule A4. b. active la cellule C5. c. active la cellule C2. Les instructions suivantes sont équivalentes : a. Range("C1").Value b. Cells(1,3).Value c. Range("A1").Select L’instruction fausse est : a. Range("A1").Formula = "=SUM(A1:A10)" b. Range("A1").FormulaLocal = "=SOMME(A1:A10)" c. Range("A1").Formula = SUM(A1:A10) L’instruction Range("E1").FormulaR1C1 = "=R1C1" donne pour formule en E1 : a. = A1 b. = $A$1 c. = $A1 d. = A$1 9. Il est possible de modifier la police d’une plage de cellules : a. obligatoirement après sa sélection. b. obligatoirement après activation d’une des cellules de cette plage. c. sans sélection ou activation. 10 Méthode(s) de l’objet Range : . a. AddComment b. Paste c. Add 11 Propriété(s) de l’objet Range : . a. Columns b. Sheets c. Interior 12 La méthode Clear : . a. efface seulement les formules. b. efface les formules et la mise en forme des cellules. c. efface seulement la mise en forme des cellules. 13 Dans l’instruction Set vTableau = Range("A10:C15"), la variable vTableau . est de type :
a. variant b. objet c. tableau
Énoncé 9.1 Activer une cellule Durée estimative : 5 minutes Créez un classeur avec Excel. Créez la procédure Activer qui active la cellule K2 de la première feuille et y inscrit le texte "Cellule K2".
Énoncé 9.2 Connaître l’adresse de la cellule active Durée estimative : 5 minutes Créez la procédure AdresseCelluleActive qui affiche l’adresse de la cellule active. Exemple :
Énoncé 9.3 Récupérer la valeur d’une cellule
Durée estimative : 5 minutes Classeur CellulesEtPlages.xlsm
Ouvrez le classeur CellulesEtPlages.xlsm. Créez la procédure RécupValeur qui donne la valeur contenue dans une cellule donnée. Exemple pour la cellule K4 qui contient le texte "Les Editions ENI" :
Énoncé 9.4 Récupérer la formule d’une cellule Durée estimative : 10 minutes Créez la procédure RécupFormule qui donne la formule contenue dans une cellule donnée. Exemple pour la cellule K9 qui donne le cosinus d’un angle :
Énoncé 9.5 Modifier le contenu d’une cellule
Durée estimative : 5 minutes En référence à la procédure précédente, créez la procédure ModificationValeur qui modifie la valeur de l’angle dans la cellule K7. Nouvelle valeur : 45.
Énoncé 9.6 Modifier le format d’une cellule Durée estimative : 5 minutes Créez la procédure FormatCellule qui applique à la cellule K4 un fond bleu, une couleur jaune pour les caractères et la police Comic Sans MS avec une taille 14. Résultat :
Indice Fond bleu : Interior.ColorIndex = 5 Caractères en jaune : Font.ColorIndex = 36 Nom de la police : Font.Name = "Comic Sans MS" Taille de la police : Font.Size = 14
Énoncé 9.7 Sélectionner la colonne où se trouve la cellule active Durée estimative : 5 minutes
Créez la procédure Colonne qui renvoie la colonne où se trouve la cellule active puis sélectionnez cette colonne. Exemple :
Indice Pour obtenir la lettre de la colonne à la place du numéro : VBA.Chr(ActiveCell.Column + 64)
Énoncé 9.8 Sélectionner toutes les cellules d’une feuille de calcul Durée estimative : 5 minutes Créez la procédure Tout qui sélectionne toutes les cellules d’une feuille de calcul.
Énoncé 9.9 Sélectionner toutes les cellules d’une plage définie Exercice 1 Durée estimative : 5 minutes Créez la procédure Plage qui sélectionne toutes les cellules de la plage de cellules B2 à E6 dans la feuille Feuil2.
Exercice 2 Durée estimative : 10 minutes Idem que l’exercice 1 mais en utilisant une variable objet nommée. Créez pour cela la procédure Plage2. Commentaire Les objets, notamment les collections, entraînent une occupation mémoire importante. L’utilisation d’une variable objet permet de contourner ce problème.
Énoncé 9.10 Sélectionner tout un tableau à partir d’une de ses cellules Durée estimative : 5 minutes La cellule C4 du tableau étant la cellule active, créez la procédure TableauSélection qui sélectionne ce tableau dans sa totalité. Exemple :
Hypothèse La cellule C4 du tableau n’est pas vide.
Énoncé 9.11 Sélectionner un tableau ou une liste nommée à partir de son nom Durée estimative : 5 minutes Créez la procédure TableauSélectionNom qui nomme le tableau de l’énoncé précédent "MonTableau". Sélectionnez ce tableau à partir de son nom. Indice Pour atteindre un tableau ou une liste à partir de leur nom : Application.Goto Reference:="Nom_Choisi"
Énoncé 9.12 Indiquer l’adresse de la cellule sous la cellule active puis la sélectionner Durée estimative : 10 minutes
Créez la procédure Bas qui indique l’adresse de la cellule sous la cellule active puis la sélectionne. Exemple :
Indice Utilisez la propriété Offset.
Énoncé 9.13 Trouver la dernière cellule contenant une valeur d’une colonne Durée estimative : 15 minutes Créez la procédure DernièreCellule qui demande à l’utilisateur de saisir une lettre de l’alphabet. La procédure doit ensuite trouver puis sélectionner la dernière cellule qui contient une valeur dans la colonne repérée par cette lettre. Exemple :
Énoncé 9.14 Attribuer la formule d’une cellule à une autre cellule Durée estimative : 5 minutes Dans la feuille Feuil1, saisissez les nombres ci-après. Utilisez dans Excel la fonction SOMME pour obtenir le total dans la cellule K16. Créez ensuite la procédure FormuleAutreCellule qui écrit en cellule K19 la même formule qu’en K16.
Énoncé 9.15 Attribuer une formule à une cellule Durée estimative : 5 minutes À partir de la procédure de l’énoncé précédent, créez la procédure FormuleDansCode qui intègre la formule du total dans le code VBA sans faire référence à la cellule K16.
Commentaire Le résultat est identique à l’exercice précédent.
Énoncé 9.16 Attribuer la référence absolue d’une cellule à une autre cellule Durée estimative : 5 minutes Créez la procédure ReférenceAbsolue qui reporte l’adresse absolue de la cellule K16 dans la cellule K20. Résultat : =$K$16
Énoncé 9.17 Attribuer une valeur à une plage de cellules Durée estimative : 5 minutes Créez la procédure AttribuerValeurPlage qui remplit la plage de cellules de M2 à N4 avec le mot "AZERTY".
Énoncé 9.18 Ajouter un commentaire à une cellule Durée estimative : 5 minutes Créez la procédure Commentaire qui ajoute le commentaire ci-après à la cellule K29.
Énoncé 9.19 Remplir un tableau avec des nombres Durée estimative : 10 minutes Créez la procédure RemplirNombres qui remplit le tableau ci-après avec des nombres de 1 à 12.
Indice Utilisez une boucle For Each ... Next.
Énoncé 9.20 Afficher le nombre de colonnes, de lignes et de cellules d’une plage
Durée estimative : 10 minutes Créez la procédure NombreCoLiCellules qui affiche pour le tableau précédent le nombre de colonnes, de lignes et de cellules. Exemple :
Énoncé 9.21 Rechercher une valeur Exercice 1 Durée estimative : 15 minutes Créez la procédure RechercheDansPlage qui recherche, en utilisant une structure répétitive, un nombre saisi par l’utilisateur dans le tableau précédent. Mettez le nombre en gras. Exemple :
Exercice 2 Durée estimative : 10 minutes
Créez la procédure RechercheDansPlageFind qui cherche un nombre du tableau de l’énoncé 9.19 saisi par l’utilisateur en utilisant cette fois-ci la méthode Find. Mettez également le nombre en gras.
Énoncé 9.22 Créer une série de données Durée estimative : 10 minutes Créez la procédure SériesChronologique qui établit une série chronologique journalière dans la plage de P2 à P11 à compter du 1er novembre 2021.
Indice Utilisez la méthode DataSeries.
Énoncé 9.23 Trier une plage de données Durée estimative : 5 minutes Créez la procédure TrierTableauNombres qui trie le tableau de l’énoncé 9.19 dans l’ordre décroissant.
Indice Utilisez la méthode Sort.
Énoncé 9.24 Copier une plage de données avec liaison aux données sources Durée estimative : 5 minutes Créez la procédure CopieDynamique qui copie le tableau de l’énoncé 9.19 dans la troisième feuille du classeur en conservant le lien dynamique (la liaison) avec les données sources.
Énoncé 9.25 Effacer les valeurs d’une plage de données avec demande de confirmation Durée estimative : 10 minutes Créez la procédure EffacerValeur qui efface uniquement les valeurs du tableau de l’énoncé 9.19 en affichant auparavant une boîte de confirmation.
Indice Pour afficher la boîte de demande de confirmation : intBouton = vbYesNo + vbDefaultButton2 intRéponse = _ MsgBox("Supprimer les valeurs du tableau ?", intBouton)
Énoncé 9.26 Ajouter des graphiques sparkline à des plages de cellules Durée estimative : 10 minutes Créez la procédure AjouteSparklines qui crée des graphiques de type sparkline (courbes). On suppose qu’avant de lancer la procédure, la cellule active appartient à un tableau de données, que ce tableau contient une ligne et une colonne de titre, que les graphiques seront basés sur les données en lignes et qu’ils seront implantés à droite en fin de ligne, de façon à obtenir le résultat tel que le suivant, en prenant pour exemple le tableau de l’exercice 9.10. On peut, comme indiqué sur l’exemple, agrémenter le graphique par une couleur et une épaisseur différentes du standard. Indice Utilisez l’enregistreur de macros pour créer la trame de la macro AjouteSparklines.
Énoncé 9.27 Lister les zones d’une plage à sélections multiples Durée estimative : 10 minutes Créez la procédure ListeZones qui affiche successivement les adresses de toutes les zones d’une plage de cellules à sélections multiples. Indice Utilisez la collection Areas.
Prérequis 1. a., b. et c. 2. b. 3. a. et c. 4. b., c. et d. 5. b. Par rapport à la cellule A1, Offset permet de sélectionner la cellule se trouvant quatre lignes plus bas et deux colonnes à droite. 6. a. et b. 7. c. 8. b. 9. c.
10 . 11 . 12 . 13 .
a. et b. a. et c. b. b.
Corrigé 9.1 Activer une cellule Sub Activer() Worksheets("Feuil1").Activate Range("K2").Activate ActiveCell.Value = "Cellule K2" End Sub
Corrigé 9.2 Connaître l’adresse de la cellule active Sub AdresseCelluleActive() Dim strAdresse As String strAdresse = ActiveCell.Address MsgBox "Adresse de la cellule active : " & strAdresse End Sub
Corrigé 9.3 Récupérer la valeur d’une cellule Sub RécupValeur() Dim strFormule As String Dim strAdresse strAdresse = Worksheets(1).Range("K4").Address strFormule = Worksheets(1).Range("K4").Value MsgBox "La cellule " & strAdresse & " contient : " & strFormule End Sub
Corrigé 9.4 Récupérer la formule d’une cellule Sub RécupFormule() Dim strFormule As String Dim strAdresse As String strAdresse = Worksheets(1).Range("K9").Address strFormule = Worksheets(1).Range("K9").Formula MsgBox "La cellule " & strAdresse & " contient la formule " _ & strFormule End Sub
Corrigé 9.5 Modifier le contenu d’une cellule Sub ModificationValeur() Dim strAdresse As String Worksheets(1).Range("K7").Value = 45 End Sub
Corrigé 9.6 Modifier le format d’une cellule Sub FormatCellule() With Worksheets(1).Range("K4") .Interior.ColorIndex = 5 With .Font .ColorIndex = 36 .Name = "Comic Sans MS" .Size = 14 End With End With End Sub
Corrigé 9.7 Sélectionner la colonne où se trouve la cellule active Sub Colonne() Dim intColonne As Integer Dim strLettre As String intColonne = ActiveCell.Column strLettre = VBA.Chr(ActiveCell.Column + 64)
MsgBox "La cellule active se trouve dans la colonne " _ & strLettre Columns(intColonne).Select End Sub
Corrigé 9.8 Sélectionner toutes les cellules d’une feuille de calcul Sub Tout() Cells.Select End Sub
Commentaire La cellule active par défaut est la cellule A1.
Corrigé 9.9 Sélectionner toutes les cellules d’une plage définie Exercice 1 Sub Plage() Worksheets(2).Activate Range("B2:E6").Select End Sub
Exercice 2 Sub Plage2() Dim rngZone As Range Worksheets(2).Activate Set rngZone = Range("B2:E6") rngZone.Select End Sub
Corrigé 9.10 Sélectionner tout un tableau à partir d’une de ses cellules Sub TableauSélection()
Selection.CurrentRegion.Select End Sub
Commentaire La propriété CurrentRegion renvoie un objet Range qui représente la zone en cours. Celle-ci est une plage limitée par toute combinaison de lignes et de colonnes vides. Attention, cela signifie que la cellule active du tableau ne doit pas être entourée de cellules vides. Exemple :
Avec la cellule active E6, la procédure devient inopérante.
Corrigé 9.11 Sélectionner un tableau ou une liste nommée à partir de son nom Sub TableauSélectionNom() Dim rngZone As Range Dim strNom As String Worksheets(2).Activate Set rngZone = Range("B2:E6") rngZone.Name = "MonTableau" Application.Goto Reference:="MonTableau" End Sub
Corrigé 9.12 Indiquer l’adresse de la cellule sous la cellule active puis la sélectionner Sub Bas() MsgBox "Adresse de la cellule active : " & _ ActiveCell.Address & vbCrLf & _ "Adresse de la cellule sous la cellule active." _ & ActiveCell.Offset(1, 0).Address ActiveCell.Offset(1, 0).Select
MsgBox "Sélection de cette dernière" End Sub
Corrigé 9.13 Trouver la dernière cellule contenant une valeur d’une colonne Sub DernièreCellule() Dim strLettreColonne As String Dim intNuméroColonne As Integer Dim strMessage As String On Error GoTo Sortie_Sur_Erreur strLettreColonne = _ VBA.UCase(InputBox("Entrer la lettre de la colonne (de A à Z)")) intNuméroColonne = Asc(strLettreColonne) - 64 Cells(1048576, intNuméroColonne).End(xlUp).Select strMessage = "La colonne " & strLettreColonne & " correspond" _ & " à la colonne n° " & intNuméroColonne strMessage = strMessage & vbCrLf _ & "Adresse de la dernière cellule non vide : " _ & Selection.Address strMessage = strMessage & vbCrLf _ & "Valeur contenue : " & Selection.Value MsgBox strMessage Sortie_Sur_Erreur: End Sub
Corrigé 9.14 Attribuer la formule d’une cellule à une autre cellule Sub FormuleAutreCellule() Worksheets(1).Range("K19").Value = Range("K16").Formula End Sub
Autre écriture possible : Range("K19").Formula = Range("K16").Formula
Corrigé 9.15 Attribuer une formule à une cellule Sub FormuleDansCode() Worksheets(1).Range("K19").Formula = "=SUM(K12:K15)" End Sub
Commentaire Pour écrire la fonction Excel en français dans le code VBA, utilisez la propriété FormulaLocal. Range("K19").FormulaLocal = "=SOMME(K12:K15)"
Corrigé 9.16 Attribuer la référence absolue d’une cellule à une autre cellule Sub ReférenceAbsolue() Worksheets(1).Range("K20").FormulaR1C1 = "=R16C11" End Sub
Corrigé 9.17 Attribuer une valeur à une plage de cellules Sub AttribuerValeurPlage() Worksheets(1).Range("M2:N4").Value = "AZERTY" End Sub
Autre écriture possible : Range(Cells(2, 13), Cells(4, 14)).Value = "AZERTY"
Corrigé 9.18 Ajouter un commentaire à une cellule Sub Commentaire() Dim strCommentaire As String Worksheets(1).Range("K29").ClearComments strCommentaire = "Voir la procédure DernièreCellule" Worksheets(1).Range("K29").AddComment strCommentaire End Sub
Commentaire La procédure échoue s’il existe déjà un commentaire. Il faut d’abord l’effacer.
Corrigé 9.19 Remplir un tableau avec des nombres Sub RemplirNombres() Dim rngTableau As Range Dim rngCellule As Range Dim intCompteur As Integer Worksheets(1).Activate Set rngTableau = Range("M6:N11") For Each rngCellule In rngTableau.Cells intCompteur = intCompteur + 1 rngCellule.Value = intCompteur Next rngCellule End Sub
Corrigé 9.20 Afficher le nombre de colonnes, de lignes et de cellules d’une plage Sub NombreCoLiCellules() Dim rngTableau As Range Dim intNBColonne As Integer Dim intNBLigne As Integer Dim intNBCellule As Integer Worksheets(1).Activate Set rngTableau = Range("M6:N11") With rngTableau intNBColonne = .Columns.Count intNBLigne = .Rows.Count intNBCellule = .Cells.Count End With MsgBox "Nombre de colonnes : " & intNBColonne _ & vbCrLf & "Nombre de lignes : " & intNBLigne _ & vbCrLf & "Nombre de cellules : " & intNBCellule End Sub
Corrigé 9.21 Rechercher une valeur Exercice 1 Sub RechercheDansPlage() Dim rngTableau As Range Dim rngCellule As Range Dim intNombre As Integer Dim blnTrouvé As Boolean Worksheets(1).Activate
Set rngTableau = Range("M6:N11") intNombre = InputBox("Saisir le nombre à chercher") For Each rngCellule In rngTableau.Cells If rngCellule.Value = intNombre Then rngCellule.Font.Bold = True blnTrouvé = True End If Next rngCellule If Not blnTrouvé Then MsgBox ("Le nombre " & intNombre & " n'est pas dans le tableau.") End If End Sub
Commentaire La recherche avec une structure répétitive est très lente pour de grandes plages de données. Exercice 2 Sub RechercheDansPlageFind() Dim rngTableau As Range Dim intNombre As Integer Worksheets(1).Activate Set rngTableau = Range("M6:N11") intNombre = InputBox("Saisir le nombre à chercher") rngTableau.Find(what:=intNombre, LookIn:=xlValues, _ lookat:=xlWhole).Select ActiveCell.Font.Bold = True End Sub
Commentaire La méthode Find est très rapide.
Corrigé 9.22 Créer une série de données Sub SériesChronologique() Dim rngPlageDate As Range Set rngPlageDate = Worksheets(1).Range("P2:P11") Worksheets(1).Range("P2").Formula = "1-NOV-2018" rngPlageDate.DataSeries Type:=xlChronological, Date:=xlDay End Sub
Corrigé 9.23 Trier une plage de données Sub TrierTableauNombres() Worksheets(1).Range("M6:N11").Sort _ Key1:=Worksheets(1).Range("M6"), _
Order1:=xlDescending, Orientation:=xlSortColumns End Sub
Corrigé 9.24 Copier une plage de données avec liaison aux données sources Sub CopieDynamique() Worksheets(1).Range("M6:N11").Copy Worksheets(3).Select Range("A1").Select ActiveSheet.Paste Link:=True End Sub
Corrigé 9.25 Effacer les valeurs d’une plage de données avec demande de confirmation Sub AjouteSparklines() Dim rngTableau As Range Dim rngDonnées As Range Dim rngGraphiques As Range Dim intNbLignes As Integer Dim intNbColonnes As Integer Set rngTableau = Selection.CurrentRegion With rngTableau '===================================================== ' Calcul du nombre de lignes et de colonnes ' du tableau de base '===================================================== intNbLignes = .Rows.Count intNbColonnes = .Columns.Count '===================================================== ' rngDonnées est le tableau des données i.e le tableau ' de base sans sa 1ère ligne et sa 1ère colonne '===================================================== Set rngDonnées = ActiveSheet.Range(.Cells(2, 2), .Cells(intNbLignes, intNbColonnes)) '===================================================== ' rngGraphiques est le champ d'implantation ' des graphiques sparkline '===================================================== Set rngGraphiques = ActiveSheet.Range(.Cells(2, intNbColonnes + 1), .Cells(intNbLignes, intNbColonnes + 1)) End With With rngGraphiques.SparklineGroups .Add Type:=xlSparkLine, SourceData:=rngDonnées.Address .Item(1).SeriesColor.Color = 255 .Item(1).LineWeight = 2.25 End With End Sub
Corrigé 9.26 Ajouter des graphiques sparkline à des plages de cellules Sub AjouteSparklines() Dim rngTableau As Range Dim rngDonnées As Range Dim rngGraphiques As Range Dim intNbLignes As Integer Dim intNbColonnes As Integer Set rngTableau = Selection.CurrentRegion With rngTableau '===================================================== ' Calcul du nombre de lignes et de colonnes ' du tableau de base '===================================================== intNbLignes = .Rows.Count intNbColonnes = .Columns.Count '===================================================== ' rngDonnées est le tableau des données i.e le tableau ' de base sans sa 1ère ligne et sa 1ère colonne '===================================================== Set rngDonnées = ActiveSheet.Range(.Cells(2, 2), .Cells(intNbLignes, intNbColonnes)) '===================================================== ' rngGraphiques est le champ d'implantation ' des graphiques sparkline '===================================================== Set rngGraphiques = ActiveSheet.Range(.Cells(2, intNbColonnes + 1), .Cells(intNbLignes, intNbColonnes + 1)) End With With rngGraphiques.SparklineGroups .Add Type:=xlSparkLine, SourceData:=rngDonnées.Address .Item(1).SeriesColor.Color = 255 .Item(1).LineWeight = 2.25 End With End Sub
Corrigé 9.27 Lister les zones d’une plage à sélections multiples Sub ListeZones() Dim uneZone As Range For Each uneZone In Selection.Areas MsgBox uneZone.Address Next uneZone MsgBox "Fin de la liste des zones de la sélection" End Sub
Introduction Durée : 1 heure 55 Mots-clés propriété, méthode, événement, feuille graphique, graphique incorporé, module de classe Objectifs Maîtriser les opérations de base et se familiariser avec les événements portant sur les graphiques.
Prérequis Pour valider les prérequis nécessaires, avant d’aborder le TP, répondez aux questions ci-après (certaines questions peuvent nécessiter plusieurs réponses) : 1 . 2 . 3 . 4 .
Dans la collection ChartObjects, le numéro d’index indique : a. la position du graphique dans le classeur. b. l’ordre de création du graphique incorporé. Pour ajouter un graphique : a. Charts.Add b. Add.Charts c. Charts.New La méthode pour renvoyer une série ou plusieurs séries dans un graphique : a. CollectionSeries b. SeriesCollection c. Series Avec la méthode ChartWizard, l’argument pour indiquer le type de graphique est :
5 . 6 . 7 . 8 . 9 .
a. Gallery b. Format c. ChartType L’objet suivant dispose d’une méthode d’exportation de graphique : a. ChartObjects b. Chart c. ChartObject Méthode pour préciser qu’un nouveau graphique de type Chart est un graphique incorporé : a. Location b. Where c. ChartObject Avant de pouvoir utiliser des événements avec un objet Chart qui représente un graphique incorporé, il faut : a. créer un module de classe. b. créer une nouvelle feuille graphique. Les événements de feuilles graphiques sont activés : a. par défaut. b. impliquent la création d’un module de classe. Sont des événements de graphiques : a. b. c. d.
Select MouseMove Calculate SelectionChange
Énoncé 10.1 Créer un graphique dans une feuille dédiée Durée estimative : 10 minutes Dans Excel, ouvrez un nouveau classeur puis implantez le tableau ci-après dans la feuille Feuil1. Créez ensuite la procédure CréerGraphiqueFeuille qui crée le graphique suivant dans une feuille graphique :
Indice Pour obtenir des histogrammes : ChartType = xlColumnClustered
Énoncé 10.2 Renommer une feuille contenant un graphique Durée estimative : 10 minutes Créez la procédure RenommerFeuilleGraphique qui renomme la feuille graphique Graphique1 en Graphe Ventes.
Énoncé 10.3 Déplacer une feuille contenant un graphique Durée estimative : 5 minutes Créez la procédure DéplacerFeuilleGraphique qui déplace la feuille graphique à la dernière position du classeur quel que soit son nombre de feuilles (de calcul ou graphiques).
Énoncé 10.4 Créer un graphique incorporé dans une feuille de calcul Durée estimative : 15 minutes Créez la procédure GraphiqueIncorporé qui, à partir du tableau des ventes, crée un graphique incorporé à la feuille de calcul Feuil1.
Énoncé 10.5 Étendre la source de données d’un graphique incorporé Durée estimative : 10 minutes Dans Excel, complétez le tableau avec les données du mois d’avril. Créez ensuite la procédure EtendreSérieGrapheIncorporé qui ajoute cette nouvelle série au graphique incorporé dans la feuille Feuil1.
Énoncé 10.6 Étendre la source de données d’un graphique implanté dans une feuille graphique Durée estimative : 10 minutes À partir du tableau complété, créez ensuite la procédure EtendreSérieGrapheFeuille qui ajoute les données du mois de mars au graphique dans la feuille Graphe Ventes.
Énoncé 10.7 Modifier la présentation d’un graphique Durée estimative : 10 minutes Créez la procédure ModifPrésentation qui modifie le graphique contenu dans la feuille Graphe Ventes selon le modèle ci-après.
Indice Vous pouvez utiliser ChartWizard, méthode simple pour modifier les propriétés d’un graphique. Histogrammes 3D avec ChartWizard : Gallery:=xl3DBar
Énoncé 10.8 Exporter un graphique dans un fichier image Durée estimative : 10 minutes Créez la procédure ExporterGraphique qui exporte au format GIF le graphique incorporé dans la feuille de calcul Feuil1 et qui nomme celui-ci VENTES.
Indice
Utilisez la propriété Path pour obtenir le chemin du dossier où se trouve le dossier Excel.
Énoncé 10.9 Déclencher une action quand le graphique est sélectionné Durée estimative : 5 minutes Créez la procédure événementielle qui affiche le message suivant dès que la feuille graphique Graphe Ventes est activée.
Énoncé 10.10 Déclencher une action suite à un clic sur le graphique Durée estimative : 10 minutes Créez la procédure événementielle qui affiche les coordonnées du pointeur de la souris lorsqu’on clique sur une zone quelconque du graphique.
Indice Créez la procédure dans la zone de code de la feuille graphique Graphe Ventes.
Énoncé 10.11 Construire un testeur de type de graphique Durée estimative : 20 minutes Classeur Graphiques.xlsm
On utilise le graphique situé sur la feuille Graphe Ventes. Programmez la procédure événementielle qui, par clics successifs sur le graphique, passe en revue les types de graphiques possibles. On utilisera pour cela la table des types située sur la feuille Tables du classeur et portant le nom Table_types_graphiques. On affichera dans le titre du graphique le descriptif du type, pris dans la 3ème colonne de la table des types.
Prérequis 1. 2. 3. 4. 5. 6. 7. 8. 9.
b. a. b. a. b. a. a. a. a., b. et c.
Corrigé 10.1 Créer un graphique dans une feuille dédiée Sub CréerGraphiqueFeuille() Dim Graphique As Chart Dim rngPlage As Range Set rngPlage = Worksheets("Feuil1").Range("A2:C5") Set Graphique = ThisWorkbook.Charts.Add With Graphique .SetSourceData Source:=rngPlage, PlotBy:=xlRows .ChartType = xlColumnClustered .HasTitle = True .ChartTitle.Characters.Text = "VENTES REALISEES PAR MOIS" End With End Sub
Corrigé 10.2 Renommer une feuille contenant un graphique Sub RenommerFeuilleGraphique() Charts("Graphique1").Name = "Graphe Ventes" End Sub
Corrigé 10.3 Déplacer une feuille contenant un graphique Sub DéplacerFeuilleGraphique() Charts("Graphe Ventes").Move After:=Sheets(Sheets.Count) End Sub
Corrigé 10.4 Créer un graphique incorporé dans une feuille de calcul Sub GraphiqueIncorporé() Dim Graphique As Chart Dim rngPlage As Range Set rngPlage = Worksheets("Feuil1").Range("A2:C5") Set Graphique = ThisWorkbook.Charts.Add With Graphique .SetSourceData Source:=rngPlage, PlotBy:=xlRows . ChartType = xlColumnClustered .HasTitle = True .ChartTitle.Characters.Text = "VENTES REALISEES PAR MOIS" .Location Where:=xlLocationAsObject, Name:="Feuil1" End With End Sub
Commentaire Pour une position particulière du graphique, utilisez : Add(Left, Top, Width, Height)
Corrigé 10.5 Étendre la source de données d’un graphique incorporé Sub EtendreSérieGrapheIncorporé() Worksheets("Feuil1").ChartObjects("Graphique 1").Select ActiveChart.SetSourceData Source:=Range("A2:E5") End Sub
Corrigé 10.6 Étendre la source de données d’un graphique implanté dans une feuille graphique Sub EtendreSérieGrapheFeuille() Sheets("Graphe Ventes").SetSourceData _ Source:=Sheets("Feuil1").Range("A2:E5") End Sub
Corrigé 10.7 Modifier la présentation d’un graphique Sub ModifPrésentation() Charts("Graphe Ventes").ChartWizard _ Gallery:=xl3DBar, _ Title:="VENTES REALISEES PAR REGION", PlotBy:=xlColumns End Sub
Corrigé 10.8 Exporter un graphique dans un fichier image Sub ExporterGraphique() Dim strCheminExport As String On Error GoTo Sortie_Sur_Erreur strCheminExport = ThisWorkbook.Path & "\" Worksheets("Feuil1").ChartObjects(1) _ .Chart.Export Filename:=strCheminExport & "VENTES.gif" MsgBox "Exportation réalisée" Exit Sub Sortie_Sur_Erreur: MsgBox "Le graphique n'existe pas" End Sub
Corrigé 10.9 Déclencher une action quand le graphique est sélectionné Private Sub Chart_Activate() MsgBox "Résultat trimestriel des agences" End Sub
Corrigé 10.10 Déclencher une action suite à un clic sur le graphique Private Sub Chart_MouseDown(ByVal Button As Long, _ ByVal Shift As Long, ByVal X As Long, ByVal Y As Long) If Button = xlPrimaryButton Then MsgBox "Coordonnées : " & "X = " & X & " Y = " & Y End If End Sub
Corrigé 10.11 Construire un testeur de type de graphique Option Explicit Private Const strTitre As String = "VENTES REALISEES PAR MOIS" Private Sub Chart_MouseDown(ByVal Button As Long, ByVal Shift As Long, ByVal x As Long, ByVal y As Long) Dim intNbTypes As Integer Static intNbClics As Integer On Error Resume Next intNbTypes = Worksheets("Tables").Range("Table_types_graphiques").Rows.Count intNbClics = intNbClics + 1 If intNbClics > intNbTypes Then intNbClics = 1 Else ActiveChart.ChartType = Worksheets("Tables").Range("Table_types_ graphiques").Cells(intNbClics, 2).Value ActiveChart.ChartTitle.Text = strTitre & " (" & _ Worksheets("Tables").Range("Table_types_graphiques"). Cells(intNbClics, 3).Value & ")" End If End Sub
Introduction Durée : 1 heure 05 Mots-clés formule VBA, formule Excel, formule locale, argument, séparateur
Objectifs Utiliser des fonctions VBA dans les feuilles de calcul et utiliser les fonctions Excel dans le code VBA.
Prérequis Pour valider les prérequis nécessaires, avant d’aborder le TP, répondez aux questions ci-après (certaines questions peuvent nécessiter plusieurs réponses) : 1 . 2 . 3 .
La plupart des fonctions de calcul Excel peuvent être utilisées avec VBA : a. directement. b. par le biais de l’objet WorksheetFunction. Propriété qui permet d’utiliser les fonctions Excel en français dans le code VBA : a. Formula b. FormulaLocal Certaines fonctions de calcul Excel en français :
a. ont leur équivalent dans Visual Basic. b. ont le même nom qu’une fonction VBA mais produisent des résultats différents. 4 Séparateur d’arguments des fonctions VBA : . a. le point-virgule. b. le trait d’union. c. la virgule. 5 Dans le code VBA, il est possible d’utiliser les fonctions Excel : . a. uniquement en anglais. b. uniquement en français. c. en anglais ou en français.
Énoncé 11.1 Calculer une commission dans une feuille de calcul Excel avec une fonction VBA Exercice 1 Durée estimative : 5 minutes Construisez dans Excel le tableau ci-dessous, sans aucune saisie dans la cellule B3. Créez ensuite la fonction VBA Commission. Utilisez cette fonction dans le tableau Excel.
Exercice 2 Durée estimative : 5 minutes Construisez dans Excel le tableau ci-dessous, sans aucune saisie dans la cellule B8. Créez ensuite la fonction VBA CommissionAvecFixe. Utilisez cette fonction dans le tableau Excel.
Énoncé 11.2 Calculer le prix HT à partir du taux de TVA et du prix TTC avec une fonction VBA Durée estimative : 5 minutes Construisez dans Excel le tableau ci-dessous, sans aucune saisie dans la cellule B12. Créez ensuite la fonction VBA PrixHT. Utilisez cette fonction dans le tableau Excel.
Énoncé 11.3 Calculer la valeur acquise d’un placement avec une fonction VBA Durée estimative : 15 minutes Construisez dans Excel le tableau ci-dessous, sans aucune saisie dans la cellule E4. Créez ensuite la fonction VBA Placement. Utilisez cette fonction dans la cellule E4.
Énoncé 11.4 Rechercher le minimum dans une plage de cellules avec une fonction Excel dans du code VBA Durée estimative : 10 minutes Créez une procédure ProcMinimum qui recherche la valeur minimum dans un tableau de nombres et affiche le résultat. Exemple :
Énoncé 11.5 Générer un nombre aléatoire à partir de code VBA utilisant une formule Excel Exercice 1 Durée estimative : 5 minutes Créez une procédure nommée NombreAléatoireFr qui génère un nombre aléatoire compris entre 0 et 100, à partir de code VBA, utilisant une formule Excel avec les fonctions en français. Elle affecte ensuite à la cellule H10 ce nombre aléatoire. Exemple :
Indice Saisissez en G10 le mot ALEA. Utilisez dans la cellule H10 la fonction Excel en français : ALEA. Exercice 2 Durée estimative : 10 minutes Créez une procédure nommée NombreAléatoireAng qui génère un nombre aléatoire compris entre 0 et 100, à partir de code VBA, utilisant une formule Excel avec les fonctions en anglais. Elle affecte ensuite à la cellule H11 ce nombre aléatoire. Exemple :
Indice Saisissez en G11 le mot RAND. Utilisez dans la cellule H11 la fonction Excel en anglais : RAND.
Énoncé 11.6 Calculer l’annuité constante avec Excel à partir d’une fonction VBA Durée estimative : 5 minutes
Créez une fonction VBA nommée AnnuitéConstante qui calcule l’annuité constante d’un emprunt en appliquant la formule située dans la cellule D16 ci-dessous. Utilisez cette fonction dans le tableau Excel ci-après.
Énoncé 11.7 Supprimer tous les espaces inutiles et redondants d’une plage de cellules contenant du texte Durée estimative : 5 minutes Dans une feuille de calcul vierge, saisissez les cellules A1, A2 et A3 en insérant volontairement des espaces supplémentaires entre les mots. Exemple :
Créez une fonction VBA nommée SupprimeEspaces() qui :
1) Inscrit à droite de chaque cellule le libellé absolu de l’adresse de la cellule traitée. Exemple : $A$1 en B1.
2) Inscrit en colonne C la formule Excel de suppression des espaces inutiles.
Indice
Utilisez la fonction locale Excel SUPPRESPACE().
Prérequis 1. 2. 3.
b. b. a. b.
4. 5.
c. c.
(exemple : Alea - Rnd) (exemple : Log)
Corrigé 11.1 Calculer une commission dans une feuille de calcul Excel avec une fonction VBA Exercice 1 Function Commission(dblCA As Double, dblPourcentage As Double) _ As Double Commission = dblCA * dblPourcentage End Function
Commentaire N’oubliez pas que le séparateur d’arguments d’Excel est le point virgule (sauf pour les plages qui requièrent le séparateur :). Pour utiliser la fonction VBA dans Excel, vous devez donc saisir : =Commission(B1;B2)
Exercice 2 Function CommissionAvecFixe(dblCA As Double, _ dblPourcentage As Double, dblFixe As Double) As Double CommissionAvecFixe = (dblCA * dblPourcentage) + dblFixe End Function
Corrigé 11.2 Calculer le prix HT à partir du taux de TVA et du prix TTC avec une fonction VBA Function PrixHT(dblPrixTTC As Double, dblTauxTVA As Double) As Double PrixHT = dblPrixTTC / (1 + dblTauxTVA) End Function
Corrigé 11.3 Calculer la valeur acquise d’un placement avec une fonction VBA Function Placement(dblCapital As Double, dblTaux As Double, _ intAnnées As Double) As Double Placement = dblCapital * (1 + dblTaux) ^ intAnnées End Function
Corrigé 11.4 Rechercher le minimum dans une plage de cellules avec une fonction Excel dans du code VBA Sub ProcMinimum() Dim dblMinimum As Double dblMinimum = Application.WorksheetFunction.Min( _ Worksheets(1).Range("G1:J6")) MsgBox "Le nombre minimum dans la plage [G1:J6] est " _ & dblMinimum End Sub
Corrigé 11.5 Générer un nombre aléatoire à partir de code VBA utilisant une formule Excel Exercice 1 Sub NombreAléatoireFr() Worksheets("Feuil1").Range("H10").FormulaLocal = "=ALEA()*100" End Sub
Exercice 2 Sub NombreAléatoireAng() Worksheets("feuil1").Range("H11").Formula = "=RAND()*100" End Sub
Commentaire Il existe aussi la fonction VBA Rnd : Sub NombreAléatoire3() Worksheets("feuil1").Range("H12").Formula = VBA.Rnd() * 100 End Sub
Corrigé 11.6 Calculer l’annuité constante avec Excel à partir d’une fonction VBA Function AnnuitéConstante(dblCapital As Double, dblTaux As Double, _ intAnnées As Double) As Double AnnuitéConstante = dblCapital * dblTaux _ / (1 - (1 + dblTaux) ^ -intAnnées) End Function
Corrigé 11.7 Supprimer tous les espaces inutiles et redondants d’une plage de cellules contenant du texte Sub SupprimeEspaces() Dim rngCellule As Range For Each rngCellule In Worksheets(2).Range("A1:A3").Cells
With rngCellule .Offset(0, 1).Value = rngCellule.Address .Offset(0, 2).FormulaLocal = _ "=SUPPRESPACE(" & rngCellule.Address & ")" End With Next rngCellule End Sub
Introduction Durée : 1 heure 45 Mots-clés bouton, méthode, fonction, paramètre nommé, constante VBA, type de données Objectifs Utiliser les boîtes de dialogue standards d’Excel et de Windows. Contrôler la saisie de l’utilisateur. Effectuer une action selon ses choix si la saisie est correcte.
Prérequis Pour valider les prérequis nécessaires, avant d’aborder le TP, répondez aux questions ci-après (certaines questions peuvent nécessiter plusieurs réponses) : 1 . 2 . 3 .
Pour afficher un message dans une boîte de dialogue sans demande de saisie, il faut utiliser : a. MsgBox b. Debug.Print c. InputBox La ou les instructions suivantes sont correctes : a. MsgBox ("Bonjour. Nous sommes le" & Date, title = "Essai") b. MsgBox "Bonjour. Nous sommes le" & Date, title:="Essai" c. MsgBox prompt:="Bonjour. Nous sommes le " & Date, title:="Essai" Sont des constantes VBA des boîtes de dialogue : a. vbOKOnly
4 . 5 . 6 . 7 .
b. vbUseSystem c. vbDefaultButton2 La valeur renvoyée par les boutons est de type : a. texte b. numérique c. booléen Ces constantes ont les valeurs suivantes : a. vbOKOnly 0 b. vbYesNo 4 c. vbDefaultButton2 5 L’instruction Application.InputBox appelle : a. la méthode InputBox b. la fonction InputBox Pour proposer une boîte de saisie avec contrôle du type de données, il faut utiliser : a. la fonction InputBox b. la méthode InputBox
Énoncé 12.1 Afficher un message simple Durée estimative : 5 minutes Créez la procédure AffichageSimple qui affiche un simple message avec le seul bouton OK par défaut. Changez le titre "Microsoft Excel" par défaut. Exemple :
Énoncé 12.2 Demander une saisie sans contrôle particulier Durée estimative : 5 minutes Créez la procédure DemandeSaisie qui affiche la boîte ci-dessous demandant une saisie sans effectuer de contrôle particulier.
Énoncé 12.3 Appeler la boîte de dialogue "Ouvrir" de Windows Durée estimative : 5 minutes Classeur Boîtes de dialogue standards.xlsm - formulaire frmBoîtesWindows
Utilisez le formulaire frmBoîtesWindows. Créez la procédure événementielle qui affiche la boîte d’ouverture de fichiers de Windows quand on clique sur le bouton Ouvrir un document.
Indice Pour afficher le formulaire frmBoîtesWindows : Sub AfficheFormulaire() frmBoîtesWindows.Show End Sub
Énoncé 12.4 Appeler la boîte de dialogue "Couleurs" de Windows Durée estimative : 10 minutes Classeur Boîtes de dialogue standards.xlsm - formulaire frmBoîtesWindows
Utilisez le formulaire frmBoîtesWindows. Créez la procédure événementielle qui affiche la boîte de choix des couleurs de Windows quand on clique sur le bouton Choix des couleurs. Le choix d’une couleur change la couleur de fond du formulaire.
Note Pour réaliser et comprendre ce TP, consultez la partie Aide sur les API Windows du chapitre Introduction. Indice Pour la déclaration de la fonction ChooseColorA, reportez-vous à la documentation Microsoft fournie dans le fichier texte Win32API_PtrSafe.TXT, téléchargeable sur le site de l’éditeur. Ce fichier fait également partie des téléchargements proposés pour cet ouvrage.
Pour avoir toutes les informations sur le type de la structure attendu, consultez la page suivante : https://msdn.microsoft.com/en-us/library/windows/desktop/ms646830%28v=vs.85 %29.aspx
Énoncé 12.5 Choisir des boutons pour les boîtes de dialogue Durée estimative : 10 minutes Créez la procédure ChoixBoutons qui affiche la boîte de dialogue ci-après avec les boutons Oui - Non.
Énoncé 12.6 Déterminer le bouton par défaut parmi plusieurs boutons proposés Durée estimative : 10 minutes Créez la procédure BoutonSupprime qui affiche la boîte de dialogue ci-après avec le bouton Non comme bouton par défaut.
Énoncé 12.7 Choisir et ajouter une icône à une boîte de dialogue Durée estimative : 5 minutes Modifiez la procédure précédente de sorte qu’une icône appropriée au contexte soit ajoutée à la boîte. Résultat :
Énoncé 12.8 Contrôler la saisie Durée estimative : 5 minutes Créez la procédure DemandeSaisieContrôle qui propose une boîte de saisie et contrôle que la valeur saisie est bien un nombre.
Énoncé 12.9 Effectuer une action selon le choix de l’utilisateur Durée estimative : 15 minutes Créez la procédure ActionSelonChoix qui ajoute une nouvelle feuille de calcul si l’utilisateur valide cette option.
Énoncé 12.10 Effectuer un traitement tant que l’utilisateur réalise la saisie demandée Durée estimative : 15 minutes Créez la procédure BoucleSaisie qui calcule la racine carrée d’un nombre tant que l’utilisateur entre un nombre strictement positif. Si la saisie est correcte, la procédure affiche la racine carrée du nombre entré. Si l’utilisateur saisit un nombre négatif ou clique sur le bouton Annuler, la procédure s’arrête. Exemple :
Indice Fonction VBA pour calculer la racine carrée : Sqr
Énoncé 12.11 Enregistrer un classeur Durée estimative : 5 minutes Créez la procédure EnregistreClasseur qui présente la boîte de dialogue intégrée d’Excel permettant d’enregistrer un classeur.
Note La collection Dialogs permet d’accéder à toutes les boîtes de dialogue intégrées d’Excel. Il existe des dizaines de constantes, chacune correspondant à une boîte de dialogue intégrée. Ces constantes sont décrites dans le lien suivant : https://docs.microsoft.com/frFR/office/vba/api/excel.xlbuiltindialog
Énoncé 12.12 Modifier la police de la feuille de calcul Durée estimative : 5 minutes Créez la procédure PoliceFeuille qui présente la boîte de dialogue intégrée permettant de choisir une nouvelle police pour une feuille de calcul.
Énoncé 12.13 Modifier la couleur d’une plage de cellules Durée estimative : 10 minutes Créez la procédure CouleurCellules qui présente, à partir d’un bouton placé sur une feuille de calcul, la boîte de dialogue intégrée permettant de choisir une nouvelle couleur pour une plage de cellules.
Indice Insérez auparavant un nouveau module et recopiez tout le code de la partie déclarations du code utilisé dans le module frmBoîtesWindows (exercice 12.4). Inspirez-vous de ce code pour traiter le présent exercice.
Prérequis 1. 2. 3. 4. 5. 6. 7.
a. b. et c. a. et c. b. a. et b. a. b.
Corrigé 12.1 Afficher un message simple
Sub AffichageSimple() MsgBox prompt:="Bonjour. " & "Il est" & Time, _ Title:="Accueil" End Sub
Commentaire Avec utilisation des paramètres nommés.
Corrigé 12.2 Demander une saisie sans contrôle particulier Sub DemandeSaisie() Dim dblRéponse As Double dblRéponse = InputBox("Saisissez un nombre", "Calcul") End Sub
Corrigé 12.3 Appeler la boîte de dialogue "Ouvrir" de Windows Private Sub cmdOuvrirFichier_Click() Application.Dialogs(xlDialogOpen).Show End Sub
Commentaire À mettre obligatoirement dans la zone de code du formulaire.
Corrigé 12.4 Appeler la boîte de dialogue "Couleurs" de Windows Zone des déclarations : Option Explicit ' CHOOSECOLOR structure ' https://msdn.microsoft.com/en-us/library/windows/desktop/ms646830(v=vs.85).aspx Private Type StructureChoixCouleur ' Structure utilisée comme argument ' de la fonction ChooseColorA lStructSize As Long ' longueur de la structure en octets (calculée) hwndOwner As LongPtr ' Le handle de la UserForm hInstance As LongPtr ' par défaut 0 rgbResult As Long ' résultat de la fonction = valeur de la couleur
lpCustColors As String ' chaîne Unicode = les couleurs de la palette flags As Long ' constantes fixant le style de la boîte de dialogue lCustData As LongPtr lpfnHook As LongPtr lpTemplateName As String End Type ' Constantes permettant de fixer le style de la boîte de dialogue standard Private Const CC_RGBINIT = &H1 Private Const CC_FULLOPEN = &H2 Private Const CC_PREVENTFULLOPEN = &H4 Private Const CC_SHOWHELP = &H8 Private Declare PtrSafe Function APIChoixCouleur Lib "comdlg32.dll" _ Alias "ChooseColorA" (pChoosecolor As StructureChoixCouleur) As Long Private CustomColors() As Byte ' déclaration du tableau des couleurs
Commentaire À placer obligatoirement dans la zone de code du formulaire. Code des procédures : Private Sub UserForm_Initialize() ' initialisation du tableau des couleurs à 0 ReDim CustomColors(0 To 16 * 4 - 1) As Byte Dim i As Integer For i = LBound(CustomColors) To UBound(CustomColors) CustomColors(i) = 0 Next i End Sub Private Sub cmdCouleurs_Click() Dim MaStructureChoixCouleur As StructureChoixCouleur Dim lReturn As LongPtr With MaStructureChoixCouleur .lStructSize = LenB(MaStructureChoixCouleur) .hwndOwner = Application.Hwnd .hInstance = 0 .lpCustColors = StrConv(CustomColors, vbUnicode) .flags = CC_FULLOPEN End With lReturn = APIChoixCouleur(MaStructureChoixCouleur) If lReturn 0 Then Me.BackColor = MaStructureChoixCouleur.rgbResult Else MsgBox "Abandon du choix de couleur" End If End Sub
Corrigé 12.5 Choisir des boutons pour les boîtes de dialogue Sub ChoixBoutons() Dim strMessage As String Dim intBouton As Integer Dim intChoix As Integer
strMessage = "Voulez-vous continuer ?" intBouton = vbYesNo intChoix = MsgBox(strMessage, intBouton) End Sub
Note La croix de fermeture de la fenêtre n’est plus accessible.
Corrigé 12.6 Déterminer le bouton par défaut parmi plusieurs boutons proposés Sub BoutonSupprime() Dim strMessage As String Dim intBouton As Integer Dim strTitre As String Dim intChoix As Integer strMessage = "Confirmez la suppression de la dernière feuille" intBouton = vbYesNo + vbDefaultButton2 + vbMsgBoxHelpButton strTitre = "Danger !!!" intChoix = MsgBox(strMessage, intBouton, strTitre) End Sub
Corrigé 12.7 Choisir et ajouter une icône à une boîte de dialogue Modifiez la procédure précédente en changeant la ligne : intBouton = vbYesNo + vbDefaultButton2 + vbMsgBoxHelpButton
par : intBouton = vbYesNo + vbDefaultButton2 + vbMsgBoxHelpButton + vbCritical
Corrigé 12.8 Contrôler la saisie Sub DemandeSaisieContrôle() Dim dblRéponse As Double dblRéponse = Application.InputBox("Entrez un nombre SVP", _ "Vérification de la saisie", Type:=1) End Sub
Corrigé 12.9 Effectuer une action selon le choix de l’utilisateur Sub ActionSelonChoix() Dim strMessage As String Dim intBoutonIcône As Integer Dim strTitre As String Dim intChoix As Integer strMessage = "Ajout d'une nouvelle feuille de calcul" intBoutonIcône = vbQuestion + vbYesNo + vbDefaultButton2 strTitre = "Action" intChoix = MsgBox(strMessage, intBoutonIcône, strTitre) If intChoix = vbYes Then ActiveWorkbook.Sheets.Add _ After:=Worksheets(Worksheets.Count) MsgBox "Ajout de feuille réalisé", vbOKOnly, "Fin" Else MsgBox "Opération annulée", vbOKOnly, "Fin" End If End Sub
Corrigé 12.10 Effectuer un traitement tant que l’utilisateur réalise la saisie demandée Sub BoucleSaisie() Dim dblSaisie As Double dblSaisie = Application.InputBox("Entrez un nombre > 0", _ "Calcul de la racine carrée", Type:=1) Do While dblSaisie > 0 MsgBox "La racine carrée de " & dblSaisie & "est :" _ & Sqr(dblSaisie) dblSaisie = Application.InputBox("Entrer un nombre > 0", _ "Calcul de la racine carré", Type:=1) Loop MsgBox "Saisie annulée", vbOKOnly, "Choix refusé" End Sub
Corrigé 12.11 Enregistrer un classeur Public Sub EnregistreClasseur Application.Dialogs(xlDialogSaveWorkbook).Show End Sub
Corrigé 12.12 Modifier la police de la feuille de calcul Public Sub PoliceFeuille() Application.Dialogs(xlDialogFormatFont).Show End Sub
Corrigé 12.13 Modifier la couleur d’une plage de cellules Dans un nouveau module, reprendre à l’identique la partie déclaration du corrigé 12.4. Code des procédures : Private Sub Initialise_Couleurs() ' initialisation du tableau des couleurs à 0 ReDim CustomColors(0 To 16 * 4 - 1) As Byte Dim i As Integer For i = LBound(CustomColors) To UBound(CustomColors) CustomColors(i) = 0 Next i End Sub Sub CouleurCellules() Dim MaStructureChoixCouleur As StructureChoixCouleur Dim lReturn As LongPtr Call Initialise_Couleurs With MaStructureChoixCouleur .lStructSize = LenB(MaStructureChoixCouleur) .hwndOwner = Application.Hwnd .hInstance = 0 .lpCustColors = StrConv(CustomColors, vbUnicode) .flags = CC_FULLOPEN End With lReturn = APIChoixCouleur(MaStructureChoixCouleur) If lReturn 0 Then Selection.Interior.Color = MaStructureChoixCouleur.rgbResult Else MsgBox "Abandon du choix de couleur" End If End Sub
Note Pour que l’accès soit possible à partir de tout module du projet, il suffit de rendre tous les accès publics.
Introduction Durée : 1 heure 35 Mots-clés UserForm, méthode, propriété, événement, charger, libérer, masquer, label, bouton de commande, zone de texte, contrôle Objectifs Utiliser des formulaires personnalisés. Découvrir quelques méthodes, propriétés et événements de l’objet UserForm.
Prérequis Pour valider les prérequis nécessaires, avant d’aborder le TP, répondez aux questions ci-après (certaines questions peuvent nécessiter plusieurs réponses) : 1 Un objet UserForm est : . a. une fenêtre ou une boîte de dialogue entrant dans la composition d’une interface utilisateur. b. une feuille de calcul avec des boutons. c. un classeur de feuilles de différents types. 2 Un objet UserForm comporte : . a. des propriétés. b. des méthodes. c. des événements. 3 Sont des méthodes de l’objet UserForm : . a. Show b. Forms c. Unload d. PrintForm 4 Sont des événements de l’objet UserForm :
. 5 . 6 .
a. MouseMove b. Initialize c. Change L’instruction suivante est correcte : a. Private Sub UserForm_Initialize b. Private Sub UserFormInitialize() c. Private Sub UserForm_Initialize() BackColor = VBA.RGB(0, 128, 64) donne au formulaire un fond : a. bleu b. jaune c. vert
Prérequis Pour valider les prérequis nécessaires, avant d’aborder le TP, répondez aux questions ci-après (certaines questions peuvent nécessiter plusieurs réponses) : 1 Un objet UserForm est : . a. une fenêtre ou une boîte de dialogue entrant dans la composition d’une interface utilisateur. b. une feuille de calcul avec des boutons. c. un classeur de feuilles de différents types. 2 Un objet UserForm comporte : . a. des propriétés. b. des méthodes. c. des événements. 3 Sont des méthodes de l’objet UserForm : . a. Show b. Forms c. Unload d. PrintForm 4 Sont des événements de l’objet UserForm :
. 5 . 6 .
a. MouseMove b. Initialize c. Change L’instruction suivante est correcte : a. Private Sub UserForm_Initialize b. Private Sub UserFormInitialize() c. Private Sub UserForm_Initialize() BackColor = VBA.RGB(0, 128, 64) donne au formulaire un fond : a. bleu b. jaune c. vert
Énoncé 13.1 Afficher un formulaire Durée estimative : 10 minutes Dans l’IDE, dessinez un formulaire. Nommez-le frmVide. Créez ensuite la procédure AfficherfrmVide qui l’affiche.
Note Pour insérer un formulaire (UserForm), basculez dans l’IDE (raccourci-clavier [Alt] [F11]).
Énoncé 13.2 Afficher un formulaire en mode non modal Durée estimative : 5 minutes Rendre le formulaire précédent non modal (possibilité d’accéder à un autre formulaire ou à une fenêtre avec le formulaire ouvert).
Énoncé 13.3 Afficher un formulaire en détaillant son contenu Durée estimative : 20 minutes Classeur Formulaires.xlsm - formulaire frmContrôles
Dans l’IDE, dessinez un second formulaire tel que ci-après (ou téléchargez-le). Nommez-le frmContrôles. Créez la procédure AfficherfrmContrôles qui l’affiche avec le nombre et les noms des contrôles du formulaire.
Note Pour modifier le nom du formulaire, changez la valeur de la propriété Name. Pour modifier le titre du formulaire, changez la valeur de la propriété Caption. Pour ajouter les contrôles au formulaire, utilisez la boîte à outils.
Pour le titre "Le formulaire comporte …", utilisez le contrôle Intitulé. Pour la zone de texte, utilisez le contrôle Zone de texte. Pour les boutons, utilisez le contrôle Bouton de commande.
Indice Outre la procédure AfficherfrmContrôles, vous devez créer une procédure événementielle placée dans la zone de code du formulaire. Pour un contrôle Label se nommant lblControlLabel, utilisez sa propriété Caption pour lui affecter un libellé. Me.lblControlLabel.Caption = "Le formulaire comporte" _ & Me.Controls.Count & "contrôles"
Énoncé 13.4 Fermer un formulaire et libérer la mémoire Durée estimative : 5 minutes Créez une procédure événementielle qui ferme le formulaire et libère la mémoire quand on clique sur le bouton Quitter. Indice Vous pouvez nommer le bouton Quitter : cmdQuitter. Private Sub cmdQuitter_Click() . . . End Sub
Énoncé 13.5 Gérer le déplacement de la souris sur le formulaire Durée estimative : 15 minutes Ajoutez une procédure événementielle qui affiche les coordonnées du pointeur de la souris au-dessus du formulaire frmContrôles. Exemple :
Indice Pour l’affichage dans un contrôle Label nommé lblControlLabel : lblControlLabel.Caption = " . . . "
Pour l’affichage dans un contrôle TextBox nommé txtTexte : txtTexte.Text = " . . . "
Énoncé 13.6 Gérer le double clic de la souris sur le formulaire Durée estimative : 5 minutes Créez une procédure événementielle qui affiche le message ci-dessous quand on effectue un double clic sur le formulaire frmContrôles.
Indice Pour gérer l’événement double clic : UserForm_DblClick
Énoncé 13.7 Afficher un formulaire à partir d’un autre formulaire Durée estimative : 5 minutes Créez une procédure événementielle qui affiche le premier formulaire quand on effectue un clic sur le bouton 1er formulaire.
Indice Vous pouvez nommer le bouton 1er formulaire : cmdAfficheFrmVide Private Sub cmdAfficheFrmVide_Click() ... End Sub
Énoncé 13.8 Modifier le formulaire par programmation Durée estimative : 15 minutes Créez la procédure ModifFormulaire qui modifie le formulaire frmContrôles selon le modèle ci-après.
Indice Pour la couleur de fond du formulaire : RGB(0, 0, 255)
Pour la couleur de fond de la zone de texte : txtTexte.BackColor = RGB(0, 128, 64)
Pour la couleur du texte de la zone de texte : txtTexte.ForeColor = RGB(255, 255, 0)
Pour placer la barre de défilement : fmScrollBarsVertical
Énoncé 13.9 Désactiver la croix de fermeture Durée estimative : 15 minutes
Insérez un nouveau formulaire. Créez, dans la procédure événementielle UserForm_Initialize, le code qui désactive la croix de fermeture de ce formulaire.
Note N’oubliez pas d’ajouter un bouton Quitter pour refermer le formulaire. Indice Pour la déclaration des fonctions FindWindowA, GetSystemMenu et RemoveMenu, reportez-vous à la documentation Microsoft fournie dans le fichier texte Win32API_PtrSafe.TXT, téléchargeable sur le site de l’éditeur. Ce fichier fait également partie des téléchargements proposés pour cet ouvrage.
Prérequis 1. 2. 3. 4. 5. 6.
a. a., b. et c. a., c. et d. a. et b. c. c.
Corrigé 13.1 Afficher un formulaire Sub AfficherFrmVide() frmVide.Show End Sub
Commentaire La procédure doit être écrite dans la zone de code du formulaire. Dans l’IDE, effectuer un double clic sur le formulaire ou un clic droit puis choisir Code. Par défaut, un formulaire est affiché en mode modal. Il faut alors le fermer pour pouvoir accéder à un autre formulaire ou une autre fenêtre.
Corrigé 13.2 Afficher un formulaire en mode non modal Sub AfficherFrmVideNonModal() frmVide.Show vbModeless End Sub
Corrigé 13.3 Afficher un formulaire en détaillant son contenu Pour initialiser le formulaire : Private Sub UserForm_Initialize() Dim ctlControle As Control Dim strMessage As String strMessage = "Le formulaire comporte " _ & Me.Controls.Count & " contrôles : " For Each ctlControle In Me.Controls strMessage = strMessage & " " & ctlControle.Name Next Me.lblControlLabel.Caption = strMessage End Sub
Pour afficher le formulaire : Sub AfficherFrmContrôles() frmContrôles.Show End Sub
Corrigé 13.4 Fermer un formulaire et libérer la mémoire Private Sub cmdQuitter_Click() Unload Me End Sub
Commentaire La procédure doit être écrite dans la zone de code du formulaire contenant le bouton. En mode VBE, effectuez un double clic sur le bouton Quitter ou un clic droit puis choisissez Code.
Corrigé 13.5 Gérer le déplacement de la souris sur le formulaire Private Sub UserForm_MouseMove(ByVal Button As Integer, _ ByVal Shift As Integer, ByVal X As Single, _ ByVal Y As Single) txtTexte.Text = "Vous avez bougé la souris. " _ & "Ce texte s'affiche. " _ & "Le formulaire réagit à des événements. " _ & ("Essayez aussi le double clic.") Me.lblControlLabel.Caption = "X : " _ & X & vbCrLf & "Y : " & Y End Sub
Corrigé 13.6 Gérer le double clic de la souris sur le formulaire Private Sub UserForm_DblClick(ByVal Cancel As MSForms.ReturnBoolean) MsgBox "Je suis sensible au double clic" End Sub
Corrigé 13.7 Afficher un formulaire à partir d’un autre formulaire Private Sub cmdAfficheFrmVide_Click() Call AfficherFrmVide End Sub
Corrigé 13.8 Modifier le formulaire par programmation Sub ModifFormulaire() With frmContrôles .BackColor = VBA.RGB(0, 0, 255) .txtTexte.BackColor = VBA.RGB(0, 128, 64) .txtTexte.ForeColor = VBA.RGB(255, 255, 0) .ScrollBars = fmScrollBarsVertical .Show End With End Sub
Commentaire Il est aussi possible d’effectuer les changements à partir de l’événement Initialize. Pour la gestion des couleurs, utilisez la fonction VBA.RGB : Rouge-Vert-Bleu de 0 à 255 pour l’intensité de chaque couleur. Il ne s’agit pas d’une procédure événementielle. On peut donc l’écrire dans n’importe quel module.
Corrigé 13.9 Désactiver la croix de fermeture Option Explicit ' Déclaration des fonctions API Private Declare PtrSafe Function FindWindow Lib "user32.dll" _ Alias "FindWindowA" (ByVal lpClassName As String, _ ByVal lpWindowName As String) As LongPtr Private Declare PtrSafe Function GetSystemMenu Lib "user32.dll" _ (ByVal hwnd As LongPtr, ByVal bRevert As Long) As LongPtr Private Declare PtrSafe Function RemoveMenu Lib "user32.dll" ( _
ByVal hMenu As LongPtr, _ ByVal nPosition As Long, _ ByVal wFlags As Long) As Long ---------------------------------------------------------------- Private Sub cmdQuitter_Click() Unload Me End Sub ---------------------------------------------------------------- ' Initialisation du formulaire Private Sub UserForm_Initialize() Dim hwnd As Long, hSysMenu As Long hwnd = FindWindow(vbNullString, Me.Caption) hSysMenu = GetSystemMenu(hwnd, 0) ' désactive la croix de fermeture RemoveMenu hSysMenu, &HF060, 0 End Sub
Introduction Durée : 3 heures 30 Mots-clés contrôle, bouton de commande, zone de liste, liste modifiable, zone de texte, intitulé, label, bouton à option, case à cocher, objet multipage, image, méthode, propriété, événement, contrôle ActiveX Objectifs Utiliser les principaux contrôles et se familiariser avec leurs propriétés, méthodes et événements.
Prérequis Pour valider les prérequis nécessaires, avant d’aborder le TP, répondez aux questions ci-après (certaines questions peuvent nécessiter plusieurs réponses) : 1. 2.
Un contrôle formulaire possède : a. des événements. b. des propriétés. c. des méthodes. La valeur d’index du premier contrôle est : a. 0
b. 1 3. La valeur d’index indique l’ordre : a. de haut en bas. b. de gauche à droite. c. dans lequel les contrôles ont été ajoutés à la collection. 4. La collection Controls d’un formulaire particulier permet : a. d’énumérer les contrôles. b. de définir les propriétés des contrôles. c. de modifier le formulaire lui-même. 5. Méthodes communes aux contrôles TextBox, ListBox, ComboBox : a. Move b. SetFocus c. Clear 6. Pour changer le texte d’un contrôle Label, il faut utiliser la propriété : a. Caption b. Value c. Name 7. Dans une ListBox, la propriété ListCount permet de préciser : a. le maximum de lignes à afficher en une seule fois. b. le nombre d’entrées dans la liste. c. le nombre de lignes sur lesquelles on peut effectuer un défilement. 8. Dans une ListBox ou ComboBox, la propriété ListIndex : a. a pour valeur 0, si aucun élément n’est sélectionné. b. a pour valeur -1, si aucun élément n’est sélectionné. c. contient un index de la ligne sélectionnée dans la liste. 9. La propriété Text permet de modifier : a. la valeur d’un contrôle ComboBox ou ListBox. b. le texte d’un contrôle TextBox. c. la valeur de la ligne sélectionnée d’un contrôle ComboBox ou ListBox. 10. Pour insérer une image, le contrôle nécessaire est : a. Image b. Picture c. Shape Note Tous les formulaires sont créés dans l’environnement graphique de développement (IDE). Téléchargez le dossier Chapitre 14. Contrôles puis ouvrez le classeur Contrôles.xlsm. Basculez dans l’IDE par [Alt][F11].
Énoncé 14.1 Ajouter des contrôles par programmation Durée estimative : 15 minutes formulaire frmAjout
Vous disposez du formulaire frmAjout. Ouvrez le classeur Contrôles.xlsm. Créez deux procédures événementielles qui ajoutent respectivement un bouton de commande cmdAjoutBttCommande et un contrôle multipage (mpAjoutControle). Exemple :
Indice Noms des boutons : cmdAjoutBttCommande et cmdAjoutControle Private Sub cmdAjoutBttCommande_Click() ... End Sub Private Sub cmdAjoutControle_Click() ... End Sub
Énoncé 14.2 Masquer puis réafficher des contrôles Durée estimative : 15 minutes Formulaire frmGénéral
Vous disposez du formulaire frmGénéral. Créez trois procédures événementielles qui permettent respectivement de masquer tous les contrôles sauf le contrôle "Afficher" (cmdMasquer), d’afficher tous les contrôles masqués (cmdAfficher) et de fermer le formulaire (cmdQuitter).
Indice Nom des contrôles utilisés :
la zone d’intitulé : lbl1 (Label)
les zones de texte : txt1, txt2 (TextBox)
les boutons de commande : cmdDescendre, cmdMonter, cmdAfficher, cmdMasquer, cmdQuitter (CommandButton)
Énoncé 14.3 Déplacer les contrôles Durée estimative : 10 minutes
À partir du formulaire précédent et des boutons Descendre et Monter, créez les procédures événementielles qui permettent de faire descendre ou monter tous les contrôles (respectivement cmdDescendre et cmdMonter). Exemple :
Énoncé 14.3 Déplacer les contrôles Durée estimative : 10 minutes À partir du formulaire précédent et des boutons Descendre et Monter, créez les procédures événementielles qui permettent de faire descendre ou monter tous les contrôles (respectivement cmdDescendre et cmdMonter). Exemple :
Énoncé 14.5 Faire réagir les contrôles à la frappe clavier Durée estimative : 10 minutes Créez la procédure événementielle qui affiche un message dès que la lettre "a" est saisie dans l’une des zones de texte.
Énoncé 14.6 Faire réagir les contrôles à la souris Durée estimative : 10 minutes
Créez la procédure événementielle qui fait apparaître un message dès que le pointeur de la souris survole le premier contrôle du formulaire (lbl1).
Énoncé 14.7 Afficher une colonne de données d’Excel avec le titre en en-tête dans une zone de liste Durée estimative : 15 minutes Tableau et formulaire frmListBox
Le tableau ci-après se trouve dans la feuille Feuil1 du classeur Excel Contrôles.xlsm. Créez la procédure événementielle qui transfère, en conservant le titre, les données dans la zone de liste lstRégions.
Indice
Noms des contrôles utilisés :
la zone de liste : lstRégions (ListBox)
le bouton Valider : cmdValider (CommandButton)
le bouton Quitter : cmdQuitter (CommandButton)
Énoncé 14.8 Afficher dans Excel une donnée sélectionnée dans une zone de liste Durée estimative : 15 minutes Créez la procédure événementielle qui transfère la donnée sélectionnée de la zone de liste lstRégions dans la cellule E3 suite à un clic sur le bouton Valider. Exemple :
Énoncé 14.9 Reporter plusieurs lignes d’une zone de liste dans des cellules d’Excel Durée estimative : 15 minutes
Modifiez la procédure événementielle précédente de telle sorte qu’elle transfère toutes les données sélectionnées de la zone de liste lstRégions dans des cellules Excel à partir de E3. Exemple :
Énoncé 14.10 Affecter à un tableau Excel la saisie effectuée dans une liste déroulante modifiable Durée estimative : 15 minutes Formulaire frmComboBox
Vous disposez du formulaire frmComboBox. Créez la procédure événementielle qui permet à partir du formulaire l’ajout d’une région au tableau Excel. Exemple :
Indice Noms de certains contrôles utilisés :
la liste déroulante ou zone de liste modifiable : cboRégions (ComboBox)
le bouton Ajouter : cmdAjout
le bouton Trier : cmdTrier
Énoncé 14.11 Trier un tableau Excel à partir d’une liste déroulante modifiable Durée estimative : 15 minutes À partir du bouton Trier du formulaire frmComboBox, créez la procédure événementielle qui trie le tableau Excel. Résultat :
Énoncé 14.12 Utiliser une liste déroulante à deux colonnes et affecter le choix à une plage Excel Durée estimative : 15 minutes Formulaire frmLD2Colonnes
Vous disposez du formulaire frmLD2Colonnes. Créez la procédure événementielle qui permet, après validation du choix, de reporter les données des deux colonnes dans des cellules Excel. Exemple :
Indice Noms de certains contrôles utilisés :
la liste déroulante ou zone de liste modifiable : cboListeDéroulante2C (ComboBox)
le bouton Valider : cmdValider
Énoncé 14.13 Utiliser des boutons d’option Durée estimative : 10 minutes Formulaire frmOptionàCocher
Vous disposez du formulaire frmOptionàCocher. Créez la procédure événementielle qui affiche un libellé correspondant au choix. Exemple :
Indice Noms de certains contrôles utilisés :
les zones d’intitulé : lbl1, lbl2 (Label)
les boutons d’option : optSucre, optSansSucre, optPasDeCafé (OptionButton)
Énoncé 14.14 Utiliser des cases à cocher Durée estimative : 15 minutes Formulaire frmCase, fichiers Banane.gif, Poire.gif et Pomme.gif (les images se trouvent dans le sous-dossier Images Sub)
Vous disposez du formulaire frmCase. Créez la procédure événementielle qui affiche les choix réalisés dans des cellules Excel et les images correspondantes dans le formulaire. Pour cet exercice, vous pouvez télécharger les images depuis le sousdossier Images Sub. Exemple :
Indice Noms de certains contrôles utilisés :
les cases à cocher : chk1, chk2 et chk3
le bouton Valider : cmdValider
Énoncé 14.15 Intercepter une combinaison de touches Durée estimative : 5 minutes Formulaire frmGénéral
Dans le formulaire frmGénéral, programmez la combinaison de touches [Ctrl][Alt] [F12] sur la zone de texte txt1 pour déclencher une procédure connue du seul développeur.
Indice Rédigez la procédure "secrète" Sub Maintenance() dont le contenu peut être, dans le cas de l’exercice, un simple MsgBox.
Énoncé 14.16 Utiliser un bouton à bascule Durée estimative : 10 minutes Formulaire frmGénéral
Dans le formulaire frmGénéral, implantez un bouton à bascule qui permet d’alterner le mode activé/désactivé sur l’ensemble des contrôles implantés (sauf lui-même !). On modifiera également le libellé du bouton en "Activer"/"Désactiver".
Indice Nom du contrôle utilisé : tglActiver
Énoncé 14.17 Préparer une zone de saisie préremplie et sélectionnée Durée estimative : 5 minutes Formulaire frmGénéral
Dans le formulaire frmGénéral, remplissez la zone de texte txt1 avec la date du jour et l’heure avant l’affichage du formulaire et présentez ce contenu présélectionné à l’utilisateur. Placez le focus sur txt1 pour pouvoir effectuer une modification éventuelle dès l’affichage du formulaire.
Indice Propriétés à utiliser : SelStart et SelLength
Énoncé 14.18 Gérer des images
Durée estimative : 10 minutes Formulaire frmImages
dossier des images Images Sub Créez ou utilisez le formulaire frmImages. Le bouton Charger la liste reporte les noms des images au format JPG. L’image dont le nom a été sélectionné apparaît dans la partie droite du formulaire. Le bouton Afficher l’image dans une feuille de calcul recopie l’image affichée dans une feuille de calcul nommée Images.
Indice Pour gérer l’événement déclencheur de l’aperçu de l’image suite à un clic de souris :
Prérequis 1. 2. 3. 4. 5. 6. 7.
a., b. et c. a. c. a. et b. a. et b. a. b.
8. 9. 10.
b. et c. b. et c. a.
Corrigé 14.1 Ajouter des contrôles par programmation Déclaration : Private ctlNouveauContrôle As Control
Code du bouton Ajouter un bouton de commande : Private Sub cmdAjoutBttCommande_Click() Set ctlNouveauContrôle = Controls.Add("Forms.CommandButton.1") With ctlNouveauContrôle .Left = 18 .Top = 10 .Width = 175 .Height = 40 .Caption = "Bouton ou Contrôle CommandButton" End With End Sub
Code du bouton Ajouter un contrôle multipage : Private Sub cmdAjoutControle_Click() Set ctlNouveauContrôle = Controls.Add("Forms.MultiPage.1") With ctlNouveauContrôle .Left = 18 .Top = 60 .Width = 175 .Height = 40 End With End Sub
Commentaire À mettre dans la zone de code du formulaire frmAjout.
Corrigé 14.2 Masquer puis réafficher des contrôles
Déclaration : Private ctlControl As Control
Code du bouton Masquer : Private Sub cmdMasquer_Click() For Each ctlControl In Me.Controls If ctlControl.Name "cmdAfficher" Then ctlControl.Visible = False End If Next ctlControl End Sub
Code du bouton Afficher : Private Sub cmdAfficher_Click() For Each ctlControl In Me.Controls ctlControl.Visible = True Next ctlControl End Sub
Code du bouton Quitter : Private Sub cmdQuitter_Click() Unload Me End Sub
Commentaire À mettre dans la zone de code du formulaire frmGénéral.
Corrigé 14.3 Déplacer les contrôles Déclaration déjà effectuée à l’exercice 14.2 : Private ctlControl As Control
Code du bouton Descendre : Private Sub cmdDescendre_Click() Controls.Move 0, 5 End Sub
Code du bouton Monter : Private Sub cmdMonter_Click() Controls.Move 0, -5 End Sub
Corrigé 14.4 Rendre un contrôle dépendant d’un autre Private Sub txt1_Change() txt2.Text = txt1.Text End Sub
Corrigé 14.5 Faire réagir les contrôles à la frappe clavier Private Sub txt1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) If KeyAscii = Asc("a") Then MsgBox "Vous avez saisi la lettre a" End If End Sub
Corrigé 14.6 Faire réagir les contrôles à la souris Private Sub lbl1_MouseMove(ByVal Button As Integer, ByVal _ Shift As Integer, ByVal X As Single, ByVal Y As Single) lbl1.Caption = "Je suis le contrôle lbl1" MsgBox "Vous avez survolé le contrôle lbl1" End Sub
Corrigé 14.7 Afficher une colonne de données d’Excel avec le titre en en-tête dans une zone de liste Private Sub UserForm_Activate() Dim strAdresseDernièreRégion As String strAdresseDernièreRégion = _ Worksheets("Feuil1").Range("B3").End(xlDown).Address With lstRégions .ColumnHeads = True .RowSource = "B3:" & strAdresseDernièreRégion .ListIndex = 0
.MultiSelect = fmMultiSelectExtended End With End sub
Corrigé 14.8 Afficher dans Excel une donnée sélectionnée dans une zone de liste Private Sub cmdValider_Click() Dim intIndex As Integer intIndex = lstRégions.ListIndex With Worksheets("Feuil1") .Range("E3:E12").ClearContents .Range("E3") = lstRégions.ListIndex(intIndex) End With End sub
Corrigé 14.9 Reporter plusieurs lignes d’une zone de liste dans des cellules d’Excel Private Sub cmdValider_Click() Dim intCompteurLignesListe As Integer Dim intCompteurLignesExcel As Integer Worksheets("Feuil1").Range("E3:E12").ClearContents intCompteurLignesExcel = 3 With lstRégions For intCompteurLignesListe = 0 To .ListCount - 1 If .Selected(intCompteurLignesListe) = True Then Worksheets("Feuil1").Cells(intCompteurLignesExcel, 5) = _ .List(intCompteurLignesListe) intCompteurLignesExcel = intCompteurLignesExcel + 1 End If Next End With End Sub
Corrigé 14.10 Affecter à un tableau Excel la saisie effectuée dans une liste déroulante modifiable Initialisation avant affichage : Private Sub UserForm_Initialize()
Dim strAdresseDernièreRégion As String strAdresseDernièreRégion = _ Worksheets("Feuil1").Range("B100").End(xlUp).Address With cboRégions .RowSource = "B3:" & strAdresseDernièreRégion .ListIndex = 0 End With End Sub
Code du bouton Ajouter : Private Sub cmdAjout_Click() Dim strNouvelleCellule As String strNouvelleCellule = _ Worksheets("Feuil1").Range("B3").End(xlDown).Offset(1, 0).Address Worksheets("Feuil1").Range(strNouvelleCellule) = cboRégions.Text End Sub
Corrigé 14.11 Trier un tableau Excel à partir d’une liste déroulante modifiable Private Sub cmdTrier_Click() With Worksheets("Feuil1").Sort .SortFields.Clear .SortFields.Add Key:=Worksheets("Feuil1").Range("B2") .SetRange Worksheets("Feuil1").Range("B2").CurrentRegion .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .Apply End With End Sub
Corrigé 14.12 Utiliser une liste déroulante à deux colonnes et affecter le choix à une plage Excel Sur activation du formulaire : Private Sub UserForm_Activate() Dim strAdresseDernièreRégion As String strAdresseDernièreRégion = _ Worksheets("Feuil1").Range("C3").End(xlDown).Address With cboListeDéroulante2 .ColumnCount = 2 .ColumnHeads = True .RowSource = "B3:" & strAdresseDernièreRégion .ListIndex = 0 End With
End Sub
Code du bouton Valider : Private Sub cmdValider_Click() With Worksheets("Feuil1") .Range("E3:F12").ClearContents .Range("E3") = cboListeDéroulante2C.Column(0, _ cboListeDéroulante2C.ListIndex) .Range("F3") = cboListeDéroulante2C.Column(1, _ cboListeDéroulante2C.ListIndex) End With End Sub
Corrigé 14.13 Utiliser des boutons d’option Private Sub cmdQuitter_Click() Unload Me End Sub --------------------------------------------------- Private Sub optPasDeCafé_Click() lbl2.Caption = "non merci, pas de café" End Sub --------------------------------------------------- Private Sub optSansSucre_Click() lbl2.Caption = "sans sucre" End Sub --------------------------------------------------- Private Sub optSucre_Click() lbl2.Caption = "avec du sucre, svp" End Sub --------------------------------------------------- Private Sub UserForm_Initialize() lbl1.Caption = "Votre café, vous le voulez ?" End Sub
Corrigé 14.14 Utiliser des cases à cocher Initialisation : Private Sub UserForm_Initialize() With Worksheets("Feuil1") chk1.Caption = .Range("E16") chk2.Caption = .Range("E17") chk3.Caption = .Range("E18") With .Range("D16:D18") .Font.Name = "Wingdings 3" .Font.Size = 14 .VerticalAlignment = xlCenter .HorizontalAlignment = xlRight End With End With strChemin = ThisWorkbook.Path & "\Images Sub\" End Sub
Code du bouton Valider : Private Sub cmdValider_Click() With Worksheets("Feuil1") .Range("D16:D18").ClearContents If chk1.Value = True Then .Range("D16") = "a" If chk2.Value = True Then .Range("D17") = "a" If chk3.Value = True Then .Range("D18") = "a" End With End Sub
Code pour les images : Private Sub chk1_Click() If chk1.Value = True Then imgFruit1.Picture = LoadPicture(strChemin & "\Pomme.gif") Else imgFruit1.Picture = LoadPicture("") End If End Sub --------------------------------------------------- Private Sub chk2_Click() If chk2.Value = True Then imgFruit2.Picture = LoadPicture(strChemin & "\Poire.gif") Else imgFruit2.Picture = LoadPicture("") End If End Sub --------------------------------------------------- Private Sub chk3_Click() If chk3.Value = True Then imgFruit3.Picture = LoadPicture(strChemin & "\Banane.gif") Else imgFruit3.Picture = LoadPicture("") End If End Sub
Corrigé 14.15 Intercepter une combinaison de touches Private Sub txt1_KeyUp(ByVal KeyCode As _ MSForms.ReturnInteger, ByVal Shift As Integer) If KeyCode = vbKeyF12 And Shift = 6 Then Call Maintenance End If End Sub Sub Maintenance() MsgBox "Vous avez bien effectué [Ctrl][Alt][F8]" & _ vbCrLf & "Vous êtes passé en mode Maintenance" End Sub
Corrigé 14.16 Utiliser un bouton à bascule
Private Sub tglActiver_Click() For Each ctlControl In Me.Controls If ctlControl.Name "tglActiver" Then ctlControl.Enabled = Not ctlControl.Enabled End If Next ctlControl With tglActiver If .Caption = "Désactiver" Then .Caption = "Activer" Else .Caption = "Désactiver" End If End With End Sub
Corrigé 14.17 Préparer une zone de saisie préremplie et sélectionnée Private Sub UserForm_Initialize() With txt1 .Text = Now() .SelStart = 0 .SelLength = Len(.Text) .SetFocus End With End Sub
Corrigé 14.18 Gérer des images Private strImageChoisie As String -------------------------------------------------- Private Sub cmdAfficheImage_Click() Worksheets("Images").Activate Range("A1").Select ActiveSheet.Pictures.Insert (strImageChoisie) End Sub -------------------------------------------------- Private Sub cmdChargeImages_Click() Dim strImage As String Dim strChemin As String strChemin = ThisWorkbook.Path & "\Images Sub\" ChDir strChemin strImage = Dir("*.jpg") lstImages.Clear Do While strImage "" lstImages.AddItem strImage strImage = Dir() Loop End Sub -------------------------------------------------- Private Sub lstImages_MouseUp(ByVal Button As Integer, _ ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) With Me.lstImages
strImageChoisie = .List(.ListIndex) imgImage.Picture = LoadPicture(strImageChoisie) End With End Sub
Introduction Durée : 1 heure 30 Mots-clés liaison, incorporation, OLE, propriété, méthode, verbe, classe, icône Objectifs Enrichir son application avec des ressources externes. Exploiter les possibilités des autres applications Microsoft dans Excel. Distinguer objet incorporé et objet lié.
Prérequis Pour valider les prérequis nécessaires, avant d’aborder le TP, répondez aux questions ci-après (certaines questions peuvent nécessiter plusieurs réponses) : 1 . 2 . 3 .
La collection OLEObjects contient tous les objets OLE : a. d’un formulaire. b. d’un classeur. c. d’une feuille de calcul. Sont des méthodes de la collection OLEObjects : a. Activate b. Add c. Select L’argument pour indiquer le fichier à utiliser lors de la création d’un objet OLE est : a. FileName b. ClassType c. Link
4 . 5 . 6 .
Lors de la création d’un objet OLE, si l’argument ClassType est spécifié, les arguments suivants sont ignorés : a. FileName b. IconFileName c. Link L’argument IconFileName de la méthode Add permet d’afficher une icône pour représenter l’objet OLE si l’argument DisplayAsIcon a la valeur : a. True b. False Méthode pour déclencher une action de la part du serveur de l’objet OLE : a. b. c.
Run Execute Verb
Note Pour réaliser les exercices, ouvrez le classeur Objets Liés Incorporés.xlsm fourni en téléchargement. Le dossier contenant ce classeur possède un sous-dossier Ressources Projet. Le sous-dossier Ressources Projet contient toutes les ressources indispensables à la réalisation des exercices proposés : photo, vidéos, texte. Ressources :
Deux vidéos : Danse du feu.wmv et Paysage Polynésien.wmv
Une photo : Paradis.jpg
Un document Word : Animaux.docx
Énoncé 15.1 Incorporer une image ou une photo Durée estimative : 15 minutes Paradis.jpg
Ouvrez un nouveau classeur. Créez la procédure PhotoIncorporée qui incorpore cette photo (Paradis.jpg dans le dossier Ressources Projet) d’un petit coin de paradis dans la feuille Feuil1. Pour le coin supérieur gauche, prenez la cellule B2 pour positionner la photo.
Énoncé 15.2 Incorporer WordPad dans Excel Durée estimative : 10 minutes Créez la procédure IncorporeWordPad qui incorpore le traitement de texte WordPad dans une feuille de calcul Excel. Pour le coin supérieur gauche de l’objet OLE, prenez la cellule B13. Exemple :
Note Pour obtenir l’image de l’icône de WordPad, vous devez indiquer où se trouve l’application. Lancez ou effectuez vous-même une recherche puis consultez les propriétés de l’application. Il ne vous reste plus qu’à copier le chemin et à l’insérer dans le code.
Énoncé 15.3 Incorporer un document Word dans Excel Durée estimative : 10 minutes Disposez de toute la puissance du traitement de texte de Microsoft Word dans une feuille de calcul Excel. Créez la procédure IncorporeWord qui réalise cette action. Pour le coin supérieur gauche de l’objet OLE, prenez la cellule B19. Résultat :
Note Ce document étant incorporé dans Excel, il n’est pas visible à l’extérieur de celui-ci.
Énoncé 15.4 Lier un document externe à Excel Durée estimative : 10 minutes Document Word Animaux.docx
Créez la procédure DocumentWordLié qui ouvre à partir d’Excel un document Word externe. Pour le coin supérieur gauche de l’objet OLE, prenez la cellule B25.
Note Le document est externe à Excel et visible par les autres applications. Celui-ci peut être modifié de manière interne ou externe.
Énoncé 15.5 Incorporer une vidéo Durée estimative : 10 minutes Pour cet exercice, utilisez la séquence vidéo Danse du feu.wmv.
Créez la procédure VidéoIncorporée qui incorpore une vidéo à Excel avec une simple représentation sous forme d’icône. Un double clic sur l’icône déclenche la séquence vidéo. Pour le coin supérieur gauche de l’objet OLE, prenez la cellule E2.
Énoncé 15.6 Lier une vidéo Durée estimative : 10 minutes Utilisez pour cet exercice la séquence vidéo Paysage Polynésien.wmv.
Créez la procédure VidéoLiée qui lie une vidéo à Excel avec présentation de la première image. Un double clic sur l’image déclenche la séquence vidéo. Pour le coin supérieur gauche de l’objet OLE, prenez la cellule E8.
Énoncé 15.7 Créer un menu pour les objets liés ou incorporés Durée estimative : 25 minutes Formulaire frmMenu
Vous disposez du formulaire frmMenu. Créez la procédure Menu qui affiche ce formulaire. Le fait de cliquer sur les boutons lance les vidéos ou présente le document Word sur les animaux.
Prérequis 1. 2. 3. 4. 5. 6.
c. b. et c. a. a. et c. a. c.
Corrigé 15.1 Incorporer une image ou une photo Dans la partie déclaration : Private strChemin As String
Procédure commune pour le chemin : Sub CheminRessources() strChemin = ThisWorkbook.Path & "\Ressources Projet\" End Sub
Commentaire Le chemin indiqué ici précise que les ressources (photos, vidéos) sont dans le sousdossier Ressources Projet. Code pour incorporer la photo : Sub PhotoIncorporée() Call CheminRessources With Worksheets(1) .Range("B2").Select .OLEObjects.Add Filename:=strChemin & "Paradis.jpg", _ Link:=False End With End Sub
Corrigé 15.2 Incorporer WordPad dans Excel Sub IncorporeWordPad() Dim strCheminWordPad As String '==================================================== ' La valeur de la variable strCheminWordPad ' doit être adaptée à votre installation '==================================================== strCheminWordPad = "C:\Windows\WinSxS\wow64_microsoft-windows-wordpad_ 31bf3856ad364e35_10.0.19041.1_none_ee00310940a3cd37\wordpad.exe" Worksheets(1).Range("B13").Select Worksheets(1).OLEObjects. _ Add(ClassType:="Wordpad.Document.1", _ DisplayAsIcon:=True, IconFileName:=strCheminWordPad, _ IconIndex:=0, IconLabel:="Document WordPad").Activate End Sub
Corrigé 15.3 Incorporer un document Word dans Excel Sub IncorporeWord( Dim strCheminWord As String '==================================================== ' La valeur de la variable strCheminWord ' doit être adaptée à votre installation '==================================================== strCheminWord = "C:\Program Files (x86)\Microsoft Office\root\Office16\ WINWORD.EXE" Worksheets(1).Range("B19").Select Worksheets(1).OLEObjects.Add(ClassType:="Word.Document", _ DisplayAsIcon:=True, _ IconFileName:=strCheminWord, _ IconIndex:=1, IconLabel:="Microsoft Word").Activate End Sub
Corrigé 15.4 Lier un document externe à Excel Sub DocumentWordLié() Dim strCheminWord As String
'==================================================== ' La valeur de la variable strCheminWord ' doit être adaptée à votre installation '==================================================== strCheminWord = "C:\Program Files (x86)\Microsoft Office\root\Office16\ WINWORD.EXE" Call CheminRessources On Error GoTo SortieErreur Worksheets(1).Range("B25").Select '==================================================================== Worksheets(1).OLEObjects.Add(Filename:=strChemin & "Animaux.docx", _ DisplayAsIcon:=True, IconFileName:=strCheminWord, Link:=True, IconIndex:=0, IconLabel:="Document Word Externe Lié").Activate '=========================================================== Worksheets(1).Range("J2") = Selection.Name Exit Sub SortieErreur: MsgBox "Vérifier le chemin de l'icône" End Sub
Corrigé 15.5 Incorporer une vidéo Sub VidéoIncorporée() Call CheminRessources Worksheets(1).Range("E2").Select ActiveSheet.OLEObjects.Add(Filename:= _ strChemin & "Danse du feu.wmv", Link:=False, _ DisplayAsIcon:=True, IconFileName:=" C:\Program Files\VideoLAN\VLC", _ IconIndex:=0, IconLabel:="Danse du feu").Select Selection.Verb End Sub
Corrigé 15.6 Lier une vidéo Sub VidéoLiée() Call CheminRessources Worksheets(1).Range("E8").Select ActiveSheet.OLEObjects.Add(Filename:= _ strChemin & "Paysage Polynésien.wmv", Link:=True, _ DisplayAsIcon:=False).Select Selection.Verb End Sub
Corrigé 15.7 Créer un menu pour les objets liés ou incorporés Code pour afficher le formulaire : Sub Menu() frmMenu.Show End Sub
Code des événements Click des étiquettes de la UserForm frmMenu : Private Sub lblDanseFeu_Click() Call VidéoIncorporée End Sub Private Sub lbllLecture_Click() Call DocumentWordLié End Sub Private Sub lblPaysage_Click() Call VidéoLiée End Sub
Introduction Durée : 2 heures 45 Mots-clés référence, bibliothèque, classe, SGBDR, table, enregistrement, requête, SQL, ADO, ODBC, connexion, Access, Word, Outlook Objectifs Piloter des applications Microsoft depuis Excel et échanger des données.
Prérequis
Pour valider les prérequis nécessaires, avant d’aborder le TP, répondez aux questions ci-après (certaines questions peuvent nécessiter plusieurs réponses) : 1. Le mot-clé Set permet : a. d’affecter une référence d’objet à une variable déclarée de type Object. b. de créer une copie de l’objet. 2. Le mot-clé Nothing permet : a. de prévenir qu’une variable objet n’a pas été déclarée. b. de libérer les ressources mémoire et système associées à un objet. 3. Types d’objets permettant de déclarer des variables objets en référence aux applications Microsoft : a. Word.Application b. Outlook.Application c. Access.Application d. MSAccess.Application 4. Fonction pour accéder à un objet Automation à partir d’un projet VBA : a. GetObject b. Activate c. Select 5. Pour ajouter un nouveau document Word, il faut utiliser la collection : a. Documents b. Workbooks c. Document 6. La méthode CreateItem crée : a. une nouvelle page Word. b. un nouvel élément Outlook. c. un nouveau titre d’onglet pour une feuille Excel. 7. Un objet QueryTable est un objet : a. Access b. Word c. Excel 8. La méthode Add pour créer une table de requêtes QueryTable a besoin obligatoirement des paramètres suivants : a. Connection b. Destination c. SQL 9. Les chaînes de connexion OLE DB ou ODBC sont de type : a. Byte b. Double
10 . 11 . 12 .
c. String SQL permet à Excel : a. de se connecter à une base de données. b. d’extraire des données d’une base selon des critères précisés. Affectation à une variable d’une connexion avec le modèle d’accès aux données ADO : a. Set strConnexion = ADODB b. Set strConnexion = New ADODB.Connection c. Set strConnexion = Connection L’objet Recordset peut représenter : a. tous les enregistrements d’une table d’une base de données. b. un jeu d’enregistrements résultant d’une requête SQL.
Note Avant de réaliser les exercices, enregistrez un classeur Excel (classeur prenant en charge les macros) nommé Collaboration avec les Applications MS.xlsm. Effectuez vos exercices à partir de ce classeur. Le sous-dossier Ressources contient toutes les ressources indispensables à la réalisation des exercices proposés :
Une base de données : BDClients.accdb
Un document Word servant d’exemple : Bilan.docx
Enfin, référencez au préalable la bibliothèque de Microsoft Word Microsoft 365 (Outils - Références).
Énoncé 16.1 Lancer Word Durée estimative : 10 minutes Créez la procédure LancementWord qui lance Word à partir d’Excel. Note Aucun document n’est proposé à l’ouverture de Word. Indice Pensez à libérer la mémoire. Pour cela, en fin de procédure, affectez la valeur Nothing aux variables objets.
Énoncé 16.2 Créer un document Word
Durée estimative : 20 minutes Bilan.docx
Créez la procédure CréerDocWord qui crée un document Word BilanCréé.docx à partir d’Excel. Reproduire l’exemple fourni dans le document Bilan.docx. Société FMP Indice À l’ouverture un document Word ne dispose que d’une section. Format Word piloté depuis Excel :
Titre : centré
Style de police : gras
Taille de police : 20
Énoncé 16.3 Ouvrir un document Word Durée estimative : 10 minutes Refermez avec le menu Word le document Bilan.docx. Créez ensuite la procédure OuvrirDocWord qui ouvre ce document depuis Excel. Indice Pensez à l’extension .docx pour l’ouverture du document.
Énoncé 16.4 Modifier un document Word Durée estimative : 15 minutes
Créez la procédure ModifierDocWord qui modifie le document Bilan.docx en insérant une nouvelle ligne. Exemple : Société FMP Ceci est la suite
Énoncé 16.5 Lancer Outlook Durée estimative : 10 minutes Créez la procédure LancementOutlook qui lance Outlook depuis Excel. Référencez au préalable la bibliothèque de Microsoft Outlook (Outils - Références).
Énoncé 16.6 Envoyer un mail avec Outlook
Durée estimative : 15 minutes Créez la procédure EnvoiMail qui envoie un e-mail directement depuis Excel en pilotant Outlook Office 365.
Note Selon votre version de Windows et les protections installées, vous aurez à confirmer l’envoi.
Énoncé 16.7 Lancer Access Durée estimative : 5 minutes Créez la procédure LancementAccess qui lance Access à partir d’Excel. Note Référencez au préalable la bibliothèque de Microsoft Access (Outils - Références).
Énoncé 16.8 Créer une base de données Access Durée estimative : 10 minutes Créez la procédure CréationBDAccess qui crée une base de données Access nommée NouvelleBD.accdb à partir d’Excel.
Énoncé 16.9 Importer une table entière Access (avec QueryTables) Durée estimative : 15 minutes BDClients.accdb
Créez la procédure ImportEnrBDdansExcel qui importe dans une feuille Excel uniquement les données de la table Clients de la base BDClients. Créez ensuite un bouton qui met à jour les données externes. Exemple :
Note Des connaissances élémentaires du langage de requêtes SQL sont nécessaires.
Énoncé 16.10 Importer certains champs d’une table Access (avec ADO)
Durée estimative : 20 minutes Créez la procédure ImportEnrBDADOdansExcel qui effectue la même importation mais en utilisant les bibliothèques ADO de Microsoft. Note Référencez au préalable la bibliothèque des objets ADO (Outils - Références).
Énoncé 16.11 Importer certains enregistrements d’une table Access Durée estimative : 10 minutes À partir de la table Clients de la base de données BDClients.accdb, créez la procédure ImportSQLA qui importe uniquement le(s) enregistrement(s) pour le(s) client(s) dont le nom est Durand. Créez ensuite un bouton qui met à jour les données externes. Exemple :
Énoncé 16.12 Importer certains enregistrements de plusieurs tables Access Durée estimative : 10 minutes À partir de la base de données BDClients.accdb, créez la procédure ImportSQLB qui importe la liste des clients ayant passé une commande pour plus de 1000 Euros avec la date et le montant de celle-ci. Créez ensuite un bouton qui met à jour les données externes. Exemple :
Énoncé 16.13 Importer les enregistrements d’une base de données en utilisant une liaison ODBC Durée estimative : 15 minutes Aide ODBC.pdf
Créez la procédure ConnexionODBC qui importe tous les enregistrements de la table Commandes en utilisant une liaison ODBC. Prenez pour faciliter les tests le pilote du SGBDR Access. Créez ensuite un bouton qui met à jour les données externes. Indice Une QueryTable doit être créée avec deux arguments obligatoires, Connection et Destination.
Prérequis 1. 2. 3. 4. 5. 6. 7. 8. 9.
a. b. a., b. et c. a. a. b. c. a. et b. c.
10. 11. 12.
b. b. a. et b.
Corrigé 16.1 Lancer Word Sub LancementWord() Dim wd As Word.Application Set wd = New Word.Application wd.Visible = True Set wd = Nothing End Sub
Commentaire Le mot-clé New est utilisé pour créer une nouvelle instance de la classe.
Corrigé 16.2 Créer un document Word Partie Déclarations : Private strChemin As String
Code pour le chemin : Sub Chemin() strchemin = ThisWorkbook.Path & "\Ressources\" End Sub
Code pour créer un document Word : Sub CréerDocWord() Dim wd As Word.Application Dim docWord As Word.Document Call Chemin Set wd = New Word.Application Set docWord = wd.Documents.Add With docWord.Sections(1).Range .Text = "Société FMP" & Chr(10) .Font.Bold = True .Font.Size = 20 .ParagraphFormat.Alignment = wdAlignParagraphCenter End With With docWord
.SaveAs (strchemin & "Bilancréé.docx") .Close savechanges:=wdDoNotSaveChanges End With wd.Quit Set docWord = Nothing Set wd = Nothing MsgBox strchemin & "Bilancréé.docx a été créé" End Sub
Note N’oubliez pas de libérer la mémoire. Pour cela, affectez la valeur Nothing aux variables objets.
Corrigé 16.3 Ouvrir un document Word Sub OuvrirDocWord() Dim wd As Word.Application Call Chemin Set wd = New Word.Application With wd .Visible = True .Documents.Open Filename:=strchemin & "Bilan.docx" End With Set wd = Nothing End Sub
Corrigé 16.4 Modifier un document Word Sub ModifierDocWord() Dim wd As Word.Application Call Chemin Set wd = New Word.Application With wd .Visible = True .Documents.Open Filename:=strchemin & "Bilan.docx" .ActiveDocument.Paragraphs(1).Range. _ InsertAfter "Ceci est la suite." End With Set wd = Nothing End Sub
Corrigé 16.5 Lancer Outlook Sub LancementOutlook() Dim ol As Outlook.Application Set ol = New Outlook.Application Set ol = Nothing End Sub
Note Une occurrence d’Outlook est créée mais n’est pas visible.
Corrigé 16.6 Envoyer un mail avec Outlook Sub EnvoiMail() Dim strMail As String Dim ol As Outlook.Application Dim olMessage As Outlook.MailItem Set ol = New Outlook.Application Set olMessage = ol.CreateItem(olMailItem) On Error GoTo SortieErreur strMail = InputBox("Saisir l'adresse e-mail") If strMail "" Then With olMessage .To = strMail .Subject = "Résultat du Loto" .Body = "Bravo, vous avez gagné le gros lot" .Importance = olImportanceHigh .Send End With Else MsgBox "L'adresse e-mail n'a pas été saisie" End If SortieErreur: Set ol = Nothing End Sub
Corrigé 16.7 Lancer Access Sub LancementAccess() Dim ac As Access.Application Set ac = New Access.Application Set ac = Nothing End Sub
Note
Une occurrence d’Access est créée mais n’est pas visible. Dans la pratique, la création d’une instance d’Access est peu utilisée. On préfère en général utiliser le moteur Jet grâce à la technique ADO (cf. ci-après).
Corrigé 16.8 Créer une base de données Access Sub CréationBDAccess() Dim strDB As String Dim ac As Access.Application Call Chemin strDB = strchemin & "NouvelleBD.accdb" Set ac = New Access.Application ac.NewCurrentDatabase strDB ac.CloseCurrentDatabase Set ac = Nothing MsgBox "NouvelleBD.accdb a été créée" End Sub
Corrigé 16.9 Importer une table entière Access (avec QueryTables) Code de l’importation : Sub ImportEnrBDdansExcel() Dim qtRésultatRequête As QueryTable Dim strSQL As String Dim strConnexion As String Call Chemin '========================================================= strSQL = "Select * From Clients" strConnexion = "OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;" _ & "Data Source=" & strchemin & "BDClients.accdb" '========================================================= With ActiveSheet.QueryTables. _ Add(Connection:=strConnexion, _ Destination:=Range("E2"), Sql:=strSQL) .Refresh End With MsgBox "Requête " & strSQL & " effectuée" End Sub
Note
La valeur de l’argument Provider dépend de votre version d’Access.
Corrigé 16.10 Importer certains champs d’une table Access (avec ADO) Sub ImportEnrBDADOdansExcel() Dim cn As ADODB.Connection Dim rs As New ADODB.Recordset Dim intLigneExcel As Integer Dim strCheminBase As String Call Chemin ' Connexion à la base de données Comptoir.mdb Set cn = New ADODB.Connection Set rs = New ADODB.Recordset With cn .Provider = "Microsoft.ACE.OLEDB.12.0" .Open strchemin & "BDClients.accdb" ' N'oubliez pas l'extension End With intLigneExcel = 2 With rs .ActiveConnection = cn .CursorType = adOpenForwardOnly .LockType = adLockOptimistic .Open ("Clients") Range("A1").Value = "N°" Range("B1").Value = "Nom" Range("C1").Value = "Prénom" Do While Not .EOF Cells(intLigneExcel, 1).Value = .Fields("Numéro").Value Cells(intLigneExcel, 2).Value = .Fields("Nom").Value Cells(intLigneExcel, 3).Value = .Fields("Prénom").Value .MoveNext intLigneExcel = intLigneExcel + 1 Loop End With rs.Close ' Fermeture de la connexion cn.Close Set rs = Nothing Set cn = Nothing MsgBox "Requête ADO effectuée" End Sub
Corrigé 16.11 Importer certains enregistrements d’une table Access
Seule la requête SQL change. Pour le reste, la procédure ImportSQLA est identique à celle du corrigé 16.9 (ImportEnrBDdansExcel). '=================================================================== strSQL = "Select Numéro, Nom, Prénom From Clients 'Where Nom Like Durand'" '===================================================================
Corrigé 16.12 Importer certains enregistrements de plusieurs tables Access Seule la requête SQL change. Pour le reste, la procédure ImportSQLB est identique à celle du corrigé 16.9 (ImportEnrBDdansExcel).
'======================================================== strSQL = "Select Clients.Numéro, Clients.Nom," _ & "Clients.Prénom, Commandes.Montant, Commandes.Date" _ & " From Clients, Commandes" _ & " Where Clients.Numéro = Commandes.NuméroClient" _ & " And Commandes.Montant > 1000" '========================================================
Corrigé 16.13 Importer les enregistrements d’une base de données en utilisant une liaison ODBC Sub ConnexionODBC() Dim qt As QueryTable Dim strSQL As String Dim strConnexion As String Call Chemin strSQL = "SELECT * FROM Commandes" strConnexion = "ODBC;DSN=MS Access Database;DBQ=" & strchemin _ & "\BDClients.accdb;" Set qt = ActiveSheet.QueryTables.Add( _ Connection:=strConnexion, Destination:=Range("$A$15")) With qt .CommandText = strSQL .Refresh End With Range("G27:G31").NumberFormat = "dd/mm/yy;@" End Sub
Introduction Durée : 1 heure 20 Mots-clés page statique, page dynamique, actualiser, Excel, publication Web Objectifs Investir le domaine du Web en créant des documents web statiques ou dynamiques à partir des documents Excel.
Prérequis Pour valider les prérequis nécessaires, avant d’aborder le TP, répondez aux questions ci-après : 1 . 2 . 3 . 4
Paramètre et type de données pour enregistrer un classeur Excel au format HTML : a. Filename := xlHtml b. FileFormat:=xlHtml c. FileFormat:=xlXMLSpreadsheet Objet pour représenter un classeur Excel ou un élément du classeur qui a été enregistré dans une page web et qui peut être actualisé : a. Publish b. Object c. PublishObject Argument de la méthode Add qui précise quel élément du classeur Excel est enregistré en une page web : a. SourceType b. FileName c. DivID Lorsque le fichier HTML existe, la méthode Publish avec la valeur False :
. 5 .
a. remplace le fichier HTML. b. insère le ou les éléments à la fin du fichier HTML. Argument de la méthode Add qui spécifie si un élément est enregistré en tant que composant Microsoft Office Web interactif ou en tant que texte et images statiques : a. SourceType b. Source c. HtmlType
Énoncé 17.1 Créer une page web statique à partir d’un classeur Excel Durée estimative : 15 minutes Classeurs Excel Web.xlsm et Exemple.xlsx
Ouvrez le classeur Web.xlsm. À partir de celui-ci, créez la procédure WebStatique1 qui ouvre le classeur Exemple.xlsx situé dans le sous-dossier \Ressources\Web Statique\ et l’enregistre en tant que page web sous le nom Classeur Web Statique 1.htm.
Note
Le classeur ne doit pas être protégé. Dans le cas contraire, VBA vous informe du problème.
Énoncé 17.2 Créer une page web statique à partir d’un classeur Excel chargé en mémoire Durée estimative : 5 minutes À partir du classeur Web.xlsm, créez la procédure WebStatique2 qui crée un nouveau classeur puis l’enregistre en page HTML. Note Pour les exercices qui suivent, nous continuerons à utiliser le classeur Web.xlsm.
Énoncé 17.3 Afficher la boîte de dialogue "Publier en tant que page web" Durée estimative : 5 minutes
Le classeur Web.xlsm comporte quatre éléments qui ont déjà été publiés. Pour les voir, vous devez afficher la boîte de dialogue intégrée Publier en tant que page web. Créez la procédure PublieBoite qui affiche cette boîte de dialogue. Ajoutez à la première feuille du classeur un bouton qui fait appel à cette procédure.
Note Cliquez sur Parcourir pour mettre à jour le chemin du fichier .htm, en fonction de l’arborescence de votre disque dur. Rappel de la structure des dossiers à créer :
Ne cochez pas le bouton Republier automatiquement…. Cette option peut être contraignante car de multiples sauvegardes intermédiaires peuvent être nécessaires pendant les modifications. Nous gérerons par programmation la publication.
Énoncé 17.4 Publier le classeur Durée estimative : 5 minutes Créez la procédure PublieMAJ_Classeur qui met à jour le classeur publié en tant que page web. Testez la procédure en suivant les étapes suivantes :
1. Faites Fichier - Enregistrer sous… et choisissez Type : Page Web (*.htm, *.html). Cochez le bouton Classeur entier puis cliquez sur le bouton Modifier le 2. titre. 3. Saisissez ClasseurWeb comme titre. 4. Cliquez sur le bouton Publier. Dans la nouvelle boîte de dialogue, décochez la case Republier 5. automatiquement.... 6. Cliquez sur le bouton Publier. 7. Effectuez des modifications sur les différentes feuilles. 8. Enregistrez le classeur. 9. Lancez la procédure PublieMAJ_Classeur. 10 Vérifiez dans votre navigateur Internet que les mises à jour ont bien été . effectuées sur la page web (appuyez sur [F5] pour l’actualiser).
Énoncé 17.5 Publier une feuille du classeur Durée estimative : 5 minutes Créez la procédure PublieMAJ_Feuille qui met à jour la page web liée à la première feuille du classeur. Pour tester la procédure, procédez comme précédemment, en donnant comme titre PageExcelWeb.
Énoncé 17.6 Publier une plage de données d’une feuille du classeur Durée estimative : 5 minutes La première feuille comporte deux tableaux. Créez la procédure PublieMAJ_PlagePiscine qui publie le tableau correspondant à la plage de données Piscine. Testez la procédure.
Énoncé 17.7 Mettre à jour toutes les pages web Durée estimative : 5 minutes À ce stade, trois pages web sont présentes. La première est liée au classeur, la deuxième à la première feuille de ce classeur et la troisième à la plage de données du tableau Piscine. Créez la procédure PublieMAJBoucle qui met à jour en même temps ces trois pages web. Testez la procédure. N’oubliez pas d’appuyer sur la touche [F5] pour réactualiser l’affichage. Indice Utilisez la boucle For Each.
Énoncé 17.8 Mettre à jour toutes les pages web selon certains critères Durée estimative : 5 minutes Créez la procédure PublieMAJBoucle_LesPlages qui met à jour uniquement les pages web qui correspondent à des plages de données publiées du classeur.
Indice La propriété SourceType de l’objet à publier pour spécifier une plage de données est xlSourceRange.
Énoncé 17.9 Ajouter un lien hypertexte à une cellule Durée estimative : 10 minutes Créez la procédure LienInternet qui ajoute à la cellule E29 un lien hypertexte vers le site des Éditions ENI (http://www.editions-eni.fr/).
Énoncé 17.10 Extraire une information d’une page web Durée estimative : 20 minutes Créez la procédure ExtraireCours qui extrait un cours de bourse, mis à jour en temps réel, sur une page web. On choisit la page web suivante : https://www.boursorama.com/cours/1rPRAL/ Les principaux navigateurs permettent d’examiner le code source d’un élément de la page (par exemple, clic droit sur l’élément pour Mozilla Firefox). On obtient une information du type : 5.69
qui permet de déterminer le nom de la classe de l’information. On référence les bibliothèques « Microsoft HTML Object Library » et « Microsoft Internet Controls ». Indice La méthode getElementsByClassName renvoie une collection d’informations ayant toutes le même nom de classe. Un essai sera donc nécessaire au préalable pour déterminer la position de l’information recherchée.
Prérequis 1. 2. 3. 4. 5.
b. c. a. b. c.
Corrigé 17.1 Créer une page web statique à partir d’un classeur Excel Dans la partie déclaration : Private strChemin As String
Code du chemin du dossier qui contient le classeur Excel : Sub Chemin() strChemin = ActiveWorkbook.Path End Sub
Code pour obtenir un document HTML : Sub WebStatique1() Dim strCheminRessources As String Call Chemin strCheminRessources = strChemin & _
"\Ressources\Web Statique\" ' ouverture du classeur à transformer en page html Workbooks.Open Filename:=strCheminRessources _ & "\Exemple.xlsx" ActiveWorkbook.SaveAs Filename:=strCheminRessources _ & "Classeur Web Statique 1.htm", _ FileFormat:=xlHtml MsgBox "Classeur " & ActiveWorkbook.Name & " enregistré." ActiveWorkbook.Close savechanges:=False End Sub
Note Les chemins correspondent à l’organisation des dossiers sur le disque dur. Un clic droit sur le tableau du document HTML permet d’exporter les données vers un classeur Excel.
Corrigé 17.2 Créer une page web statique à partir d’un classeur Excel chargé en mémoire Sub WebStatique2() Dim strCheminRessources As String Call Chemin strCheminRessources = strChemin & _ "\Ressources\Web Statique\" Workbooks.Add ActiveWorkbook.SaveAs Filename:=strCheminRessources _ & "Classeur Web Statique 2", _ FileFormat:=xlHtml ActiveWorkbook.Close savechanges:=False End Sub
Corrigé 17.3 Afficher la boîte de dialogue "Publier en tant que page web" Public Sub PublieBoite() Application.Dialogs(xlDialogPublishAsWebPage).Show
End Sub
Corrigé 17.4 Publier le classeur Public Sub PublieMAJ_Classeur() Dim po As PublishObject With ActiveWorkbook For Each po In .PublishObjects If po.Title = "ClasseurWeb" Then po.Publish MsgBox "Classeur " & ActiveWorkbook.Name & " republié" Exit For End If Next po End With End Sub
Corrigé 17.5 Publier une feuille du classeur Public Sub PublieMAJ_Feuille() Dim po As PublishObject With ActiveWorkbook For Each po In .PublishObjects If po.Title = "PageExcelWeb" Then po.Publish MsgBox "première feuille republiée" Exit For End If Next po End With End Sub
Corrigé 17.6 Publier une plage de données d’une feuille du classeur Public Sub PublieMAJ_PlagePiscine() Dim po As PublishObject With ActiveWorkbook For Each po In .PublishObjects If po.Title = "Piscine" Then po.Publish MsgBox "Plage Piscine republiée"
End
End Sub
Exit For End If Next po With
Corrigé 17.7 Mettre à jour toutes les pages web Public Sub PublieMAJBoucle() Dim po As PublishObject With ActiveWorkbook For Each po In .PublishObjects po.Publish Next po End With MsgBox "Republications effectuées..." End Sub
Corrigé 17.8 Mettre à jour toutes les pages web selon certains critères Public Sub PublieMAJBoucle_LesPlages() Dim po As PublishObject With ActiveWorkbook For Each po In .PublishObjects If po.SourceType = xlSourceRange Then po.Publish End If Next po End With MsgBox "Plage de données republiées" End Sub
Corrigé 17.9 Ajouter un lien hypertexte à une cellule Sub LienInternet()
End
ActiveSheet.Hyperlinks.Add Anchor:=Range("E29"), Address:= _ "http://www.editions-eni.fr/", _ TextToDisplay:="Editions ENI" Sub
Corrigé 17.10 Extraire une information d’une page web Sub ExtraireCours() '=============================================================== ' Référencement des bibliothèques Microsoft Internet Controls ' et Microsoft HTML Object Library '=============================================================== Dim IE As SHDocVw.InternetExplorer Dim laPage As HTMLDocument Dim contenu As IHTMLElementCollection Dim article As IHTMLElement Set IE = CreateObject("InternetExplorer.Application") With IE .navigate "https://www.boursorama.com/cours/1rPRAL/" WaitIE IE Set laPage = .document Set contenu = laPage.getElementsByClassName("c-instrument c-instrument--last") '========================================= ' Code pour tester l'emplacement ' de l'information recherchée ' Note : Les index commencent à 0 '========================================= ' For Each article In contenu ' Debug.Print article.outerText ' Next article '========================================= .Quit End With MsgBox contenu(9).outerText Set IE = Nothing End Sub Sub WaitIE(IE As SHDocVw.InternetExplorer) 'On boucle tant que la page n'est pas totalement chargée Do Until IE.readyState = READYSTATE_COMPLETE DoEvents Loop End Sub
Introduction
Durée : 1h30 Mots-clés fichier, dossier, dictionnaire, unité logique, FileSystemObject, fichier texte Objectifs Poursuivre la démarche systématique d’utilisation des objets par VBA en fonction d’un nouveau besoin. Dans ce chapitre, on laisse volontairement de côté les instructions natives de VBA concernant la gestion des fichiers (Kill, Open…) pour traiter le problème avec la bibliothèque d’objets adéquate.
Prérequis Pour valider les prérequis nécessaires, avant d’aborder le TP, répondez aux questions ci-après : 1 . 2 . 3 . 4 .
L’objet racine de la bibliothèque permettant la gestion des fichiers sous forme d’objets est : a. FileList b. FileSearch c. FileSystemObject Pour utiliser les objets de gestion du système de fichiers, il faut référencer dans VBA la bibliothèque : a. Microsoft Scripting RunTime b. Microsoft File System Library c. Microsoft System Object Le ou les objets suivants sont accessibles dans la bibliothèque de gestion des fichiers : a. File b. SubFolder c. TextFile d. BinaryFile En programmation VBA, le nom de la bibliothèque des objets de gestion du système de fichiers apparaît comme : a. FileSystemObject b. Scripting c. Files d. Rien de tout ça.
5 . 6 . 7 .
Dans la bibliothèque d’objets, l’objet représentant une unité logique (un disque, une clé USB, un DVD..) est : a. Disk b. Unit c. Device d. Drive Dans la bibliothèque d’objets, l’objet SubFolder :
a. N’existe pas b. Représente un sous-dossier d’un dossier existant. c. Représente l’un des dossiers attachés à la racine d’une unité logique. Dans l’utilisation de la bibliothèque des objets de gestion des fichiers, les opérations de lecture/écriture d’un fichier texte s’effectuent de la manière suivante : a. Avec l’objet TextStream b. Avec l’objet TextFile c. Ces opérations sont impossibles car le système ne traite pas le contenu des fichiers.
Énoncé 18.1 Gérer et utiliser les unités logiques Durée estimative : 15 minutes Listez, dans la procédure ListeUnitésLogiques, l’ensemble des unités logiques du système, avec pour chacune d’entre elles ses caractéristiques. Les résultats seront présentés dans une feuille Excel dédiée, sous forme d’un tableau comme dans l’exemple ci-dessous :
Indice Utilisez les propriétés DriveLetter, DriveType, FileSystem, AvailableSpace, IsReady.
Énoncé 18.2 Créer, gérer et supprimer les dossiers et les sous-dossiers Durée estimative : 15 minutes Classeur Excel GestionFichiers.xlsx
La feuille Pays contient un tableau, commençant en cellule A1, où chaque colonne représente un continent. Le nom du continent se trouve dans la 1 ère cellule de la colonne. Les cellules du dessous contiennent chacune le nom d’un pays du continent. Créez la procédure CréerMonde qui génère une arborescence de dossiers et sousdossiers (un dossier par continent puis un sous-dossier pour chaque pays). Les dossiers des continents seront placés dans un dossier maître nommé Monde, luimême créé en tant que sous-dossier du dossier contenant le fichier Excel GestionFichiers.xlsx.
Énoncé 18.3 Copier, déplacer et supprimer les fichiers Durée estimative : 20 minutes Créez la procédure CopieDéplace qui effectue les manipulations suivantes : 1 Copiez, dans le dossier CopieRessources, les fichiers situés dans le . dossier Ressources, lui-même sous-dossier du dossier contenant le fichier Excel GestionFichiers.xlsx. 2 Renommez les fichiers du dossier CopieRessources en leur ajoutant les . trois lettres "BIS" à la fin de chaque nom de fichier. 3 Déplacez ces fichiers "BIS" du dossier CopieRessources vers le dossier . Ressources. 4 Listez les fichiers du dossier Ressources. . 5 Effacez les fichiers "BIS" du dossier Ressources. .
Énoncé 18.4 Créer et utiliser un fichier texte Durée estimative : 20 minutes Fichier texte English.ini.
Analysez le fichier de configuration English.ini dont la structure est la suivante :
Le fichier est divisé en sections (libellés entre […]). Chaque section contient des lignes avec une syntaxe paramètre = valeur. Créez la procédure AnalyseINI qui construit, à partir du fichier de données English.ini, dans une feuille Excel BddINI une base de données sous forme d’une table à trois colonnes : Section, Paramètre, Valeur suivant le modèle ci-dessous :
Énoncé 18.5 Créer et utiliser un dictionnaire Durée estimative : 20 minutes Le but de l’exercice est de construire un dictionnaire de traduction des fonctions Excel du français vers l’anglais. Dans la UserForm frmFonctionsExcel, effectuez les traitements suivants :
Programmez l’événement Initialize de la UserForm pour créer un objet Dictionary dont les couples (clé-valeur) sont disponibles dans la feuille FonctionsExcel. Dans la même procédure, garnissez la zone de liste lstFonctions avec les fonctions Excel en français (colonne A).
Programmez l’événement Click de cette même zone de liste pour déclencher l’affichage de la fonction traduite en anglais dans le libellé lblFonctionAnglais.
Exemple de résultat :
Prérequis 1. 2. 3. 4. 5. 6. 7.
c. a. a. d. a. b. c.
Corrigé 18.1 Gérer et utiliser les unités logiques Sub ListeUnitésLogiques() Dim fso As Scripting.FileSystemObject Dim intLigne As Integer Dim drvUnité As Scripting.Drive ' Instanciation de l'objet FileSystemObject Set fso = New Scripting.FileSystemObject With Worksheets("Unités") .Range("A1").CurrentRegion.Offset(1, 0).ClearContents intLigne = 2 ' Balayage de la collection des unités logiques For Each drvUnité In fso.Drives .Cells(intLigne, 1).Value = drvUnité.DriveLetter ' Test pour déterminer si l'unité logique est prête If drvUnité.IsReady Then .Cells(intLigne, 2).Value = drvUnité.AvailableSpace .Cells(intLigne, 3).Value = drvUnité.FileSystem .Cells(intLigne, 4).Value = drvUnité.VolumeName ' Détermination du type d'unité logique ' Les types sont récapitulés à l'adresse suivante : ' https://docs.microsoft.com/en-us/office/vba/ language/reference/user-interface-help/drivetype-constants Select Case drvUnité.DriveType Case 0 .Cells(intLigne, 5).Value = "Inconnu" Case 1 .Cells(intLigne, 5).Value = "Disque mobile" Case 2 .Cells(intLigne, 5).Value = "Disque fixe" Case 3 .Cells(intLigne, 5).Value = "Disque réseau" Case 4 .Cells(intLigne, 5).Value = "CD ROM" Case 5 .Cells(intLigne, 5).Value = "Disque RAM" End Select End If intLigne = intLigne + 1 Next drvUnité End With MsgBox "Listage des unités terminé !" End Sub
Commentaire Le mot-clé New est utilisé pour créer une nouvelle instance de la classe.
Corrigé 18.2 Créer, gérer et supprimer les dossiers et les sous-dossiers Sub CréerMonde() Dim fso As Scripting.FileSystemObject Dim drvUnité As Scripting.Drive Dim strRacine As String Dim intNbContinents As Integer Dim intNoContinent As Integer Dim intNoPays As Integer Dim intNbPays As Integer Dim rngPays As Range Dim strContinent As String Dim strPays As String Set fso = New Scripting.FileSystemObject Set rngPays = Worksheets("Pays").Range("A1").CurrentRegion intNbContinents = rngPays.Columns.Count intNbPays = rngPays.Rows.Count ' Création du dossier Monde fso.CreateFolder (ThisWorkbook.Path & "\Monde") ' Balayage des continents For intNoContinent = 1 To intNbContinents ' Création du dossier continent strContinent = rngPays.Cells(1, intNoContinent).Value fso.CreateFolder (ThisWorkbook.Path & "\Monde\" & strContinent) ' Balayage des pays For intNoPays = 2 To intNbPays strPays = rngPays.Cells(intNoPays, intNoContinent).Value If strPays "" Then fso.CreateFolder (ThisWorkbook.Path & "\Monde\" & strContinent & "\" & strPays) End If Next intNoPays Next intNoContinent MsgBox "Création de l'arborescence des pays terminée !" End Sub
Note N’oubliez pas de libérer la mémoire. Pour cela, affectez la valeur Nothing aux variables objets.
Corrigé 18.3 Copier, déplacer et supprimer les fichiers Sub CopieDéplace()
Dim fso As Scripting.FileSystemObject Dim fldAppli As Scripting.Folder Dim ficFichier As Scripting.File Dim strFichiers As String Set fso = New Scripting.FileSystemObject Set fldAppli = fso.GetFolder(ThisWorkbook.Path) ' 1. Copie des fichiers du dossier Ressources ' vers le dossier CopieRessources For Each ficFichier In fldAppli.SubFolders("Ressources").Files ficFichier.Copy Destination:=fldAppli.SubFolders("CopieRessources").Path & "\" ' Remarque : le \ final est nécessaire !!! Next ficFichier MsgBox "Copie des fichiers effectuée..." '2. Renommage For Each ficFichier In fldAppli.SubFolders("CopieRessources").Files ' Remplace le . par BIS. ficFichier.Name = VBA.Replace(ficFichier.Name, ".", "BIS.") Next ficFichier MsgBox "Renommage des fichiers effectué..." '3. Déplacement des fichiers BIS vers le dossier Ressources For Each ficFichier In fldAppli.SubFolders("CopieRessources").Files ficFichier.Move Destination:=fldAppli.SubFolders("Ressources").Path & "\" Next ficFichier MsgBox "Déplacement des fichiers BIS effectué..." '4. Listage des fichiers du dossier Ressources For Each ficFichier In fldAppli.SubFolders("Ressources").Files strFichiers = strFichiers & ficFichier.Name & vbCrLf Next ficFichier MsgBox strFichiers '5. Effacement des fichiers BIS du dossier Ressources For Each ficFichier In fldAppli.SubFolders("Ressources").Files 'Recherche de la chaîne BIS. dans le nom du fichier If VBA.InStr(Start:=1, String1:=ficFichier.Name, String2:="BIS.", compare:=vbBinaryCompare) > 0 Then ficFichier.Delete End If Next ficFichier MsgBox "Fichiers BIS effacés" End Sub
Corrigé 18.4 Créer et utiliser un fichier texte Sub AnalyseINI() Dim fso As Scripting.FileSystemObject Dim txtINI As Scripting.TextStream Dim strLigne As String Dim strSection As String Dim strParamètre As String Dim strValeur As String Dim strParamValeur() As String Dim intLigneExcel As Integer
Set fso = New Scripting.FileSystemObject Set txtINI = fso.OpenTextFile(Filename:=ThisWorkbook.Path & "\Ressources\EnglishBIS.ini", IOMode:=ForReading) intLigneExcel = 2 ' Lecture séquentielle des lignes Do While Not txtINI.AtEndOfStream ' Lecture de la ligne strLigne = txtINI.ReadLine If VBA.Len(strLigne) > 0 Then ' Analyse de la ligne If VBA.Left(strLigne, 1) = "[" Then ' Nouvelle section strSection = VBA.Replace(VBA.Replace(strLigne, "[", ""), "]", "") Else ' Ligne Paramètre=valeur ' Découpage de la ligne par le signe = ' Obtention d'un tableau à deux éléments strParamValeur = VBA.Split(strLigne, "=") strParamètre = strParamValeur(0) strValeur = strParamValeur(1) Worksheets("BddINI").Cells(intLigneExcel, 1).Value = strSection Worksheets("BddINI").Cells(intLigneExcel, 2).Value = strParamètre Worksheets("BddINI").Cells(intLigneExcel, 3).Value = strValeur intLigneExcel = intLigneExcel + 1 End If End If Loop End Sub
Corrigé 18.5 Créer et utiliser un dictionnaire Le code suivant doit être placé dans le module de la UserForm frmFonctionsExcel. Option Explicit Private dicFonctions As Scripting.Dictionary ______________________________________________________________ Private Sub cmdQuitter_Click() Unload Me End Sub ______________________________________________________________ Private Sub lstFonctions_Click() lblFonctionAnglais.Caption = dicFonctions(lstFonctions.List(lstFonctions.ListIndex)) End Sub ______________________________________________________________ Private Sub UserForm_Initialize() Dim rngFonction As Range Set dicFonctions = New Scripting.Dictionary ' Balayage des fonctions Excel en français For Each rngFonction In Worksheets("FonctionsExcel").Range("A1"). CurrentRegion.Columns(1).Cells ' Garniture de la zone de liste lstFonctions.AddItem rngFonction.Value ' Garniture du dictionnaire dicFonctions.Add Key:=rngFonction.Value,
Item:=rngFonction.Offset(0, 1).Value Next rngFonction ' On pointe sur le 1er élément de la liste lstFonctions.ListIndex = 0 lblFonctionAnglais.Caption = dicFonctions(lstFonctions.List(0)) End Sub
Durée : 2 heures Mots-clés balise, XML, validation, requête, GPX Objectifs Utiliser une application VBA Excel pour tirer parti des fichiers utilisant le format d’échange de données XML.
Prérequis Pour valider les prérequis nécessaires, avant d’aborder le TP, répondez aux questions ci-après : 1 . 2 . 3 . 4
Type de données attendu par l’argument FileFormat pour enregistrer un classeur Excel au format XML : a. XML b. xlXML c. xlXMLSpreadsheet Objet représentant un mappage XML ajouté à un classeur : a. XmlMap b. WebOptions c. Map Méthode pour importer des données XML pour une variable de type String : a. Import b. XmlImport Méthode pour ouvrir un fichier XML dans Excel :
. 5 . 6 .
a. XMLOpen b. OpenXML c. Open FileFormat:=XML Nom d’objet pour un document XML : a. XMLDocument b. DocumentXML c. DOMDocument60 Méthode pour charger un fichier XML en mémoire : a. b. c.
Load LoadXML XMLLoad
Énoncé 19.1 Enregistrer un classeur Excel au format XML Durée estimative : 10 minutes Fichier Exemple.xlsx
Créez la procédure EnregistreEnXML qui enregistre le classeur Exemple.xlsx au format XML. Le document enregistré est nommé Classeur Exemple.xml. Le classeur Exemple.xlsx se trouve dans le dossier Documents XML.
Énoncé 19.2 Importer des données au format XML Durée estimative : 15 minutes Fichier Clients.xml
Utilisez le fichier Clients.xml placé dans le sous-dossier \Ressources\Documents XML\. Créez la procédure ImportDonnéesXML qui réalise l’importation des données de ce fichier dans la feuille de calcul Données XML Importées.
Note Avant l’importation, il faut supprimer tous les mappages et toutes les listes concernés du classeur.
Énoncé 19.3 Exporter des données Excel au format XML Durée estimative : 10 minutes À la liste précédemment importée, ajoutez le client suivant : RL01, BOUVET, Annick Créez la procédure ExportXLSenXML qui exporte cette liste modifiée au format XML dans le dossier Documents XML. Le document exporté est nommé ClientsExport.xml.
Énoncé 19.4 Ouvrir un fichier XML dans Excel Microsoft 365 Durée estimative : 5 minutes Créez la procédure OuvreXML qui ouvre directement dans Excel Microsoft 365 un fichier natif XML. On prendra comme exemple le fichier RANDO.gpx présent dans le dossier Documents XML.
Énoncé 19.5 Créer un fichier GPX Durée estimative : 45 minutes GPX (GPS eXchange Format) est le format de référence de fichiers cartographiques utilisé dans les outils tels que Google Earth ou Google Maps. Le but de l’exercice est de créer directement à l’aide de la procédure CréeGPX un fichier texte, dont le nom sera choisi par l’utilisateur, tel que le montre le fichier Exemple.gpx fourni dans le dossier Documents XML.
On utilisera comme données tout ou partie du fichier Excel tel qu’il a été créé à l’exercice 19.4, ces données étant placées dans la feuille Données GPX du classeur. Indices Utilisez la bibliothèque d’objets Microsoft Scripting Runtime, à référencer dans VBA par Outils - Références, pour créer dynamiquement un fichier texte sur le modèle suivant :
Les contenus des balises et attributs , lat (latitude en degrés décimaux), lon (longitude en degrés décimaux), (altitude) et (date et heure) sont à la discrétion du programmeur. Ces données seront prises dans des cellules Excel d’une page dédiée Les balises , et (précisions) seront systématiquement valorisées à 1.0.
Énoncé 19.6 Lire directement un fichier XML Durée estimative : 15 minutes Créez la procédure NomRando qui lit la valeur renseignée dans la balise contenue dans la balise elle-même contenue dans la balise . On utilisera les données du fichier RANDO.gpx. Indice Utilisez la bibliothèque d’objets Microsoft XML V6.0, à référencer dans VBA par Outils - Références, pour utiliser les objets XML.
Énoncé 19.7 Effectuer une requête sur un fichier XML Durée estimative : 20 minutes Créez la procédure SélectionneAltitude qui filtre les points d’altitude supérieure à une hauteur saisie par l’utilisateur. On utilisera les données du fichier RANDO.gpx. Les résultats seront inscrits dans la feuille Altitudes.
Prérequis 1. 2. 3. 4. 5. 6.
c. a. b. b. c. a.
Corrigé 19.1 Enregistrer un classeur Excel au format XML Option Explicit Private strChemin As String ----------------------------------------------------------------- Sub Chemin() strChemin = ActiveWorkbook.Path End Sub ----------------------------------------------------------------- Sub EnregistrerEnXML() Dim strCheminRessources As String Call Chemin strCheminRessources = strChemin & _ "\Documents XML\" ' ouverture du classeur à enregistrer au format XML Workbooks.Open Filename:=strCheminRessources _ & "Exemple.xlsx" ActiveWorkbook.SaveAs Filename:=strCheminRessources & _ "Classeur Exemple.xml", FileFormat:=xlXMLSpreadsheet ActiveWorkbook.Close savechanges:=False MsgBox "Classeur Exemple.xlsx enregistré en Classeur Exemple.xml" End Sub
Corrigé 19.2 Importer des données au format XML Suppression des mappages et des listes concernés avant importation : Sub
SupprimeMapEtListeXML() Dim MapXML As XmlMap Dim lo As ListObject ' Supprime tous les mappages du classeur ' et toutes les listes de la feuille Données XML Importées For Each MapXML In ActiveWorkbook.XmlMaps MapXML.Delete
End
Next MapXML For Each lo In ActiveWorkbook. _ Worksheets("Données XML Importées").ListObjects lo.Delete Next lo Sub
Importation des données XML : Sub End
ImportDonnéesXML() Dim MapXML As XmlMap Dim strCheminRessources As String Call Chemin strCheminRessources = strChemin & _ "\Documents XML\" Call SupprimeMapEtListeXML ActiveWorkbook.XmlImport _ URL:=strCheminRessources & "Clients.xml", _ ImportMap:=MapXML, Overwrite:=True, _ Destination:=Worksheets("Données XML Importées").Range("A1") MapXML.Name = "Clients" MsgBox "Données du fichier clients.xml importées" Sub
Corrigé 19.3 Exporter des données Excel au format XML Sub End
ExportXLSenXML() Dim strCheminRessources As String Call Chemin strCheminRessources = strChemin & _ "\Documents XML\" ActiveWorkbook.SaveAsXMLData _ Filename:=strCheminRessources & "\ClientsExport.xml", _ Map:=ActiveWorkbook.XmlMaps("Clients") MsgBox "Données du mappage Clients exportées" Sub
Corrigé 19.4 Ouvrir un fichier XML dans Excel Microsoft 365 Sub
OuvreXML() Dim strCheminRessources As String Application.DisplayAlerts = False Call Chemin strCheminRessources = strChemin & "\Documents XML\" Workbooks.OpenXML _ Filename:=strCheminRessources & "RANDO.gpx" _ , LoadOption:=xlXmlLoadImportToList
End Sub
Corrigé 19.5 Créer un fichier GPX Sub CréeGPX() Dim strCheminRessources As String Dim fso As Scripting.FileSystemObject Dim strFichierGPX As String Dim fluxTexte As Scripting.TextStream Dim intLigne As Integer Dim intNbLignes As Integer Dim f As Worksheet Call Chemin strCheminRessources = strChemin & "\Documents XML\" strFichierGPX = Application.InputBox("Entrez le nom du fichier GPX _ à créer" & vbCrLf & "SANS l'extension .gpx", 2) Set f = Worksheets("Données GPX") Set fso = New FileSystemObject Set fluxTexte = fso.OpenTextFile(Filename:=strCheminRessources & _ strFichierGPX & ".gpx", IOMode:=ForWriting, Create:=True) With fluxTexte intNbLignes = Worksheets("Données GPX").Range("A1").CurrentRegion.Rows.Count .WriteLine "" .WriteLine "" .WriteLine "" .WriteLine "Saint-Herblain le 15/11/2018" .WriteLine "" .WriteLine "" .WriteLine "Sequence 1" .WriteLine "" For intLigne = 2 To intNbLignes .WriteLine "" .WriteLine "" & Replace(f.Cells(intLigne, 8).Value, _ ",",".") & "" .WriteLine "" & f.Cells(intLigne, 9).Value & "" .WriteLine "1.0" .WriteLine "1.0" .WriteLine "1.0" .WriteLine "" Next intLigne .WriteLine "" .WriteLine "" .WriteLine "" .Close End With MsgBox "Création de " & strFichierGPX & ".gpx terminée..." Set fso = Nothing End Sub
Corrigé 19.6 Lire directement un fichier XML Sub End
NomRando() Dim strNomRando As String Dim objetXML As MSXML2.DOMDocument60 Dim strCheminRessources As String Dim noeudname As MSXML2.IXMLDOMElement Dim blnOK As Boolean Call Chemin strCheminRessources = strChemin & _ "\Documents XML\" Set objetXML = New MSXML2.DOMDocument60 blnOK = objetXML.Load(strCheminRessources & "RANDO.gpx") If blnOK Then Set noeudname = objetXML.ChildNodes(1).ChildNodes(0).ChildNodes(0) MsgBox "Référence de la rando : " & noeudname.Text Else MsgBox "Impossible de charger de document xml RANDO.gpx" End If Set objetXML = Nothing Sub
Corrigé 19.7 Effectuer une requête sur un fichier XML Sub
SélectionneAltitude() Dim dblAltitudeMini As Double Dim dblAltitude As Double Dim point As MSXML2.IXMLDOMElement Dim tracksegment As MSXML2.IXMLDOMElement Dim blnOK As Boolean Dim objetXML As MSXML2.DOMDocument60 Dim strCheminRessources As String Dim intNbPoints As Integer Dim intNoPoint As Integer Dim intL As Integer Call Chemin strCheminRessources = strChemin & _ "\Documents XML\" dblAltitudeMini = Application.InputBox("Choix de l'altitude minimum", 1) Set objetXML = New MSXML2.DOMDocument60 blnOK = objetXML.Load(strCheminRessources & "RANDO.gpx") If blnOK Then Set tracksegment = objetXML.ChildNodes(1).ChildNodes(1).ChildNodes(2) intNbPoints = tracksegment.ChildNodes.Length With Worksheets("altitudes") .Range("A1").CurrentRegion.Offset(1, 0).Clear intL = 2 For intNoPoint = 1 To intNbPoints dblAltitude = CDbl(tracksegment.ChildNodes(intNoPoint - _ 1).ChildNodes(0).Text) If dblAltitude >= dblAltitudeMini Then
End
.Cells(intL, 1).Value = _ tracksegment.ChildNodes(intNoPoint - 1).Attributes(0).Text .Cells(intL, 2).Value = _ tracksegment.ChildNodes(intNoPoint - 1).Attributes(1).Text .Cells(intL, 3).Value = dblAltitude .Cells(intL, 4).Value = _ tracksegment.ChildNodes(intNoPoint - 1).ChildNodes(1).Text intL = intL + 1 End If Next intNoPoint End With MsgBox "Fin de sélection" Else MsgBox "Impossible de charger de document XML RANDO.gpx" End If Set objetXML = Nothing Sub
Introduction Durée : 1 heure 40 Mots-clés API, système, Lib, DLL Objectifs Utiliser des API Windows dans une application VBA Excel Microsoft 365 pour accéder aux fonctionnalités les plus fines du système d’exploitation.
Prérequis Pour valider les prérequis nécessaires, avant d’aborder le TP, répondez aux questions ci-après : 1 . 2 .
La déclaration d’une API Windows se fait avec l’instruction : a. Declare b. Call c. Shell L’argument Lib permet d’indiquer : a. la procédure ou la fonction employée dans VBA.
3 .
b. le type de données de la valeur renvoyée par une procédure Function. c. la bibliothèque de liaisons dynamiques (DLL). Le nom d’une fonction API disposant d’un alias peut-il être choisi par l’utilisateur ? a. Oui b. Non
Les déclarations des fonctions API sont disponibles en téléchargement sous le nom de fichier : Win32API_PtrSafe.TXT
Énoncé 20.1 Générer un son bref (bip) Durée estimative : 10 minutes Fermez tous les classeurs ouverts. Ouvrez un nouveau classeur. Créez une procédure événementielle faisant en sorte qu’un bip soit émis chaque fois que l’on clique sur une cellule de la feuille Feuil1.
Énoncé 20.2 Connaître les types des unités logiques Durée estimative : 15 minutes Créez la procédure Type_Unités_Logiques qui précise le type de toutes les unités logiques disponibles.
Énoncé 20.3 Masquer la croix de fermeture des formulaires personnalisés Durée estimative : 30 minutes Formulaire frmPageMotdePasse
Vous disposez du formulaire frmPageMotdePasse ci-après. Ce formulaire est situé dans le classeur Système.xlsm.
Créez la procédure événementielle qui masque la croix de fermeture et empêche de déplacer le formulaire.
Énoncé 20.4 Calculer le temps d’exécution d’une procédure Durée estimative : 20 minutes Procédures Sub RemplitUne_a_Une et Sub Remplit_Global.
Complétez ces deux procédures de façon à afficher pour chacune d’entre elles le temps d’exécution. Ces procédures sont situées dans le classeur Système.xlsm.
Énoncé 20.5 Récupérer le dossier temporaire et le dossier système Windows Durée estimative : 10 minutes Créez une procédure Dossiers_système qui affiche le dossier temporaire et le dossier système Windows.
Énoncé 20.6 Lister l’ensemble des fenêtres Windows ouvertes Durée estimative : 15 minutes Créez une procédure Liste_fenêtres qui inscrit dans une feuille Excel vierge et active :
Dans la 1ère colonne le handle de la fenêtre.
Dans la 2ème colonne le titre de cette fenêtre.
Le résultat obtenu pourra comporter plusieurs centaines de lignes et ressemblera à la capture ci-dessous :
Indice On utilisera les fonctions API EnumWindows, GetWindowText et GetWindowTextLength.
Prérequis 1. 2. 3.
a. c. a.
Corrigé 20.1 Générer un son bref (bip) Dans la partie déclarations du module de la feuille Feuil1 : private Declare PtrSafe Function Beep Lib "kernel32" (ByVal dwFreq As Long, _ ByVal dwDuration As Long) As Long
Commentaire La déclaration peut aussi être mise dans un module standard. Il faut alors la déclarer publique pour qu’elle puisse être atteinte par la procédure événementielle de la feuille Feuil1. Dans la partie code de Feuil1 : Private Sub Worksheet_SelectionChange(ByVal Target As Range) Beep dwFreq:=1000, dwDuration:=500 End Sub
Corrigé 20.2 Connaître les types des unités logiques Dans la partie déclarations du module standard : Private Declare Function GetLogicalDrives Lib "kernel32" () As Long Private Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long
Code de la procédure : Sub Types_Unités_Logiques() Dim lngMasqueUnités As Long Dim strUnités As String Dim strUneUnité As String Dim intNoUnité As Integer Dim strtype As String lngMasqueUnités = GetLogicalDrives strUnités = "Unités logiques:" & vbCrLf For intNoUnité = 0 To 25 If (lngMasqueUnités And 2 ^ intNoUnité) 0 Then strUneUnité = VBA.Chr$(65 + intNoUnité) ' Détermination du type d'unité '------------------------------------------- Select Case GetDriveType(strUneUnité & ":\")
Case 2 strtype = "disque amovible" Case 3 strtype = "Disque fixe" Case 4 strtype = "Disque réseau" Case 5 strtype = "Cd-Rom" Case 6 strtype = "Disque Mémoire" Case Else strtype = "Type inconnu" End Select strUnités = strUnités & strUneUnité & " : " & _ strtype & vbCrLf End If Next intNoUnité MsgBox strUnités End Sub
Corrigé 20.3 Masquer la croix de fermeture des formulaires personnalisés Dans la partie déclarations du formulaire frmPageMotdePasse : Private Declare PtrSafe Function GetWindowLongA Lib "user32" _ (ByVal hwnd As LongPtr, ByVal nIndex As Long) As LongPtr Private Declare PtrSafe Function SetWindowLongA Lib "user32" (ByVal hwnd As _ LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" _ (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Commentaire Les trois déclarations ci-dessus sont obligatoires. Dans la partie code du formulaire : Private Sub UserForm_Initialize() Dim hwnd As LongPtr Dim lngStyle As LongPtr '======================================================== ' La fonction FindWindow récupère le handle (entier long) ' de la UserForm, repérée par son intitulé (Me.Caption) '======================================================== hwnd = FindWindow("Thunder" & IIf(Application.Version Like "8*", _ "X", "D") & "Frame", Me.Caption) '================================================================== ' La fonction GetWindowLongA récupère le "style" (entier long)
' de la fenêtre contenant la UserForm, repérée par son handle (hwnd) '================================================================== lngStyle = GetWindowLongA(hwnd, -16) '============================================================ ' La fonction SetWindowLongA modifie le "style" (entier long) ' c'est-à-dire supprime la croix de la fenêtre ' contenant la UserForm, repérée par son handle (hwnd) '======================================================== SetWindowLongA hwnd, -16, lngStyle And &HFFF7FFFF End Sub ----------------------------------------------- Private Sub cmdEntrer_Click() If txtPassword = "secret" Then Unload Me Worksheets("feuil2").Visible = True Worksheets("feuil2").Activate Else Beep MsgBox ("Mot de passe incorrect"), vbExclamation Label1 = "Ressaisissez votre mot de passe" txtPassword.SetFocus End If End Sub ---------------------------------------------- Private Sub cmdQuitter_Click() Unload Me End Sub
Corrigé 20.4 Calculer le temps d’exécution d’une procédure Dans la partie déclarations du formulaire : Declare PtrSafe Function GetTickCount Lib "kernel32" () As Long
Code des procédures : Sub End Sub
RemplitUne_a_Une() ' Remplir une à une les cellules A1 à A10000 Dim une_cellule As Range Dim topDépart As Long Dim topFin As Long topDépart = GetTickCount For Each une_cellule In Range("A1:A10000").Cells une_cellule.Value = "Editions ENI" Next une_cellule topFin = GetTickCount64 MsgBox "durée remplissage une à une : " & (topFin - topDépart) / 1000 & " sec." Sub Remplit_Global() ' Remplir globalement les cellules A1 à A10000 Dim topDépart As Long Dim topFin As Long topDépart = GetTickCount
End
Range("A1:A10000").Value = "Editions ENI" topFin = GetTickCount MsgBox "durée remplissage global : " & (topFin - topDépart) / 1000 & " sec." Sub
Corrigé 20.5 Récupérer le dossier temporaire et le dossier système Windows Dans la partie déclarations du formulaire : Declare PtrSafe Function GetTempPath Lib "kernel32" Alias "GetTempPathA" _ (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long Declare PtrSafe Function GetSystemDirectory Lib "kernel32" Alias _ "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
Code de la procédure Dossiers_système : Sub End
Dossiers_système() Dim strTEMP As String Dim strSystème As String strTEMP = Space$(250) GetTempPath 251, strTEMP strTEMP = Left(strTEMP, InStr(strTEMP, Chr(0)) - 1) strSystème = Space$(250) GetSystemDirectory strSystème, 251 strSystème = Split(strSystème, Chr(0))(0) MsgBox "Dossier temporaire : " & strTEMP & vbCrLf & _ "Dossier système : " & strSystème Sub
Corrigé 20.6 Lister l’ensemble des fenêtres Windows ouvertes Dans la partie déclarations du module, on place les déclarations suivantes : ' Déclaration des API utilisées pour le listage des fenêtres Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long Private Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Private Declare Function GetWindowTextLength Lib "user32.dll" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long Private intLigne As Integer
Code de la procédure Liste_fenêtres et de la fonction associée : Sub Liste_fenêtres() intLigne = 1 Call EnumWindows(AddressOf EnumérationFenêtres, 0) MsgBox "Fin d'énumération" End Sub Function EnumérationFenêtres(ByVal lngHandle As Long, ByVal lngParamètres As Long) As Long Dim strTitre As String Dim lngLongueurTitre As Long ' Valeur du handle de la fenêtre ActiveSheet.Cells(intLigne, 1).Value = lngHandle ' Détermination du titre strTitre = VBA.Space(GetWindowTextLength(lngHandle) + 1) lngLongueurTitre = GetWindowText(lngHandle, strTitre, VBA.Len(strTitre)) strTitre = VBA.Left(strTitre, lngLongueurTitre) ActiveSheet.Cells(intLigne, 2).Value = strTitre intLigne = intLigne + 1 ' Résultat de la fonction forcé à True ' pour continuer l'énumération EnumérationFenêtres = True End Function
Introduction Durée : 1 heure 10 Mots-clés fonctions matricielles, tableau croisé dynamique, fonctions Excel, doublon, étiquette, champ Objectifs Combiner la puissance du code VBA et les possibilités de l’application Excel (feuilles de calcul, fonctions matricielles) pour effectuer des recherches dans des plages de données et analyser les données à partir des tableaux croisés dynamiques.
Prérequis Pour valider les prérequis nécessaires, avant d’aborder le TP, répondez aux questions ci-après : 1 . 2 . 3 . 4 . 5 . 6 .
Propriété qui permet d’utiliser les fonctions Excel en français dans le code VBA : a. Formula b. FormulaLocal La propriété Address de l’objet Range renvoie une valeur de type : a. Integer b. String PivotTables représente la collection des : a. tableaux croisés dynamiques. b. objets contenus dans un tableau croisé dynamique. Name est une propriété de : a. PivotTables b. PivotTable Présentation d’un champ d’un tableau croisé dynamique en tant qu’étiquette de colonne : a. ColumnField b. xlColumnField c. ColumnHeads Méthode pour ajouter un champ de données à un tableau croisé dynamique : a. AddDataField b. AddField
Énoncé 21.1 Rechercher une information dans une plage de données
Durée estimative : 5 minutes Classeur Exemple.xlsm
Sélectionnez la feuille Recherche du classeur. Au bouton Simple, attachez une procédure RechercheSimple qui écrit dans une cellule la formule Excel permettant de reporter le nom du mois correspondant à la vente maximale.
Indice Différentes fonctions Excel sont disponibles pour effectuer une recherche. Vous pouvez par exemple faire appel aux fonctions INDEX et EQUIV. Utilisez la propriété FormulaLocal pour pouvoir intégrer les fonctions Excel dans le code VBA. Revoyez si nécessaire le chapitre « Échanges de fonctions entre Excel et VBA ».
Énoncé 21.2 Rechercher une valeur avec doublons dans une plage de données Durée estimative : 15 minutes Classeur Exemple.xlsm
Saisissez la valeur 88000 pour janvier et testez à nouveau votre procédure RechercheSimple. Vous constatez que le mois de juillet est cette fois-ci ignoré. L’exercice précédent ne permet pas de traiter le cas des doublons. Écrivez une nouvelle procédure RechercheElaborée qui reporte pour le tableau ci-après tous les mois et leur point de vente dont le total est égal au maximum. Faites aussi apparaître les adresses des cellules concernées.
Indice Utilisez la propriété Address et les fonctions de manipulation de chaînes de VBA.
Énoncé 21.3 Établir le chiffre d’affaires par représentant et par pays Durée estimative : 15 minutes Classeur Exemple.xlsm, formulaire frmCommandes.
Vous disposez dans la feuille Commandes d’un tableau (5 colonnes par 800 lignes) regroupant les commandes réalisées sur trois ans. Écrivez les procédures permettant d’afficher dans le formulaire le total en fonction du choix du représentant et du pays.
Indice Dans votre code VBA, utilisez la fonction Excel SOMMEPROD.
Énoncé 21.4 Créer un tableau croisé dynamique Durée estimative : 15 minutes Classeur Exemple.xlsm
Nous désirons proposer un tableau croisé dynamique personnalisé à partir des données de la feuille Commandes. Créez la procédure CreeTCD qui propose le TCD minimaliste suivant :
Votre procédure devra comporter un appel à la procédure EffaceTCD, chargée d’effacer auparavant les cellules de la feuille comportant un éventuel tableau croisé dynamique. Elle devra, en outre, présenter la boîte de choix ci-après :
Énoncé 21.5 Gérer les étiquettes Durée estimative : 10 minutes Créez la procédure Pays qui ajoute au TCD le champ Pays en tant qu’étiquette de colonne. Votre procédure devra comporter un appel à la fonction ExisteTCD, chargée de vérifier auparavant la présence effective du TCD.
Énoncé 21.6 Gérer les champs de valeurs Durée estimative : 5 minutes Créez la procédure AjoutMontant qui ajoute au TCD le champ Montant de la commande en tant que champ de valeur, à partir duquel est effectuée la somme des ventes par représentant et par pays.
Énoncé 21.7 Mettre à jour un tableau croisé dynamique Durée estimative : 5 minutes Créez la procédure MAJ_Stats qui met à jour le tableau croisé dynamique
Prérequis 1. 2. 3. 4. 5. 6.
b. b. a. b. b. a.
Corrigé 21.1 Rechercher une information dans une plage de données Sub RechercheSimple() Worksheets("Recherche").Range("C20").FormulaLocal = _ "=INDEX(B4:C15;EQUIV(C18;C4:C15;0);1)" End Sub
Corrigé 21.2 Rechercher une valeur avec doublons dans une plage de données Sub RechercheElaborée() Dim dblMax As Double Dim rngCellule As Range Dim intLigne As Integer
dblMax = Range("C18").Value intLigne = 4 With Worksheets("Recherche") For Each rngCellule In Worksheets("Recherche").Range("B4:E15") If rngCellule.Value = dblMax Then .Cells(intLigne, 7).Value = rngCellule.Address .Cells(intLigne, 8).Value = .Cells(3, rngCellule.Column).Value .Cells(intLigne, 9).Value = .Cells(rngCellule.Row, 2).Value intLigne = intLigne + 1 End If Next End With End Sub
Corrigé 21.3 Établir le chiffre d’affaires par représentant et par pays À mettre dans la zone de code du formulaire : Private Sub UserForm_Initialize() With Me.lstReprésentants .ColumnHeads = True .RowSource = "J10:J17" .ListIndex = 0 End With With Me.lstPays .ColumnHeads = True .RowSource = "L10:L11" .ListIndex = 0 End With Range("G13").Value = Me.lstPays.Text Range("G12").Value = Me.lstReprésentants.Text Call Calcul End Sub ------------------------------------------------------------- Public Sub Calcul() Range("G14").FormulaLocal = _ "=SOMMEPROD((A2:A798=G13)*(C2:C798)*(B2:B798=G12)*(E2:E798))" Me.lblTotal.Caption = Format(Range("G14").Value, "##,##0.00") End Sub ------------------------------------------------------------- Private Sub lstPays_MouseUp(ByVal Button As Integer, _ ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) Range("G13").Value = Me.lstPays.Text Call Calcul End Sub --------------------------------------------------------------- Private Sub lstReprésentants_MouseUp(ByVal Button As Integer, _ ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) Range("G12").Value = Me.lstReprésentants.Text Call Calcul End Sub
Corrigé 21.4 Créer un tableau croisé dynamique ' On décide de mettre un seul TCD sur la feuille Sub EffaceTCD() Worksheets("Analyse").Cells.Clear End Sub -------------------------------------------------------------- ' Création du TCD Sub CreeTCD() Dim intChoix As Integer intChoix = MsgBox("Attention !!! Si le TCD existe déjà," _ & " il sera supprimé" & vbCrLf & _ "Voulez-vous vraiment poursuivre ?", _ vbYesNo, "Création du TCD") If intChoix = vbYes Then Call EffaceTCD On Error GoTo sortie ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _ Worksheets("Commandes").Range("A1").CurrentRegion, _ Version:=xlPivotTableVersion15).CreatePivotTable _ TableDestination:=Worksheets("Analyse").Range("A1"), _ TableName:="TCD", DefaultVersion:=xlPivotTableVersion15 With Worksheets("Analyse").PivotTables("TCD"). _ PivotFields("Représentant") .Orientation = xlRowField .Position = 1 End With ActiveWorkbook.ShowPivotTableFieldList = False MsgBox "Création du TCD réalisée" Else MsgBox "Opération annulée." End If Exit Sub sortie: MsgBox "Le TCD existe déjà !" End Sub
Corrigé 21.5 Gérer les étiquettes ' Vérification de la présence du TCD Function ExisteTCD() As Boolean On Error GoTo sortie If Worksheets("Analyse"). _ PivotTables("TCD") _ .Name = "TCD" Then ExisteTCD = True End If Exit Function sortie: ExisteTCD = False End Function ------------------------------------------------------------ ' Ajout du champ Pays au TCD Sub Pays() If ExisteTCD Then With Worksheets("Analyse"). _ PivotTables("TCD").PivotFields("Pays")
.Orientation = xlColumnField .Position = 1 End With Else MsgBox "Créer d'abord le TCD !" End If End Sub
Corrigé 21.6 Gérer les champs de valeurs Sub AjoutMontant() On Error GoTo Sortie_Sur_Erreur Worksheets("Analyse").PivotTables("TCD").AddDataField _ Worksheets("Analyse").PivotTables("TCD"). _ PivotFields("Montant de la commande"), _ "Somme de Montant de la commande", xlSum Exit Sub Sortie_Sur_Erreur: MsgBox "Le champ ""Montant de la commande"" a déjà été ajouté au TCD" End Sub
Corrigé 21.7 Mettre à jour un tableau croisé dynamique Sub MAJ_Stats() Worksheets("Analyse").PivotTables("TCD"). _ PivotCache.Refresh End Sub
Introduction Mots-clés Web, requêtes, filtre, Access, Excel, CSV Objectifs Utiliser le code VBA pour augmenter la performance de l’outil Power Query.
Prérequis Pour valider les prérequis nécessaires, avant d’aborder le TP, répondez aux questions ci-après : 1. 2. 3. 4.
L’ensemble des requêtes d’un classeur Excel est : a. La collection Queries b. La collection WorkBookQueries c. La collection QueryTables Une requête est un objet de classe : a. Query b. QueryTable c. WorkBookQuery Le résultat visuel d’une requête est un objet de classe : a. ListObject b. QueryTable c. ListView Power Query spécifie ses requêtes : a. par le Power Query Formula Language. b. par le langage SQL classique. c. par paramétrage des options d’un Éditeur avancé.
Note importante Power Query est intégré à Microsoft 365.
Énoncé 22.1 Créer une requête simple sur une page web Durée estimative : 20 minutes Créez la procédure Tout_CAC40 qui récupère dans la cellule active le contenu d’une partie de page web correspondant au tableau instantané des valeurs du CAC40. L’adresse de la page web est la suivante : https://fr.finance.yahoo.com/q/cp? s=^FCHI Le résultat obtenu aura l’aspect du tableau suivant :
Indice Utiliser Power Query en passant par la commande Données - À partir du Web.
Énoncé 22.2 Créer une requête avec filtre sur une page web Durée estimative : 15 minutes Créez la procédure CréeRequêteCAC_40 similaire à la procédure précédente Tout_CAC40 mais qui sélectionne les valeurs dont le volume est supérieur ou égal à une valeur choisie par l’utilisateur en fonction des résultats obtenus dans l’exercice précédent. Dans l’exemple ci-dessous, le volume choisi est de 800 000.
Indice Nommez la requête CAC40 3M.
Énoncé 22.3 Généraliser une requête avec filtre sur une page web Durée estimative : 5 minutes Créez la procédure FiltrageRequêteCAC40 qui permet à l’utilisateur de choisir luimême le volume minimum du filtre à appliquer.
Indice On réutilisera la requête TableCACWeb de l’exercice précédent. On veillera donc à ne pas appeler la procédure effaceRequetes.
Énoncé 22.4 Créer une requête Power Query sur une base Access Base de données Northwind 2007.accdb
Durée estimative : 20 minutes Créez la procédure Requête_Access qui extrait l’ensemble des informations de la table Clients de la base de données Access Northwind 2007.accdb. Cette base de données est située dans le sous-dossier Ressources du dossier Chapitre 22. Nommez cette requête Clients_Access et implantez le résultat sur une feuille Excel intitulée Clients.
Énoncé 22.5 Créer une requête Power Query sur une feuille Excel Classeur Excel Commandes.xlsx
Durée estimative : 20 minutes Créez la procédure Requête_Excel qui extrait l’ensemble des informations de la 1ère feuille du classeur Excel Commandes.xlsx. Ce classeur est situé dans le sous-dossier Ressources du dossier Chapitre 22. Nommez cette requête CommandesExcel et implantez le résultat sur une feuille Excel intitulée Commandes.
Énoncé 22.6 Créer une requête Power Query sur un fichier texte CSV Fichier Commandes.csv
Durée estimative : 20 minutes Créez la procédure Requête_CSV qui extrait les commandes de l’année 2020 présentes dans le fichier texte Commandes.csv. Ce fichier est situé dans le sousdossier Ressources du dossier Chapitre 22. Nommez cette requête CommandesCSV et implantez le résultat sur une feuille Excel intitulée Commandes2020.
Prérequis 1. 2. 3. 4.
a. c. a. a.
Corrigé 22.1 Créer une requête simple sur une page web Sub Tout_CAC40() ' 22.1 Récupérer un tableau du CAC40 Call effaceRequêtes ActiveWorkbook.Queries.Add Name:="CAC40", Formula:= _ "let Source = Web.Page(Web.Contents(""https://fr.finance.yahoo.com/ q/cp?s=^FCHI""))," & _ " Data0 = Source{0}[Data] , #""Type modifié"" = Table.TransformColumnTypes(Data0,{{""Symbole"", type text}, {""Nom de la société"", type text}," & _ "{""Dernier prix"", type number}, {""Variation"", type number},
{""% de variation"", Percentage.Type}, {""Volume"", Int64.Type}}) in #""Type modifié""" With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _ "OLEDB;Provider=Microsoft.Mashup.OleDb.1; Data Source=$Workbook$;Location=""CAC40"";Extended Properties=""""" _ , Destination:=Range("$A$1")).QueryTable .CommandType = xlCmdSql .CommandText = Array("SELECT * FROM CAC40") .ListObject.DisplayName = "TableCAC40" .Refresh BackgroundQuery:=False End With End Sub Sub effaceRequetes() Dim intQ As Integer On Error Resume Next For intQ = 1 To 100 ActiveWorkbook.Queries(intQ).Delete ActiveSheet.ListObjects(intQ).Delete Next intQ End Sub -----------------------------------------------------------------
Corrigé 22.2 Créer une requête avec filtre sur une page web Sub CréeRequêteCAC_40() ' 22.2 Créer une requête avec filtre sur une page web Dim strFormule As String Call effaceRequêtes strFormule = "let Source = Web.Page(Web.Contents(""https://fr.finance. yahoo.com/q/cp?s=^FCHI""))," & _ " Data0 = Source{0}[Data] , #""Type modifié"" = Table.TransformColumnTypes(Data0,{{""Symbole"", type text}, {""Nom de la société"", type text}," & _ " {""Dernier prix"", type number}, {""Variation"", type number}, {""% de variation"", Percentage.Type}, {""Volume"", Int64.Type}})" & _ ", #""Lignes filtrées"" = Table.SelectRows(#""Type modifié"", each [Volume] > 3000000) in #""Lignes filtrées""" ActiveWorkbook.Queries.Add Name:="CAC40_SELECT", Formula:=strFormule With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _ "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source= $Workbook$;Location=""CAC40_SELECT"";Extended Properties=""""" _ , Destination:=Range("$A$1")).QueryTable .CommandType = xlCmdSql .CommandText = Array("SELECT * FROM CAC40_SELECT") .ListObject.DisplayName = "TableCAC_SELECT" .Refresh BackgroundQuery:=False End WithEnd Sub
Corrigé 22.3 Généraliser une requête avec filtre sur une page web Sub FiltrageRequêteCAC40() ' 22.3 Généraliser une requête avec filtre sur une page web Dim dblVolume As Double Dim strFormule As String ' Saisie du volume minimum des transactions dblVolume = Application.InputBox(Prompt:="Entrez le volume minimum", Type:=2) ' Mise à jour de la formule de la requête web, incluant dblVolume strFormule = "let Source = Web.Page(Web.Contents(""https://fr.finance. yahoo.com/q/cp?s=^FCHI""))," & _ " Data0 = Source{0}[Data] , #""Type modifié"" = Table.TransformColumnTypes(Data0,{{""Symbole"", type text}, {""Nom de la société"", type text}," & _ " {""Dernier prix"", type number}, {""Variation"", type number}, {""% de variation"", Percentage.Type}, {""Volume"", Int64.Type}})" & _ ", #""Lignes filtrées"" = Table.SelectRows(#""Type modifié"", each [Volume] > " & dblVolume & ") in #""Lignes filtrées""" ' Réaffectation de la formule à la requête TableCACWeb ActiveWorkbook.Queries("CAC40_SELECT").Formula = strFormule ' Réactualisation de la table Excel ActiveSheet.ListObjects("TableCAC_SELECT").QueryTable.Refresh BackgroundQuery:=False End Sub
Corrigé 22.4 Créer une requête Power Query sur une base Access Sub Requête_Access() ' 22.4 Créer une requête Power Query sur une base Access Dim qtClient As QueryTable Dim strFormule As String Call effaceRequêtes strFormule = "let" & vbCrLf & _ " Source = Access.Database(File.Contents(""" & ThisWorkbook.Path & "\Ressources\Northwind 2007.accdb""))," & vbCrLf _ & " ListeClients = Source{[Schema="""",Item=""Clients""]}[Data]" & vbCrLf & _ "in" & vbCrLf & " ListeClients" ' Création de la requête Clients_Access ActiveWorkbook.Queries.Add Name:="Clients_Access", Formula:=strFormule ' Création de la table de requête qtClient associée à Clients_Access Set qtClient = Worksheets("Clients").ListObjects.Add(SourceType:=0, Source:= _ "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=Clients_Access" _ , Destination:=Worksheets("Clients").Range("$A$1")).QueryTable With qtClient .CommandType = xlCmdSql
End
End Sub
.CommandText = Array("SELECT * FROM [Clients_Access]") .ListObject.DisplayName = "ListeClientsAccess" .Refresh BackgroundQuery:=False With
Corrigé 22.5 Créer une requête Power Query sur une feuille Excel Sub Requête_Excel() ' 22.5 Requête sur une feuille Excel ' Création d'une requête sur la 1ère feuille d'un fichier Excel Commandes.xlsx Dim qtCommandes As QueryTable Dim strFormule As String strFormule = "let" & vbCrLf & _ " Source = Excel.Workbook(File.Contents(""" & ThisWorkbook.Path & "\ Ressources\Commandes.xlsx""), null, true)," & vbCrLf & _ " Feuil1_Sheet = Source{[Item=""Feuil1"",Kind=""Sheet""]}[Data]," & vbCrLf & _ " #""En-têtes promus"" = Table.PromoteHeaders(Feuil1_Sheet)," & vbCrLf & _ " #""Type modifié"" = Table.TransformColumnTypes(#""En-têtes " & _ "promus"",{{""Idclient"", Int64.Type}, {""NoCmde"", type text}, {""DateCmde"", type date}, {""Montant"", Int64.Type}})" & vbCrLf & _ "in" & vbCrLf & " #""Type modifié""" ActiveWorkbook.Queries.Add Name:="CommandesExcel", Formula:=strFormule Set qtCommandes = Worksheets("Commandes").ListObjects.Add(SourceType:=0, Source:= _ "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=CommandesExcel" _ , Destination:=Worksheets("Commandes").Range("$A$1")).QueryTable With qtCommandes .CommandType = xlCmdSql .CommandText = Array("SELECT * FROM [CommandesExcel]") .ListObject.DisplayName = "ListeCommandesExcel" .Refresh BackgroundQuery:=False End With End Sub
Corrigé 22.6 Créer une requête Power Query sur un fichier texte CSV Sub Requête_CSV() ' 22.6 Requête sur un fichier texte CSV Dim qtCommandesCSV As QueryTable Dim strFormule As String
Call effaceRequêtes strFormule = "let Source = Csv.Document(File.Contents(""" & ThisWorkbook.Path & "\Ressources\Commandes.csv"")," & _ "[Delimiter="";"", Columns=4, Encoding=1252, QuoteStyle=QuoteStyle.None]), #""En-têtes promus"" = Table.PromoteHeaders(Source, " & _ "[PromoteAllScalars=true]), #""Type modifié"" = Table.TransformColumnTypes" & _ "(#""En-têtes promus"",{{""Idclient"", Int64.Type}, {""NoCmde"", type text}," & _ "{""DateCmde"", type date}, {""Montant"", Int64.Type}})," & _ "#""Lignes filtrées"" = Table.SelectRows(#""Type modifié"", each [DateCmde] >= #date(2020, 1, 1) and [DateCmde]