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,… [)]