PROGRAMMATION en VBA - Travaux pratiques -
Transcription
PROGRAMMATION en VBA - Travaux pratiques -
Master Sciences et Technologies - Mention Génie des Systèmes 1ndustriels - Spécialité Informatique Industrielle PROGRAMMATION en VBA - Travaux pratiques - Écrire une procédure afficheDernierClasseur() qui ouvre le dernier classeur utilisé et affiche, dans une boîte de message, son nom et celui des feuilles qu'il contenait, avant de le refermer. La désactivation de l'affichage se fait grâce à la propriété Application.ScreenUpdating Écrire une procédure masquerLignesVides() qui masque les lignes vides contenues dans la sélection (qui sera désignée de manière interactive) Écrire une procédure sommeCouleurs() qui calcule et inscrit (dans les premières cellules vides de la feuille courante) la somme des valeurs contenues dans les cellules de la sélection dont le texte est en rouge et, respectivement, celles dont le fond est en bleu. Les objets correspondants sont Font et Interior. Écrire une procédure purgeFeuilles() qui efface les feuilles vides du classeur courant en personnalisant la confirmation. On pourra ici utiliser les fonctions intégrées IsArray() et IsEmpty(). La désactivation des messages Excel se fait grâce à la propriété Application.DisplayAlerts Créer 4 nouvelles feuilles dans le classeur : "Test Change()", "Test SelectionChange()", "Test BeforeDoubleClick()" et "Retour à la première page". Écrire des procédures événementielles pour : - qu'un clic sur l'onglet de la feuille "Retour à la première page" active la première feuille du classeur - que la modification d'une cellule de la feuille "Test Change()" provoque l'affichage, dans une boîte de message, de la cellule modifiée - qu'un double clic dans la feuille "Test BeforeDoubleClick()" provoque l'affichage de l'adresse de la cellule sur laquelle on a cliqué, avec annulation de l'effet du double clic (édition de la formule) - qu'un changement de sélection dans la feuille "Test SelectionChange()" provoque l'affichage, dans la barre d'état, de la somme des valeurs des cellules possédant un fond coloré Créer le formulaire ci-contre et écrire une procédure suppression6(…), liée au bouton OK, qui supprime, à partir de la cellule courante et seulement si les cases "Direction" sont cochées, les formules des cellules en lignes et/ou colonnes, avec un pas réglable dans chaque cas Créer une nouvelle barre d'outils contenant un bouton qui permet d'ouvrir le formulaire cidessus. Écrire une procédure createMenu () qui ajoute à la barre d'Excel le menu ci-contre s'il n'existe pas encore. L'item "Supprimer ce menu" devra permettre à ce menu de s'auto-supprimer. Écrire une procédure exportGIF () qui demande à l'utilisateur de saisir à la souris une plage de cellule en vue d'en construire un graphe, ouvre un nouveau classeur et y crée 2 objets graphiques (l'un contenant la plage sous forme graphique et l'autre un graphe construit à partir de celle-ci), ayant la même taille (celle de la sélection). Ces deux objets sont ensuite exportés au format GIF et le classeur qui les contient est fermé (sans enregistrer le contenu). Les objets correspondants sont ChartObject et Chart. Master Sciences et Technologies - Mention Génie des Systèmes 1ndustriels - Spécialité Informatique Industrielle PROGRAMMATION en VBA - Exercices complémentaires - A. En jouant sur les mots ! Écrire une fonction premier_mot(…) qui retourne le premier mot de son argument chaîne. Exemple : premier_mot("ceci est un EXEMPLE")"ceci" Écrire une fonction nb_mots(…) qui retourne le nombre de mots de son argument chaîne (en supposant qu'un seul espace sépare les mots). Exemple : nb_mots("ceci est un EXEMPLE")4 Réécrire la fonction précédente pour qu'elle soit aussi valable s'il existe plusieurs espaces consécutifs entre deux mots. Exemple : nb_mots("ceci est un EXEMPLE")4 Écrire une fonction split(…), qui retourne les mots d'une chaîne en utilisant un tableau dynamique. On traitera de plus le cas où plusieurs espaces se suivent dans la chaîne. Exemple : split("ceci est un EXEMPLE")Array("ceci","est","un","exemple") Réécrire la fonction split(…) en y faisant cette fois appel à premier_mot(…) (qu'il faudra réécrire également en passant le paramètre chaîne par référence). Écrire une fonction occurrences(…) qui retourne un tableau 2D contenant chaque caractère apparaissant dans son argument chaîne et le nombre d'occurrences correspondant. Exemple : occurrences("ceci est un EXEMPLE") Array(Array("c","e","i"," ","s","t","u","n","E","X","M","P","L"), Array(2,2,1,3,1,1,1,1,3,1,1,1,1)) B. Objet Worksheet, le retour Écrire une procédure triDirectFeuilles() qui trie les feuilles du classeur courant par ordre alphabétique. Avant de trier, on prendra soin de désactiver l'affichage et le recalcul automatique. Principe du tri direct : ranger le premier élément, puis trier le reste du tableau. Pour cela, on écrira d'abord une fonction indicePPE(…) qui retourne l'indice du plus petit élément d'un tableau ou d'une collection d'objets Excel nommés Écrire une procédure triDirectFeuilles() qui trie les feuilles du classeur courant par ordre alphabétique. Avant de trier, on prendra soin de désactiver l'affichage et le recalcul automatique. Même problème en utilisant un "tri-bulles", plus performant : écrire la procédure triBulleFeuilles() Principe : a) Parcourir le tableau en comparant 2 à 2 les éléments successifs et permuter ceux-ci s'ils ne sont pas bien ordonnés b) Répéter tant que des permutations sont effectuées C. Fonctions sur les polynômes Dans le module Polynomes, créer les fonctions suivantes : - degré : retourne le degré du polynôme fourni en paramètre - évaluer : retourne la valeur d'un polynôme en un point, tous deux fournis en paramètres. - polyString : retourne une chaîne représentative du polynôme fourni en paramètre. Master Sciences et Technologies - Mention Génie des Systèmes 1ndustriels - Spécialité Informatique Industrielle - compléter : prend en paramètres un polynôme et le degré jusqu'auquel celui-ci doit être complété avec des coefficients nuls; retourne le résultat de cette opération. Cette fonction pourra être utilisée dans la suivante. - somme : retourne le polynôme somme de 2 polynômes fournis en paramètres. - produit : retourne le polynôme produit de 2 polynômes fournis en paramètres. Création de l'interface graphique. Le formulaire proposé (cicontre) comporte : - 2 zones d'édition de références (contrôle RefEdit) destinées à recevoir les adresses des plages-polynômes (p1 et p2) - une liste déroulante permettant de sélection une opération parmi : - i) et ii) L'évaluation de p1 ou p2 en un point - iii) et iv) Le calcul des polynômes somme et produit de p1 et p2 - v) et vi) L'évaluation en un point des polynômes somme et produit de p1 et p2 - une zone de texte permettant la saisie d'un réel, dans les opérations précédentes où un point est requis - un groupe d'option permettant de spécifier la destination du résultat. S'il doit être inscrit dans le classeur, une zone d'édition de référence permet de saisir l'adresse de destination. - 2 boutons OK et Fermer permettant respectivement de lancer l'opération choisie et de fermer le formulaire. Il vous est demandé de créer ce formulaire ainsi que les routines de traitement des événements permettant d'obtenir un comportement cohérent (par exemple, n'afficher la zone de saisie de la référence destination que si Classeur est sélectionné comme destination du résultat). On veillera tout spécialement à prévoir les différents cas d'erreurs (zones vides, notamment) dans la procédure de déclenchement de l'opération (clic sur le bouton OK). Master Sciences et Technologies - Mention Génie des Systèmes 1ndustriels - Spécialité Informatique Industrielle - Aide-mémoire de Visual Basic Commentaires introduits par une apostrophe (') ou Rem. Ce qui suit sur la ligne est ignoré. Variables et constantes Déclaration (optionnelle, type Variant par défaut) avec Dim nomVar [As type] ou Dim nomVar suivi d'un suffixe. Le nom des variables est insensible à la casse. Spécification de la portée à la déclaration en utilisant Public ou Private au lieu de Dim Déclaration d'une constante personnalisée : Const nomConst [As type] = expression Nombreuses constantes prédéfinies ex. vbCrLf ó nouvelle ligne, vbTab ó tabulation, … Tableaux Déclaration avec Dim|Private|Public nomTab ( [indiceMin1 To] indiceMax1 , [indiceMin2 To] indiceMax2,…) L'indice minimum est 0 (par défaut) ou 1 (avec l'instruction Option Base 1 au niveau module) Tableaux dynamiques : déclaration avec Dim nomTab() [As type], redimensionnement avec ReDim [Preserve] nomTab (indices) et utilisation de UBound() pour connaître l'indice maximum. Chaînes Constantes entourées de guillemets doubles (") et concaténation par l'opérateur &. Affichage dans la fenêtre d'exécution par Debug.Print, dans une boîte de message par MsgBox( ). Fonctions : longueur Len( ), sous-ch. Left( ), Right( ) ou Mid( ), position de sous-ch. InStr( ), en maj. UCase( ) Opérateurs = (égalité), <> (différence), And (ET logique), Or (OU logique), Not (NON logique), Mod (modulo) Structures de contrôle Test If condition Then instructions Sélection 'Sur une seule ligne If condition1 Then instructions1 [ElseIf condition2 Then instructions2] [ElseIf condition3 Then instructions3] … [Else instructionsElse] End If Boucles FOR Select Case expressionTestée Case listeValeurs1 instructions1 Case listeValeurs2 instructions2 … [Case Else instructionsElse] End Select Boucles WHILE et UNTIL For compteur=début to fin [step pas] Instructions Next compteur Do While condition Instructions Loop Do Until condition Instructions Loop For Each element In groupe instructions Next element Do Instructions Loop While condition Do Instructions Loop Until condition Fonctions Déclaration : Sub nomProcedure ( [arguments] ) ou Function nomFonction ( [arguments] ) [As type] Arguments (syntaxe d'un argument) : [Optional] [ByVal | ByRef] nomArg [As type] [= valDéfaut] Appel d'une procédure Sub : Call nomProcedure ( arg1, arg2, … ) ou nomProcedure arg1, arg2, … Appel d'une fonction : - sans utiliser le résultat : nomFunction arg1, arg2, … ; - en utilisant le résultat : nomVar = nomFunction ( arg1, arg2, … ) Utilisation des noms des arguments : [Call|nomVar =] nomMacro [(]nomArg2 := valArg2, nomArg1 := valArg1,… [)]