jeudi 5 janvier 2012

Cours et exercices Corrigés VBA EXCEL 2007 : Variables - tableaux - les boucles - Programmer une feuille de calcul en langage VBA

OBJECTIFS : - Déclarer des variables et des constantes V.B.A.
- Utiliser des variables ordinaires et des variables Tableaux
- La structure alternative Si - Alors - Sinon - Fin si
- La boucle Pour ..suivant
- La boucle Faire ... Boucle
- La Boucle Selon cas ...Fin selon




PROGRAMMATION STRUCTUREE EN VISUAL BASIC
Au cours des TD précédents, vous avez découvert comment les commandes Excel était traduite en langage V.B.A.. Vous avez également découvert la possibilité de créer une fonction personnalisée. Il ne reste plus qu’à acquérir des rudiments de programmation afin d’exploiter au mieux V.B.A..

I/ Appel d’une procédure par une autre

Un programme écrit en V.B.A. se décompose en procédures et fonctions stockées dans une ou plusieurs modules, c’est pourquoi on parle de programmation structurée :

Sub Procédure1()
Actions...
End Sub
Sub Procédure2()
Actions
End Sub
...
Function Nomfonction1(argument1;Argument2;...)
instructions...
End Function

Une procédure peut être exécutée sur ordre de l’utilisateur (qui clique par exemple sur un bouton) ou peut être appelée par une autre procédure. En décomposant un programme en un nombre conséquent de procédures, on facilite le débogage des erreurs.

Exemple : ouvrez un nouveau classeur et nommez la feuille Feuil1 en Exemple1

insérez une feuille module
Et saisissez les deux procédures suivantes


Sub Affichemessage(msg)
Sheets("Exemple1").Select
Range("C2").Select
Selection.Formula = msg

End Sub
'Définit la procédure Affichemessage qui accepte un argument
'sélection de la feuille Exemple 1
'Sélection de la cellule C2
'Place dans la cellule sélectionnée le texte reçue de la procédure
'appelante


Sub procéduregénérale()
bonjour = "Bonjour et bienvenue à VBA Planète"
Affichemessage bonjour

End Sub


'Affecte le texte " Bonjour.. " à la variable Bonjour

'appelle la procédure Affichemessage avec l'argument contenu
' dans la variable Bonjour


Remarque :

1) pour la lisibilité du programme, le corps de chaque procédure est en retrait (Programmation structurée oblige)
2) Dans la procédure Affichemessage(Msg), on aurait pu remplacer les lignes Range (« C2 »)... et Selection.Formula par :
Cells(2,3).Formula=Msg - {Cellules(numligne;numcolonne) et une méthode de l’objet Feuilles}
3) La propriété Formula peut être remplacée par Value
4) Les références de cellules se mettent toujours entre guillemets pour éviter toute confusion avec des variables.
5) La procédure Affichemessage n’apparait pas dans la boîte de dialogue Macro car elle ne peut être exécutée que par une procédure

II/ LES CONSTANTES ET LES VARIABLES
La programmation exige trés souvent qu’on stocke des informations et des résultats provisoirement en mémoire. On doit alors utiliser des variables

A/ les variables
1) notion

Dans l’exemple précédent, on a défini la variable nommée Bonjour qui contient le texte « Bonjour et bienvenue à V.B.A. Planéte »
Donc quand on veut afficher le texte on fait référence à la variable Bonjour.

le code suivant modifie le contenu de la variable Bonjour :
Bonjour=« Au revoir et merci de votre visite »

2) les types de données des variables :

Les variables sont caractérisées par le type de données qu’elles peuvent contenir :

Type de données
Taille
Commentaire
Variant
Selon les besoins
Type de données par défaut pouvant contenir aussi bien du texte, que des nombre ou des objets
Boolean
2 octets
Booléen : Accepte comme valeur vrai ou faux
Byte
1 Octet
Type octet : permet de stocker des nombres compris entre 0 et 255
Integer
2 octets
Nombre Entier (sans virgules) compris entre -32768 et +32767
Long
4 octets
Nombre entier long compris entre -2 milliards environ et + 2milliards
Single
4 octets
Nombre réél simple (avec virugule) compris entre environ -3x10-38 et +3x10+38 (Satisfait aux besoins courants en gestion)
Double
8 octets
Nombre réél double (pour des chiffres « astronomiques »
Décimal
12 octets
Utilité limitée en geston, c’est un sous-type de données variant
Currency
8 octets

Date
8 octets
Date comprise entre le 1er janvier0100 au 31/12/9999
String
1 octet par caractère
Contient du texte (de 0 65535 caractéres) pour les champs de longueur fixes et jusqu’à environ 2milliards de caractères pour les champs de longueur variable
Object
4 octets
Tout objet (feuilles, classeurs, plage, application...)

Par économie de mémoire et pour éviter des erreurs difficiles à déceler, il est conseillé de déclarer les variables avant utilisation, car à défaut c’est le type variant qui est attribué.

3) Déclaration explicite des variables

V.B.A. comporte différentes instructions pour déclarer les variables :

- Dim nomvariable As type :

Exemple 1 : l’instruction Dim Bonjour As String ‘déclare explicitement la variable Bonjour en chaîne de caractères
Exemple 2 : Diml Numfacture As Long ‘ déclare la variable Numfacture avec le type entier Long

- Static nomvariable As type : le contenu de la variable n’est dans ce cas jamais effacé (sauf en quittant EXCEL)

- Public nomvariable As type : Permet de définir une variable utilisable par tous les modules de tous les classeurs.

Selon la manière dont elle est déclarée, la variable peut posséder une des trois portées suivantes :

Portée
Déclaration
Locale au niveau de la procédure
Dim ou Static au sein de la procédure
Au niveau module
Dcl ou static au début du module (un module regroupe un ensemble de procédures ou fonctions
Publique (tous modules de tous classeurs ouverts
Public au début du module

4) L’affectation de références à un objet

Pour affecter une référence à un objet, on utilise l’instruction Set
Exemple : les lignes suivantes déclarent la variable objet nommé Plagecell et affectent une plage à la variable :

Dim Plagecell as Object
Set Plagecell=ActiveSheet.Range(“A1 »)

Pour sélectionner la cellule A1, il suffit de taper
Plagecell.Select
au lieu de
ActiveSheet.range(« A1 »).Selectr (gain de temps dans la rédaction du code)

B/ Les constantes

Une constante est une donnée fixe (dont la valeur est figée) exemple : un taux de TVA
Pour déclarer une constante, on utilise l’instruction Const. Exemple :

Const Tvaréduit As Single = 0,055 ‘Constante Tvaréduit déclarée en réél simple
Const Tvanormal As Single = 0,206 ‘Constante Tvanormale déclarée en réél simple

Il existe des constantes intégrées dont le nom commence par Xl ou Vb. Exemple :

- Xldefault : définit une valeur par défaut dans les options de boîtes de dialogue
- VbOK : Renvoie la valeur 1 si le bouton Ok d’une boîte de dialogue est enfoncé
- VbCancel renvoie la valeur 2 si le bouton annuler est enfoncé.

Pour obtenir la liste des constantes intégrées, consulter la rubrique Mots Clés de l’aide en ligne Visual Basic

Exemple :

Vous allez modifier la procédure Procéduregénérale() afin que l’utilisateur saisisse son nom, son prénom et son salaire mensuel : ces éléments seront recopiés dans la feuille Exemple1 respectivement dans les cellules C4, C5 et C6

La procédure est la suivante :

Proc procéduregénérale()

Dim Nom En Chaîne ' déclare la variable Nom en chaîne
Dim Prénom En Chaîne 'Déclare la variable prénom en chaîne
Dim Salaire En Simple ' Déclare la variable salaire en réél simple
bonjour = "Bonjour et bienvenue à VBA Planète"
Affichemessage bonjour
Nom = InputBox("Entrez votre nom", " Saisie du nom")
'Affichage d'une boîte de saisie pour le prénom
Prenom = InputBox("Entrez votre prénom", " Saisie du prénom")
'Affichage d'une boîte de saisie pour le salaire (le texte est personnalisé gràçe
' aux variables nom et prénom
' Le résultat de la boîte de saisie est converti en réél simple grace à la fonction Csimple(...)
Salaire = CSng(InputBox("M/Mme " & Nom & " " & Prénom & " saisissez votre salaire mensuel", _ " Saisie du salaire", 1))
'Affichage des cellules de titre obtenu grâce à l'enregistreur de macro (voir remarque 3)
Sheets("Exemple1").Select
Range("B4").Select
ActiveCell.FormulaR1C1 = "Nom"
Range("B5").Select
ActiveCell.FormulaR1C1 = "Prénom"
Range("B6").Select
ActiveCell.FormulaR1C1 = "Salaire"
‘Affichage des variables saisies par l’utilisateur dans la feuille de calcul (voir remarque 4)
Range("C4").FormulaR1C1 = Nom
Range("C5").FormulaR1C1 = Prenom
Range("C6").FormulaR1C1 = Salaire

End Sub


Commentaires :

1) Les lignes en italique correspondent aux lignes rajoutées
2) Les instructions Dim et Inputbox sont à saisir au clavier.
3) En revanche, l’affichage des cellules de titre peut être obtenu avec l’enregistreur de macro :
Il faut pour cela créer une nouvelle macro depuis la feuille de calcul (menu Outils – Macro –Nouvelle Macro…) la nommer (Bidon par exemple) et enregistrer les manipulations suivantes :

* Démarrez l’enregistrement
* sélectionnez la feuille Exemple1
* cliquez dans la cellule B2 et saisissez : Nom
* Cliquez dans la cellule C5 et saisissez : Prénom
* Cliquez dans la cellule C6 et saisissez : Salaire
* Arrêtez l’enregistrement
* Dans l’éditeur VBA, sélectionnez les portions de code concernant l’affichage de « nom », prénom » et « salaires » dans la procédure « Bidon », faites un Copier puis collez le code dans la procédure « Procédure générale() » avant End Sub.

4) Pour alléger le code, il est possible de réunir une instruction. Range(« … »).Select et. Activecell.FormulaR1C1 = en et Range(« … »).FormulaR1C1 =…
Dans les 3 dernières lignes de code Nom, Prenom et Salaire correspondent aux variables définies dans l’instruction Dim et saisie par l’utilisateur


Une fois la procédure enregistrée, sélectionnez la feuille EXEMPLE1 et exécutez la macro 2 fois au moins pour en tester le fonctionnement (ou mieux, insérez un clipart et affectez lui la macro « Procéduregenerale »)

Remarque : A chaque exécution de la macro, Excel réinscrit les titres de lignes dans la feuille d’où perte de temps. C’est pourquoi il est préférable de créer la structure du tableau au préalable.

ENREGISTREZ LE CLASSEUR SOUS LE NOM VBAPLAN.XLS


III/ Les structures alternatives

A/ La structure IF Condition THEN … ELSE…v(Si condition Alors .... Sinon ... Fin Si)

Cette structure a déjà été étudiée dans le cas DEPENS. Elle permet d’exécuter du code à partir d’une condition posée. La structure est la suivante :

If condition Then
Actions si condition vraie
Else
Actions si condition fausse
End If

On peut imbriquer plusieurs fonctions Si de la manière suivante :

If condition1 Then
Actions si condition1 vraie
ElseIf Condition2 Then
Actions si condition2 vraie
ElseIf Condition3 vraie Then
Actions si condition3 vraie
Else
Endif

B/ La structure alternative Selon cas ...Cas … Cas Sinon ... Fin Selon (Select Case… Case … Case Else … End Select)

Syntaxe VBA :

Select Case Expressiontestée
Case condition1
Actions si condition1 vrai
Case condition2
Action si condition2 vrai
......
Cas Else
Action si Expression testée ne rentre dans aucun des cas précédents
End Select

Cette structure remplace avantageusement la structure Si ... Alors ... Sinon ... Fin Si pour les calculs de ristournes conditionnelles

Exemple 1: On veut créer la fonction personnalisée ristourne(Caff) permettant de déterminer, à partir d’un chiffre d’affaires déterminé, la ristourne à accorder en fonction des règles suivantes :
- Caff <=10000 ->ristourne = 0
- Caff compris entre 10000 et 50000 -> ristourne = 10% * Caff
- Caff compris entre 50000 et 100000 -> ristourne = Caff*12%
- Caff >100000 -> ristourne=Caff*15%

Avec la fonction Si on aurait obtenu le code suivant :

Function ristourne(caff) 'Définit la fonction Ristourne avec un seul argument : Caff
If caff <= 10000 Then ristourne=0 ' Si Caff<=10000
'Alors la fonction ristourne retourne la valeur 0
ElseIf caff <= 50000 Then ' sinon si Caff <=50000 alors ristourne a pour valeur
ristourne = caff * 0,1 'CA*0.1 (A noter qu'en V.B.A. 10% n'est pas admis et que le
' séparateur de décimal est obligatoirement la virgule
ElseIf caff <= 100000 Then ' Sinon (le Caff est > 50000
'Si Caff <= 100000 Alors ristourne renvoie la valeur
ristourne = caff * 0,12 'Caff*0.12
ElseIf 'Sinon (Donc le Caff est obligatoirement supérieur
ristourne = caff * 0,15 'à 100000 donc ristourne renvoie la valeur Caff*0.15
End If ' Fermeture du 3ème Si
End If 'Fermeture du 2ème Si
End If 'Fermeture du 1er Si
End Function 'Met fin à la fonction

Avec la structure Select Case la macro fonction devient :

Function Ristourne (Caff)

Select Case Caff
Case Is <= 10000
Ristourne = 0
Case is 10000 To 50000
Ristourne = Caff * 0,1
Case 50000 To 100000
Ristourne = Caff * 0,12
Case Is > 100000
Ristourne = Caff * 0,15
Case Else
End Select

End Function


Commentaire : Pour poser la condition, on utilise le mot Is suivi d’un opérateur de comparaison (<;<=;>;>=;<>).
Lorsque la condition concerne une fourchette, on indique la limite inférieure et la limite supérieure séparées par le mot To

exemple : Case 10000 To 50000

Si Case contient plusieurs valeurs, on les sépare par un point virgule.
Exemple : Case 10 , 12

Remarque le bloc d’instructions Select Case … End Select peut figurer également dans une procédure.
Test de la personnalisée dans la feuille de calcul : Saisissez la formule =RISTOURNE(70000) et Excel affichera alors le résultat soit 8400
Test de la fonction dans une procédure : la portion de code suivante déclare les variables CA et Rist, invite l’utilisateur à saisir le Chiffres d’affaires, calcule la ristourne et affiche une boîte de dialogue affichant le montant de la ristourne :
Dim Caff , rist As Single
Dim Reponse As Integer
Caff=Inputbox(“Saisissez le chiffre d’affaires annuel” , “Saisie du CA”)
Rist=Ristourne(Caff)
Reponse=MsgBox(« Le montant de la ristourne est de » & Cstr(Rist) , VbOkOnly, « Montant de la ristourne »)
Remarque : la Variable Reponse prendra toujours comme valeur 0, car seul le bouton OK sera affiché par la fonction MsgBox.
L’instruction CStr permet de convertir un nombre en texte

IV Les structures itératives et les variables de type tableau

Visual Basic offre différentes instructions pour exécuter à plusieurs reprises les mêmes lignes de commandes (en programmation, on appelle cela des boucles).

L’utilisation de variables de type tableau permettent d’optimiser les boucles.

A/ Les variables de type tableau

1) Tableau unidimensionnel

Supposons que l’on souhaite garder en mémoire des noms d’élèves. On pourrait utiliser une variable par élève comme ci-après :

Nomeleve1=« Albert »
Nomeleve2=« Brett »
Nomeleve3=« Cardigan »
...
Nomeleve30=« Zorki »

Pour opérer un traitement sur les noms d’élèves, il faudrait créer à chaque fois 30 lignes de code (une ligne pour chaque variable)
Ce serait inconcevable, heureusement, V.B.A. permet de définir des variables Tableau, ce qui donnerait dans l’exemple :

Nomeleve(1)= « Albert »
Nomeleve(2) =« Brett »
Nomeleve(3) =« Cardigan »
...
Nomeleve(30) =« Zorki »


Dans une procédure V.B.A. on pourrait alors envisager ce type de traitement :

Entrée du n° d’éléve ==> I
Afficher Nomeleve(I)

L’utilisateur saisit alors Un numéro d’élève compris entre 1 et 30 et l’ordinateur affiche le nom de l’élève.


2) Tableau à plusieurs dimensions

Supposons cette fois ci que l’on souhaite conserver en mémoire les trois notes de devoir des 30 élèves précédents

Le tableau des notes serait alors le suivant :

Numéro de DS
Numéro d’élève
1
2
3
1
10
12
8
2
6
15
4
3
11
10
9
...



30
17
8
6

Il faut ici définir une variable tableau à deux dimensions :

Note(Numeleve ; Numds)

Par exemple la variable Note(2;3) contient la valeur 4 c’est à dire la la note de l’élève 2 pour le DS N°3


3) Déclaration de variables tableau

Comme toute variable, il est conseillé de déclarer les tableaux avec les instructions

Dim nomtableau(limitesup , limite sup,...) (à l’intérieur d’une procédure ou en début de module)
Public nomtableau(limitesup , limitesup...) (en tête de module)
Static nomtableau(limitesup , limitesup...) (en tête de procédure ou de module)
On peut également définir une limite inférieure avec le mot clé To

EXEMPLES :

Dim Nomeleve(30) As Texte ‘ Déclare le tableau Nomeleve en Texte avec 31 éléments maxi (indexés de 0 à 30)
Dim Note(30 , 3) As Single ‘ Déclare le tableau Note En réél simple avec 4 lignes (0 à 3) et 31 colonnes (0 à 30)
OU
Dim Note (1 To 30 , 1 To 3) As Single ‘Déclare le tableau Note En réél simple avec 3 lignes (1 à 3) et 30 colonnes (1 à 30)
Dans les exemples, les tableaux sont de taille fixe. Pour prévoir une taille variable on utilise l’instruction ReDim


Exemple :

Dim Nomeleve() As String ‘Déclare le tableau Nomeleve de dimension vide

Dim x As Integer ‘Déclare la variable x en entier
...
x=CInt(InputBox( « Entrez le nombre d’élèves de la classe » , « Saisie du nombre d’élèves »))
ReDim Nomeleve(x)
...
Cette procédure affiche une boîte de saisie(avec un seul bouton Ok) invitant l’utilisateur à saisir le nombre d’élèves. La fonction Cint convertit la saisie en un nombre entier

Le nombre d’élèves est enregistré dans la variable x.

La dernière instruction redimensionne la variable Nomeleve (si x=20 => nomeleve comportera 20 éléments...)


B/ La boucle FOR … NEXT (Pour ... Suivant)

La boucle For ...Next permet de répéter un nombre de fois déterminé une suite d’instructions.

Algorithme :

Pour compteur = valeur début à Valeurfin
Instructions
Suivant compteur
Syntaxe VBA
For compteur = valeur début To Valeurfin
Instructions
Next compteur

exemple 1

Sub Poursuiv1()
Dim X As Integer
X=0
For I=1 To 10
X=X+I
Debug.Print X
Next I
End Sub










Dans cet exemple, on calcule la somme des 10 premiers chiffres (suite arithmétique de 10 termes, premier terme= 0, raison= 1) et on affecte le résultat à la variable X. La variable compteur I est incrémenté de 1 à chaque boucle
A la fin de la procédure X vaut 55.

L’instruction Debug.Print permet d’afficher des données dans une fenêtre particulière appelée « Fenêtre d’éxécution ».

Pour ouvrir la fenêtre d’Exécution - activer le menu Affichage - Fenêtre d’exécution à partir de VBA Editeur.
A chaque boucle, I est incrémenté de 1

Exemple 2 : modification de la valeur du pas


Sub Poursuiv2()
X=0
For I=1 To 10 Step 2
X=X+I
Debug.Print
Next I
End Sub










Dans cet exemple, I augmente de 2 en 2. Cette procédure revient à faire l’addition 1+3+5+7+9
I prend comme donc comme valeur maximum 9

Exemple 3 : Boucle For … Next imbriqué


Sub Tabledemultiplication()
For I= 1 To 5
Debug.Print « ***** Table de multiplication de »;I ; « ***** »
For J=1 To 10
X = I*J
Debug.Print I; « X » ;J; « = » ;X
Next J
Debug.Print « ------------------------------------------------------ »
‘ affiche une ligne de tiret à la fin de chaque table
Next I
End Sub












La procédure précédente permet d’afficher dans la fenêtre d’exécution les cinq premières tables de multiplication.

Au début de chaque table (Boucle For I) on affiche :***** Table de multiplication de I *****
Pour chaque table on affiche I X J = X

Ce qui donne dans la fenêtre d’exécution :

***** Table de multiplication de 1 *****
1 X 1 = 1
1 X 2 = 2
...
1 X 10=10
------------------------------------------------------
***** Table de multiplication de 1 *****
2 X 1 = 2
2 X 2 = 4
...
2 X10=20

Exemple 4

La procédure suivante compte le nombre de feuilles du classeur actif
et affiche le nom de chaque feuille dans la fenêtre d’exécution



Sub Nomdefeuille()

n = ActiveWorkbook.Sheets.Count ' Calcule le nombre de feuilles du classeur actif

Debug.Print "Le nombre de feuilles du classeur est de "; n

For I = 1 To n
Debug.Print "la feuille n° "; I; " a pour nom : "; Sheets(I).Name
Next I

End Sub

















Remarque : La fonction Pour Chaque ... Suivant permet de résoudre le même type de problème plus rapidement (Cf paragraphe B/)

Application guidée :

Saisie de variables tableau à l’aide d’une boîte de saisie puis remplissage d’une feuille de calcul

L’objectif consiste à saisir Des noms d’élèves puis leur note dans des variables tableau. Le contenu des variables sera ensuite inséré dans une feuille de calcul.

Contraintes :

- le nombre d’élèves et le nombre de devoirs est libre
- L’utilisateur doit pouvoir choisir les notes DS par DS ou saisir les notes élève par élève

Instructions et fonction utilisées :

Ce cas permet d’utiliser les fonctions et instructions suivantes :

- Dim
- InputBox
- For … Next
- If … Then … Else … End If
- Selcet Case ... End Select

Conditions préalables :

- Ouvrez un nouveau classeur
- Renommez une feuille vierge avec le nom NOTE

- Insérez une feuille de module
- Enregistrez le classeur sous le nom Note

Le listing complet de la procédure Saisienote vous est communiqué ci-après :



Sub saisienote()

'Section de déclaration des variables
Dim Nbeleve As Integer 'Nbre d'élèves
Dim Nbds As Integer 'Nbre de DS
Dim Nomeleve() As String 'tableau dynamique des nom d'élèves
Dim Note() As Single 'Tableau dynamique des notes de DS
Dim Msg As String ' variable contenant le texte de la boite de saisie
Dim Msg2 As String
Dim Titre As String
Dim Opt As Integer 'Définit les options de saisie des notes
'
'Saisie du nombre d'élèves et de DS (valeur par défaut : 1 élève et 1 DS)
Nbeleve = Cint(InputBox("Entrez le nombre d'élèves "; "Nombre d'élèves "; 1))
Nbds = CInt(InputBox("Entrez le nombre de DS à saisir "; "Nombre de DS "; 1))
' Dimensionnement des variables tableau en fonction des valeurs entrées
' par l'utilisateur
ReDim Nomeleve(Nbeleve)
ReDim Note(Nbeleve , Nbds)
'
'Saisie des noms d'élèves
Titre = "Saisie des élèves"
For I = 1 To Nbeleve
Msg = "Saisissez le nom de l'élève n° " & CStr(I)
Nomeleve(I) = Cstring(InputBox(Msg; Titre; ""))
Next I
'
' saisie des notes
' Demande à l'utilisateur s'il veut saisir ses notes DS par DS (en colonne)
' ou Eleve par élève (en ligne)
Msg = "Saisie des notes DS par DS :entrez 1 - saisie des notes élève par élève : entrez 2"
Titre = "Options de saisie des notes"
'
Opt = CInt(InputBox(Msg; Titre; 1))
Select Case Opt
Case 1 ' Saisie des DS en colonnes
Titre = "saisie des notes DS par DS"
For I = 1 To Nbds 'boucle principale
' la ligne suivante prépare le message de la boîte de saisie de notes
Msg = "DS n° " & CStr(I) & " - nom de l'élève :"
For J = 1 To Nbeleve
' la ligne qui suit contient le message personnalisée de saisie
Msg2 = Msg & Nomeleve(J)
' saisie des notes proprement dite
Note(J; I) = CSng(InputBox(Msg2; Titre))
Next J
Next I
Case 2 ' Saisie des Notes élève par élève
Titre = "saisie des notes Eleve par eleve"
For I = 1 To Nbeleve 'boucle principale
' la ligne suivante prépare le message de la boîte de saisie de notes
Msg = "Nom de l'élève : " & Nomeleve(I) & " - DS n° "
For J = 1 To Nbds
' la ligne qui suit contient le message personnalisé de saisie
Msg2 = Msg & Cstr(J)
' saisie des notes proprement dite
Note(I; J) = CSimple(BoîteSaisie(Msg2; Titre))
Next J
Next I
Case Else ' si l'option n'est ni 1 ni 2
Exit Sub ' on fait sortir l'utilisateur de la procédure
End Select
' Les lignes suivantes ont pour effet de copier les noms et notes des élèves
' dans la feuille de calcul Note
Sheets("NOTE").Select
For I = 1 To Nbeleve
Cells(I + 1; 1).Valeur = Nomeleve(I) ' Recopie du noms des élèves à partir
' de la cellule A2 (ligne I+1 et colonne 2)
Next I
For I = 1 To Nbds
For J = 1 To Nbeleve ' Recopie les notes des élèves à partir
Cells(J + 1; I + 1).Value = Note(J; I) ' de la celluleB2 (ligne j+1, colonne
Next J
Next I

End Sub
























































































A titre de jeu d’essai, utilisez les données suivantes et essayez les deux modes de saisie.

N° de DS
Nom des Eleves
1
2
3
JEAN
15
5
3
PHILIPPE
16
7
8
ANDRE
12
8
13
PAUL
12
9
12
MARTINE
10
11
14
DANY
15
14
11
YVELINE
16
13
9

C/ La boucle FOR EACH … Next (Pour Chaque .... Suivant)

Structure algorithmique:

Pour Chaque élément Dans Groupe
actions
Suivant élément

Syntaxe VBA :

For Each élément In Groupe
actions
Next élément


Cette boucle permet d’appliquer des actions spécifiques à chaque élément appartenant à un groupe d’objets lorsqu’on ne connait pas à l’avance le nombre d’éléments. Elle concerne essentiellement les collections d’objets : une collection d’objets regroupe tous les objets de même nature. Elle s’applique également aux variables de type tableau

Exemple, la collection WorkBooks (classeurs) regroupe tous les objets WorkBook (le nom d’une collection d’objet est au pluriel)

On accède à un objet déterminé d’une collection de deux manières :
- par son nom : exemple Sheets(« Feuil1 ») désigne la feuilles feuil1
- par un indice représentant le rang de l’objet dans la collection. si Feuil1 est la première feuille du classeur, alors Sheets(1) est équivalent à Feuilles(« Feuil1 »).


EXEMPLE N° 1

La procédure suivante augmente de 1 la valeur de chaque cellule de la plage sélectionnée


Sub Incrémentationcellules()

‘ La variable Cellule fait référence à chaque cellule de la sélection
‘ La propriété Selection désigne la plage de cellule sélectionnée dans une feuille

For Each Cellule In Selection
Cellule.Value=Cellule.Value+1
Next Cellule

End Sub














Lancement de la macro :

Sélectionnez une plage de cellules dans une feuille vierge et lancez la macro (avec le menu Macro...)
La valeur des cellules sera augmenté de 1

Exemple 2

La procédure suivante créée une série incrémentée dans la zone sélectionnée


Sub Sérieincrémentée()

‘ La variable Cellule fait référence à chaque cellule de la sélection
‘ L’objet Sélection désigne la plage sélectionnée dans une feuille

I=0 ‘Initialisation du compteur de boucle
For Each Cellule In Selection
I=I+1 ‘à chaque boucle I augmente de 1
Cellule.Value=I ‘ On affecte à chaque cellule la valeur de I

Next Cellule
End Sub
















Exemple 3 :

Dans cet exemple, on teste chaque barre d’outils pour savoir si elle est affichée ou fermée.Si une barre d’outil est fermée, on l’affiche. inversement, si une barre d’outils est affichée, on la ferme.

Sub AfficheFermeBarreoutils()

' la variable B représente chaque objet Barreoutil appartenant à
' la collection ToolBars
n = Toolbars.Count 'On compte le nombre de barres d'outils
i = 0
For Each B In Toolbars
i = i + 1 'Compteur
If i < n Then 'Si i est strictement inférieur au nbre de barres
If B.Visible = False Then 'alors
B.Visible = True ' Si B n'est pas affiché Alors on l'affiche
Else
B.Visible = False 'Sinon On ferme la barre d'outils
End If
Debug.Print "barre n° " & CStr(i) & B.Name & " " & B.Visible ‘affichage du n° de barre, de son nom et de son état (affiché ou non)
Else
End If
Next B
End Sub

REMARQUES :

L’instruction Toolbars.Count compte le nombre de barres d’outils. La dernière barre d’outils génère une erreur, d’où le tes If i
A la première exécution, les barres d’outils qui étaient affichées sont fermées , et inversement

Une deuxième exécution permet alors de retrouver les barres d’outils initialement affichées

On peut également masquer toutes les feuilles d’un classeur, imprimer toutes les feuilles... grâce à la boucle For Each…Next.

Exemple 4

Cet exemple permet d’obtenir le numéro et le nom de chaque feuille et place le résultat à partir de la cellule A1 d’une feuille vierge préalablement nommée LISTEFEUILLES


Sub nomdesfeuillesduclasseur()
Dim I As Integer ' Compteur
Dim Nomfeuille As String ' Variable qui contiendra le nom de
' chaque feuille
I = 0 ' Initialisation du compteur
For Each F In Sheets
I = I + 1 ' désigne le numéro de ligne de la feuille
' active
Nomfeuille = F.Name ' la variable Nomfeuille contient la valeur de la
' propriété Nom de l'objet Feuille
' la ligne suivante place dans la cellule référencée par la colonne A et la ligne I
' de la feuille nommée LISTEFEUILLES
' le message : La feuille n° ... est nommée : ....
' le contenu de I est converti en chaîne de caractères
‘ le trait de soulignement _ permet de continuer une instruction sur la ligne suivante

Sheets("LISTEFEUILLES").Cells(I; 1).Value = "La feuille n° " & CStr(I) & " est nommée : " _
& Nomfeuille
Next F
End Sub




























Attention : avant d’exécuter la macro, n’oubliez pas de nommer une feuille de calcul vierge avec le nom LISTEFEUILLES

E/ L’instruction DO … LOOP (Faire Boucle)

Elle permet de répéter un nombre indéterminé de fois une ou plusieurs instructions en fonction d’une condition déterminée.

Elle est particulièrement intéressante dans les contrôles de saisie

Elle comprend 4 variantes comme il est indiqué dans le tableau suivant :

Structure(s) :

Variante 1

Faire Jusque Condition
Actions si condition vraie
Boucle

Do While Condition
Actions si condition vraie

Loop


Exécute les instructions dans la boucle jusqu’à ce que la condition soit vérifiée. Si la condition n’est jamais vérifiée, la boucle ne sera jamais réalisée
Variante 2

Faire TantQue Condition
Actions si condition vraie
Boucle

Do Until Condition
Actions si condition vraie

Loop


Tant que la condition est vérifiée, la boucle s’exécutera
Variante 3

Faire
Actions
Boucle Jusque condition

Do

Actions
Loop While Condition

Dans cette variante, la boucle est exécutée au moins une fois
Variante 4

Faire
Actions
Boucle Tant que condition

Do

Actions
Loop Until Condition

Dans cette variante la boucle est exécutée obligatoirement une fois. Si la condition est vraie, la boucle sera de nouveau exécutée


































Pour sortir d’une boucle, on utilise l’instruction Exit Do.
Comme les boucles For … Next, les boucles Do … Loop peuvent être imbriquées

EXEMPLE 1


Sub Saisienomeleve()
Dim Nomeleve(10) As String 'Déclare un tableau de 10 éléments en chaîne
I = 0
'la boucle suivante est exécutée jusqu'à l'entrée de F ou f
' la première fois la boucle est exécutée car la variable nomeleve(0) est vide
Do Until Nomeleve(I) = "F" Or Nomeleve(I) = "f"
I = I + 1
Nomeleve(I) = Cstr(InputBox("Entrez le nom - F pour finir "; "Saisie des eleves"))
Debug.Print"Eleve n° "; I; " "; Nomeleve(I)
‘ la ligne suivante teste le nombre d’élèves
If I > 10 Then
Exit Do ‘ si I>10 alors on sort de la boucle
Else
End If
Loop
End Sub




0 commentaires:

Enregistrer un commentaire

Share

Twitter Delicious Facebook Digg Stumbleupon Favorites

 

IP