chapitre 2 programmation en visual basic. 2 application visual basic feuilles d'application...
TRANSCRIPT
Chapitre 2Programmation en Visual Basic
2
Application Visual Basic
feuilles d'application programmes VB
Sub OK_click () Feuille_salaire.unload msgbox "calcul des salaires de " & mois.Text & " en cours" calcule_salaires(mois.Text)End Sub
Sub OK_click () Feuille_salaire.unload msgbox "calcul des salaires de " & mois.Text & " en cours" calcule_salaires(mois.Text)End Sub
Sub OK_click () Feuille_salaire.unload msgbox "calcul des salaires de " & mois.Text & " en cours" calcule_salaires(mois.Text)End Sub
Sub OK_click () Feuille_salaire.unload msgbox "calcul des salaires de " & mois.Text & " en cours" calcule_salaires(mois.Text)End Sub
+
3
Passage de l'algorithmique à Visual Basic
Le passage de l'algorithmique à la programmation en Visual Basic est réalisé en deux étapes:
Transformation du lexique en une série de déclarations Visual Basic
Transformation des algorithmes en un programme Visual Basic
4
Programme associé à une feuille d'application
Le code associé à une feuille d'application comporte trois parties :
on peut écrire des actions communes à plusieurs feuilles dans un module VB (xxx.bas)
déclarations
procéduresévénementielles
procéduresgénérales
Feuille1.frm
5
Les déclarations
Permettent de construire le lexique : définition des variables : dim , public définition des constantes : const
Les identificateurs de variables et de constantes en Visual Basic : commencent par une lettre, sont composés de lettres, chiffres et _ Exemples :
– mon_idf– mon_idf2– 2x : identificateur incorrect
Typage des objets : integer entier entre -32 767 et 32 767 long entier entre -2.109 et 2.109
single réel simple précision double réel double précision string chaîne de caractères boolean true ou false variant n'importe quel type défini par le programmeur
6
Déclarations: règles de visibilité des objets
Dans le lexique global (objet Général, onglet Déclarations) d’une feuille d’application ou d’un module VB:
dim et const déclarent des objets existant dans la totalité de cette feuille ou de ce module
Dans une procédure ou une fonction d’une feuille d’application ou d’un module VB :
dim et const déclarent des objets existant uniquement dans cette procédure ou fonction (déclaration locale)
Dans le lexique global (objet Général, onglet Déclarations) d’un module VB : Public déclare des objets existant dans tous les modules et les feuilles
(déclaration globale)
Exemples de déclarations : dim i as integer Public const pi = 3.145927
7
Règles de visibilité des objets : exemple
frm1.frm
déclarations (Général)
dim i1 as integer
procédures
Sub proc1()dim j as integer ... call proc2End Sub
Sub proc2()dim k as integer ...End Sub
peut accéder aux valeurs de i1, j, et g, mais pas de k, l, m, p, q, x et i2
frm2.frm
procédures
Sub proc3()dim l as integer ...End Sub
Sub proc4()dim m as integer ...
End Sub
Const i2 as integer
déclarations (Général)
module1.bas
procédures
Sub proc5()dim p as integer ...
p = fun6(1)End Sub
Function fun6(y as Long) as Longdim q as integer ...End Function
Public g as integerdim x as integer
déclarations (Général)
call proc3
peut accéder aux valeurs de i1, k, et g, mais pas de j, l, m, p, q, x et i2
peut accéder aux valeurs de i2, l, et g, mais pas de j, k, m, p, q, x et i1
peut accéder aux valeurs de i2, m, et g, mais pas de j, k, l, p, q, x et i1
peut accéder aux valeurs de g, p et x, mais pas de j, k, l, m, q, i1, i2
peut accéder aux valeurs de g, q, x, y mais pas de j, k, l, m, p, i1, i2
8
Définition et appel d’une procédure
Définition d'une procédure :
Sub nom_procédure(param1 as type1, ..., paramn as typen) déclarations instructionsEnd Sub
exemple :
Sub afficher_carres(min as integer, max as integer)Dim i as integer ' compteur
For i = min To max Debug.Print i*i Next i
End Sub
Appel d'une procédure : call nom_procédure(val1 , ..., valn) exemple : call afficher_carres(3,7)
NB: lorsqu’une procédure a 0 ou 1 paramètre, call n’est pas obligatoire
9
Définition et appel d’une fonction
Définition d'une fonction :
Function nom_fonction(param1 as type1, ..., paramn as typen) as type déclarations instructionsEnd Function
Une définition de fonction se termine par l'affectation d'une variable de même nom que la fonction et qui correspond au résultat de la fonction
Exemple :
Function surface(long as double, large as double) as double surface = long * large
End Function
Appel d'une fonction : nom_fonction(val1 , ..., valn)
exemple : If surface(7,x) < 20 Then s = surface(8,x)
10
Procédures événementielles et proc. générales
Procédures événementielles : permettent de traiter un événement concernant un objet graphique (ex : Form_load(), cmd_ok_click(), txt1_change(), …)
sont toujours écrites dans une feuille d’application
Procédures générales : permettent d'écrire des actions intermédiaires utilisables dans différentes parties
du logiciel
sont écrites dans une feuille d’application si elle concernent une feuille particulière, et dans un module VB sinon
Principe de programmation en VB : tous les traitements complexes sont réalisés dans des procédures générales
11
Les procédures événementielles
La liste des objets du formulaire est accessible par la boîte combo Objet
La liste des événements et méthodes spécifiques au type de l’objet est accessible par la boîte combo Proc
12
Les procédures générales
Une procédure générale (ou procédure - tout court) peut être appelée par : une procédure événementielle par une procédure générale
13
Règles de visibilité des procédures et des fonctions
Dans une feuille d’application : une procédure ou fonction définie peut uniquement être appelée depuis cette
feuille (par une autre procédure ou fonction)
Dans un module Basic : Private indique une procédure ou fonction visible seulement dans ce module Public indique une procédure ou fonction visible dans tous les modules En l’absence de Private et Public, une procédure ou fonction est définie Public
14
Visibilité des procédures et des fonctions : exemple
frm1.frm
déclarations (Général)
dim i1 as integer
procédures
Sub proc1 ()dim j as integer ... call proc2End Sub
Sub proc2 ()dim k as integer ...End Sub
peut appeler proc1, proc2, et fun6 mais pas proc3, ni proc4,ni proc5
frm2.frm
procédures
Sub proc3 ()dim l as integer ...End Sub
Sub proc4 ()dim m as integer ...
End Sub
dim i2 as integer
déclarations (Général)
call proc3
peut appeler proc1, proc2 et fun6 mais pas proc3, ni proc4, ni proc5
peut appeler proc3, proc4 et fun6 mais pas proc1, ni proc2, ni proc5
peut appeler proc3, proc4 et fun6 mais pas proc1, ni proc2, ni proc5
peut appeler proc5 et fun6, mais pas proc1, ni proc2, ni proc3, ni proc4
peut appeler proc5 et fun6, mais pas proc1, ni proc2, ni proc3, ni proc4
module1.bas
procédures
Private Sub proc5()dim p as integer ...
p = fun6(1)End Sub
Function fun6(y as Long) as Longdim q as integer ...End Function
Public g as integerdim x as integer
déclarations (Général)
15
Exercice 1
On veut réaliser un logiciel VB comprenant deux feuilles : frm1 et frm2. frm1 utilise les procédures p1, p2 et p4 frm1 utilise les variables a et b frm2 utilise les procédures p1, p2 et p3 frm2 utilise les variables a et c p1 utilise la variable x p2 utilise les variables x, z et v p3 utilise la variable z p4 utilise la variable w
Indiquez dans quels feuilles et/ou modules VB seront placées les procédures et les variables correspondant à l'exemple ci-dessus
16
Exercice 2
1. Ecrire la fonction fact(n as Integer) qui retourne la factorielle du nombre n
2. Sachant que le nombre de combinaisons de p éléments dans un ensemble de n éléments est défini par :
écrire la fonction combinaison(n as Integer, p as Integer).
3. Construire l’interface ci-dessous. Un clic sur le bouton Cnp affiche le nombre de combinaisons dans une boîte de message
!)(!
!
pnp
nC p
n
17
Exercice 3
Construire un projet VB contenant deux feuilles d’applications : un convertisseur € $ un convertisseur $ €
Remarque : la constante de parité € $ ne devra être définie qu’une seul fois dans le
logiciel
18
Instructions simples
Affectation : notée = exemples :
x = 3txt_nom.visible = false
Séparateur d'instructions: : (inutile à la fin d'une ligne) exemple :
x = x + 1: y = y + 1z = z + 1
Commentaires: après le caractère ' exemple :
z = z + 1 ' augmente z de 1
19
Conditionnelles
Si-alors
Si-alors-sinon
Si-alors-sinon en cascade
If condition Then instructionIf condition Then instruction
Mono-ligne :
If condition Then instructionsEnd If
If condition Then instructionsEnd If
Multi-ligne :
If condition Then inst1 Else inst2If condition Then inst1 Else inst2
Mono-ligne :
If condition Then instructions1Else instructions2End If
If condition Then instructions1Else instructions2End If
Multi-ligne :
If cond1 Then instructions1
ElseIf cond2 Then instructions2…Else instructionsnEnd If
If cond1 Then instructions1
ElseIf cond2 Then instructions2…Else instructionsnEnd If
!Saut de ligne obligatoire après Then et Else dans la forme multi-ligne
20
Conditionnelles (suite)
Sélections multiples :
Exemple :Select case carcase "'"
type_car = "quote"case ",", ";", ".", ":", "!", "?"
type_car = "ponctuation"case "0" To "9"
type_car = "chiffre"case "a" To "z", "A" To "Z"
type_car = "lettre"case Else
type_car = "caractère inconnu"End Select
Select case variable case liste-valeurs1
instructions1
case liste-valeurs2
instructions2 … case liste-valeursn instructionsn End Select
Select case variable case liste-valeurs1
instructions1
case liste-valeurs2
instructions2 … case liste-valeursn instructionsn End Select
21
Iterations
Boucles "tant que" :
Exemple :
i = 1do while i <= 4debug.print i : i = i + 1loop
Do while condition instructionsLoop
Do while condition instructionsLoop
22
Iterations (suite)
Boucles "répéter ... jusqu'à"
Exemple:
i = 1do debug.print i : i = i + 1loop until i = 5
Boucles "pour" :
Exemple:
for i = 1 to 4 debug.print inext i
Do instructionsLoop Until condition
Do instructionsLoop Until condition
For variable = valeur-initiale To valeur-finale instructionsNext variable
For variable = valeur-initiale To valeur-finale instructionsNext variable
23
Les principaux opérateurs
Opérateurs logiques
Opérateurs arithmétiques
Opérateurs sur les chaînes de caractères
Opérateur Signification
e1 And e2et
Not e non
e1 Or e2ou
e1 Xor e2 ou exclusif (soit e1, soit e2)
Opérateur Signification
=, <>, >, <, >=, <= =, , >, <, ,
Opérateur Signification
s1 & s2concaténation (mise bout-à-bout)
s Like motif s est semblable à motif (motif contient des car. * ? ...)
24
Les fonctions prédéfinies de Visual Basic
Visual Basic dispose d'un grand nombre de fonctions prédéfinies : mathématiques chaînes de caractères, caractères conversion de types, formatage financières date et heure fichiers séquentiels bases de données gestion des erreurs accès à MS-DOS échange de données avec d'autres logiciels ...
25
Principales fonctions mathématiques
Fonction Signification exemple
+,-,*,/ +, -, , /
x \ y x div y 5 \ 2 2
x Mod y x mod y 5 mod 2 1
x ^ y xy 2^3 8
Abs(x) |x| Abs(-3.2) 3.2
Cos(x) cos x Cos(0) 1
Exp(x) ex Exp(1) 2.718282
Fix(x) retourne l'entier sans les décimales Fix(-3.2) -3
Int(x) E(x) partie entière Int(-3.2) -4
Log(x) ln x Log(Exp(1)) 1
Rnd() retourne un nombre aléatoire entre 0 et 1 1 + Rnd() * 5
Sin(x) sin x Sin(0) 0
26
Exercice 4
Ecrire la fonction entier_aleatoire(min as Long, max as Long) qui retourne un nombre entier aléatoire entre min et max.
27
Principales fonctions sur les chaînes de caractères
Fonction Signification exempleInstr(s, ss) position de la première occurrence de la sous-
chaîne ss dans la chaîne sInstr("ok ok","ok") 1
Lcase(s) convertit en minuscules tous les caractères alphabétiques de s
Lcase("OK !")"ok !"
Left(s,n) chaîne correspondant aux n caractères de gauche de s
Left("Hello",4) "Hell"
Len(s) nombre de caractères de la chaîne s Len("bonjour !") 9
LTrim(n) chaîne où les espaces qui sont au début de s sont supprimés
LTrim(" ok ! ") "ok ! "
Mid(s, n1, n2) chaîne correspondant aux n2 caractères pris à partir de la position n1 dans s
Mid("Salut",3,2) "lu"
Right(s,n) chaîne correspondant aux n caractères de droite de s
Right("Hello",2) "lo"
RTrim(s) chaîne où les espaces qui sont à la fin de s sont supprimés
RTrim(" ok ! ") " ok !"
String(n,c) chaîne composée de n fois le caractère c String(3,"a") "aaa"
Trim(s) chaîne où les espaces qui sont au début et à la fin de s sont supprimés
Trim(" ok ! ") "ok !"
Ucase(s) convertit en majuscules tous les caractères alphabétiques de s
Ucase("hé") "HÉ"!
28
Fonctions sur les chaînes de caractères : exercices
Exercice 5 : écrire une fonction qui teste si un caractère est une ponctuation
Exercice 6 : écrire la fonction insere_caractere(s as String, c as String, pos as Integer) as String qui retourne la chaîne s dans laquelle le caractère c a été inséré en position pos
Exercice 7: écrire une fonction qui étant donnée un chemin MS-DOS, absolu ou relatif, retourne la base du nom de fichier
"c:\mes documents\page1.html" "page1" "page2.bak" "page2"
29
Fonctions sur les caractères, de conversion, de formatage
Fonction Signification Exemple
Asc(s) code numérique (ASCII) du 1e caractère de la chaîne s
Asc("BONJOUR") 66Asc("0") 48
Chr(n) caractère correspondant au code n
Chr(48) "0"Chr(13) "" (retour à la ligne)
C...(expr) convertit expr dans le type spécifié par ...
CStr(8/3) "2.66667 "CInt(8/3) 3CLng(8/3) 2.666666667CDbl(8/3) 2.666666667
IsNumeric(s) Retourne true si s corres-pond à la représentation d'un nombre
IsNumeric("-3,2") trueIsNumeric("alpha") false
Format(expr, format) chaîne correspondant au formatage de expr selon format
Format(18,"#,###.00 €") "18,00 €"Format(5100,"00 000") "05 100"
Remarque : un saut de ligne dans un fichier ou dans une zone de texte multi-ligne est composé de 2
caractères : 13 (retour chariot) et 10 (line-feed) : chr(13) + chr(10)
30
Fonctions financières
Fonction Signification
DDB Amortissement d'un bien pour une année
FV Valeur future d'une annuité basée sur des paiements constants et périodiques et à un taux d'intérêt constant
IPmt Montant des intérêts pour une période donnée d'une annuité basée sur des paiements constants et périodiques et un taux d'intérêt constant
IRR Taux de retour interne pour une série de mouvements de trésorerie périodiques
NPer Nombre de périodes pour une annuité basée sur des paiements constants, périodiques et soumis à un taux d'intérêt constant
NPV Valeur nette actuelle d'un investissement, calculée en fonction d'une série de mouvements de trésorerie périodiques
Pmt Montant d'une annuité basé sur des paiements constants, périodiques et soumis à un taux d'intérêt constant
PV Valeur actuelle d'une annuité basée sur des paiements futurs constants et périodiques et à un taux d'intérêt constant
Rate Taux d'intérêt par période pour une annuité
SLN Amortissement direct d'un bien sur une période donnée
31
Fonctions sur les dates
En VB, une date correspond à une nombre entier : le nombre de jours écoulés depuis le 30/12/1899 : 1/1/2002 37257
Fonction Signification ExempleDate() Date courante If Date() > DateValue("1/1/00") Then
…
DateAdd(type,n,date) Ajoute une durée de type à date
DateAdd("d",2,"1/2/01") 3/2/01DateAdd("m",2,"1/2/01") 1/4/01
DateDiff(type,d1,d2) Intervalle de temps de type entre d1 et d2
DateDiff("d","1/1/01","1/2/01") 31DateDiff("m","1/1/01","1/2/01") 1
DateValue(expr) Entier correspondant à la date expr
DateValue("1/1/00")+1 2/1/00
Format(date,format) Formatte date selon format
Format("1/1/02","dddd d mmm yy") mardi 1 janv 02Format(0,"dd/mm/yyyy") 30/12/1899Format("1/6/02", "mmmm") juin
IsDate(expr) Détermine si expr correspond à une date
IsDate("1/12/01") trueIsDate("1/14/01") falseIsDate("32/1/01") trueIsDate("demain") false
Now() Date et heure courantes
32
Fonctions sur les dates (suite) et exercices
Exercice 8 : écrire une fonction qui détermine la date du lundi de la semaine d'une date donnée. Exemple : lundi("27/11/2001") 26/11/2001
Exercice 9 : écrire une fonction qui calcule l'âge d'une personne à une date donnée, connaissant sa date de naissance
Fonction Signification ExempleDay(date) n° du jour dans le mois de date Day("1/4/2002") 1
Month(date) n° du mois dans date Month("1/4/2002") 4
Year(date) Année dans date Year("1/4/2002") 2002
WeekDay(date) Jour de la semaine dans date WeekDay("1/6/2002") 1 : dimanche
33
Fonctions sur les heures
En VB, une heure correspond à la fraction d'une journée : 12 h 0,5
Fonction Signification Exemple
dateDiff(type,d1,d2) Intervalle de temps de type entre d1 et d2
dateDiff("h","1/1/01","1/2/01") 744 ( = 31 x 24)
Time() Heure courante If Time() > TimeValue("12:00:00") Then …
TimeValue(expr) Nombre réel correspon-dant à l'heure expr
Cdbl(TimeValue("12:00:00")) 0.5
TimeValue("12:00:00")+1/(24*60) 12:01:00
Format(heure,format) Formatte heure selon format
Format("12:05:00","hh \h mm") 12 h 05
Hour(heure) Nombre d'heures dans heure
Hour("12:05:00") 12
Minute(heure) Nombre de minutes dans heure
Minute("12:05:00") 5
Second(heure) Nombre de secondes dans heure
Second("12:05:00") 0
34
Fonctions système
Fonction ou instruction
Signification Exemple
Shell(commande) lance une commande MS-DOS et retourne 1 si la commande s'est correctement exécutée
e = Shell("C:\WINDOWS\CALC.EXE")If e = 1 Then …
Dir(chemin) Teste l'existence du répertoire ou du fichier indiqué par le chemin chemin
Dir("c:\autoexec.bat") "c:\autoexec.bat"
Dir("c:\windoze.daube") ""
FileCopy chemin1, chemin2
Copie le fichier indiqué par dans chemin chemin1 dans chemin2
FileCopy "c:\temp\f.txt" "c:\temp\f.bak"
MkDir chemin Crée le répertoire indiqué par le chemin chemin
MkDir "c:\temp\bak"
RmDir chemin Supprime le répertoire indiqué par le chemin chemin
RmDir "c:\temp\bak"
35
Instructions et fonctions sur les fichiers 2 types de fichiers :
texte (lisibles par un éditeur de texte) binaires
2 modes d'accès aux données dans les fichiers :
accès séquentiel : pour accéder à la donnée i, il faut déjà avoir accédé à la donnée i – 1
accès direct (ou aléatoire) : on peut accéder directement à une donnée dans un fichier si l'on connaît sa position dans le fichier
36
Manipulation des fichiers texte séquentiels
Fonction ou instruction Signification Exemple
Open chemin For As #num Ouvre le fichier indiqué par chemin en lecture, en écriture ou ajout sur le canal n° num
Open "c:\data.txt" For Input As #1
Input #num var1,…, varnLit les variables var1,…, varn dans le fichier ouvert sur le canal num
Input #1, nom, prenom
Line Input #num var Lit une ligne dans le fichier ouvert sur le canal num et la stocke dans la variable var
Input #1, ligne
Write #num expr1,…, exprnEcrit les expr. expr1,…, exprn dans le fichier ouvert sur le canal num
Write #1, nom, prenom
Close #num Ferme le fichier ouvert sur le canal num
Close #1
EOF(num) Retourne true si l'on est à la fin du fichier ouvert sur le canal num
If EOF(1) Then …
InputOutputAppend
37
Exemple:chargement de zones de textes lues dans un fichier
Private Sub cmd_enregistrer_Click() Open "c:\donnees.txt" For Output As #1 Write #1, txt_nom.Text, txt_prenom.Text Close #1End Sub
Private Sub cmd_charger_Click() Dim nom, prenom As String
If Dir("c:\donnees.txt") = "" Then ' fichier inexistant MsgBox "c:\donnees.txt : fichier inexistant" Else Open "c:\donnees.txt" For Input As #1 Input #1, nom, prenom Close #1 txt_nom.Text = nom txt_prenom.Text = prenom End IfEnd Sub
Créer le formulaire suivant :
• "Enregistrer" sauve les données des zones de texte dans c:\donnees.txt
• "Charger" les recharge dans les zones
38
Exercice 10 : manipulation des fichiers texte séquentiels
Remplir une boîte combo avec des éléments lus dans un fichier texte
1. Créer un formulaire contenant seulement une boîte combo
2. Ecrire le code qui permet de remplir celle-ci avec des éléments lus dans un fichier texte (lui-même créé avec le bloc-notes par exemple)
39
Les tableaux
Déclaration des tableaux VB : Dim ou Public Exemples:
Dim A(10) as String
Dim B(8,3), C(8,5) as Integer
Par défaut les tableaux sont indicés à partir de 1 ceci peut être modifié par : Dim A(0 To 9) as String
Utilisation des tableaux VB : les tableaux sont notés comme les fonctions : risque de confusion exemples:
For i = 1 To 8For j = 0 To 5
C(i,j) = B(i,1) + 1Next j
Next i
40
Exercice 11
Ecrire un programme VB qui :1. lit cinq nombres avec une inputBox et les place dans un tableau
2. enregistre les nombres de ce tableau dans un fichier séquentiel dont le nom est choisi par une boîte de dialogue de type ouverture de fichier