Académique Documents
Professionnel Documents
Culture Documents
Vbscript
Vbscript
Prsentation du langage VBSCRIPT, langage qui peut servir dans diffrents domaines : langage de script pour les administrateurs systme windows, langage de script au sein de pages HTML, langage d'introduction aux langages Visual Basic et Visual Basic pour Applications.
A - Avant Propos I - Les contextes d'excution de VBSCRIPT I-A - Introduction I-B - Le conteneur WSH I-C - La forme d'un script WSH I-D - L'objet WSCRIPT I-E - Le conteneur Internet Explorer I-F - L'aide de WSH II - Les bases de la programmation VBSCRIPT II-A - Afficher des informations II-B - criture des instructions dans un script Vbscript II-C - crire avec la fonction msgBox II-D - les donnes utilisables en Vbscript II-E - les sous-types du type variant II-F - connatre le type exact de la donne contenue dans un variant II-G - dclarer les variables utilises par le script II-H - les fonctions de conversion II-I - lire des donnes tapes au clavier II-J - saisir des donnes avec la fonction inputbox II-K - utiliser des objets structurs II-L - affecter une valeur une variable II-M - valuer des expressions II-N - contrler l'excution du programme II-N-1 - excuter des actions de faon conditionnelle II-N-2 - excuter des actions de faon rpte II-N-3 - Terminer l'excution du programme II-O - les tableaux de donnes dans un variant II-P - les variables tableaux II-Q - les fonctions split et join II-R - Les dictionnaires II-S - Trier un tableau ou un dictionnaire II-T - Les arguments d'un programme II-U - Une premire application : IMPOTS III - La gestion des erreurs III-A - Connatre le type exact d'une donne III-B - Les expressions rgulires III-C - Intercepter les erreurs d'excution III-D - Application au programme de calcul d'impts IV - Les fonctions et procdures IV-A - Les fonctions prdfinies de vbscript IV-B - Programmation modulaire IV-C - Les fonctions et procdures vbscript IV-C-1 - Dclaration des fonctions et procdures vbscript IV-C-2 - Modes de passage des paramtres d'une fonction ou procdure IV-C-3 - Syntaxe d'appel des fonctions et procdures IV-C-4 - Quelques exemples de fonctions IV-C-5 - Paramtre de sortie ou rsultat d'une fonction IV-D - Le programme vbscript de tri de valeurs IV-E - Le programme IMPOTS sous forme modulaire V - Les fichiers texte V-A - Cration et utilisation V-B - Les cas d'erreur V-C - L'application IMPOTS avec un fichier texte
-2Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
A - Avant Propos
Ce document a pour but de fournir les bases du langage vbscript ainsi que des exemples d'utilisation dans diffrents domaines. VBScript est un langage de script sous Windows. Il peut fonctionner dans diffrents conteneurs tels Windows Scripting Host pour une utilisation directe sous Windows notamment pour crire des scripts d'administration systme Internet Explorer. Il est alors utilis au sein de pages HTML auxquelles il amne une certaine interactivit impossible a atteindre avec le seul langage HTML. Internet Information Server (IIS) le serveur Web de Microsoft sur NT/2000 et son quivalent Personal Web Server (PWS) sur Win9x. Dans ce cas, vbscript est utilis pour faire de la programmation cote serveur web, technologie appele ASP (Active Server Pages) par Microsoft.
Par ailleurs, VBSCRIPT tant un langage driv de Visual Basic pour Windows, il peut servir d'introduction ce langage parmi les plus rpandus dans le domaine Windows ainsi qu' la version Application de VB, appele VBA (Visual Basic pour Applications). VBA est utilis par exemple dans toute la suite Office de Microsoft notamment dans Excel. Ainsi VBSCRIPT est une voie d'entre au dveloppement dans un vaste domaine d'applications windows. VBScript n'est pas un langage a objets mme s'il en a une certaine coloration. La notion d'hritage, par exemple, n'existe pas. Il peut cependant utiliser les objets mis sa disposition par le conteneur dans lequel il s'excute ainsi que plus gnralement les composants ActiveX disponibles sur la machine Windows. C'est cet aspect qui donne sa puissance VBScript, langage qui intrinsquement est assez pauvre mais qui grce aux objets mis a sa disposition peut rivaliser avec des langages de script au dpart plus riches tels Perl, Javascript, Python. C'est un langage simple apprendre, utiliser et qui ouvre la voie a l'utilisation de Visual Basic pour Windows dont il est directement driv. Ce document n'est pas un cours d'algorithmique. L'art de la programmation est suppos acquis. Un travail de lecture actif est ncessaire. La meilleure faon d'utiliser ce document est probablement de tester sur sa propre machine les exemples qui y sont donnes. Le conteneur WSH est normalement livre en standard avec le systme Windows. La version la plus rcente est disponible gratuitement sur le site de Microsoft (http://www.microsoft.com). Pour trouver l'URL exacte permettant le tlchargement de WSH, on pourra chercher les mots cls "Windows Scripting" avec un moteur de recherche sur le Web. Parmi les rponses, on devrait trouver l'URL de tlchargement de WSH.
-3Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Dans ce document, nous utiliserons deux conteneurs : Windows Scripting Host appel couramment WSH et le navigateur Internet Explorer appel parfois par la suite IE. Il en existe bien d'autres. Ainsi, les applications MS-Office sont des conteneurs pour un driv de VB appele VBA (Visual Basic pour Applications). Il existe par ailleurs de nombreuses applications windows qui permettent a leurs utilisateurs de dpasser les limites de celle-ci en leur permettant de dvelopper des programmes s'excutant au sein de l'application et utilisant les objets propres a celle-ci.
Donc, lorsqu'on parle de programmation vbscript, il faut indiquer dans quel conteneur le programme est excut.
-4Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Sous windows, vbscript n'est pas le seul langage utilisable dans les conteneurs WSH ou IE. On peut par exemple utiliser JScript (=JavaScript), PerlScript (=Perl), Python, ... Nombre de ces langages semblent de prime abord suprieurs a vbscript. Mais ce dernier a cependant de srieux atouts : VB et ses dclinaisons VBSCRIPT et VBA sont trs rpandues sur les machines windows. Connatre ce langage parat indispensable. C'est davantage les objets utilisables par un programme que le langage utilis par celui-ci qui font sa puissance. Or nombre de ces objets sont fournis par les conteneurs et non par les langages eux-mmes.
Un inconvnient de VBSCRIPT est qu'il n'est pas portable sur un systme autre que Windows, par exemple Unix. Ses concurrents Javascript, Perl, Python eux le sont. Si on doit travailler sur des systmes htrognes, il peut tre intressant voire indispensable d'utiliser le mme langage sur les diffrents systmes.
C:\ >echo %windir% C:\WINDOWS C:\>dir c:\windows\wscript.exe WSCRIPT EXE 123 280 19/09/01 11:54 wscript.exe
C:\>dir c:\windows\cscript.* /s Repertoire de C:\WINDOWS\COMMAND CSCRIPT EXE 102 450 26/06/01 17:49 cscript.exe
Le w de wscript veut dire windows et le c de cscript veut dire console. Un script peut tre excut indiffremment par wscript ou cscript. La diffrence rside dans le mode d'affichage de messages l'cran : wscript les affiche dans une fentre cscript les affiche l'cran
-5Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
DOS>wscript coucou.vbs
DOS>cscript coucou.vbs Microsoft (R) Windows Script Host Version 5.6 Copyright (C) Microsoft Corporation 1996-2001. Tous droits rservs. coucou On voit ci-dessus clairement la diffrence entre les deux modes. Dans ce document, nous utiliserons quasi exclusivement le mode console cscript. C'est le mode qui convient aux applications dites "batch" c'est dire des applications sans interaction avec un utilisateur au clavier. On notera deux points dans les rsultats prcdents : 1 On a suppos que les excutables wscript.exe et cscript.exe taient tous les deux dans le "PATH" de la machine, ce qui permet de les lancer en tapant simplement leurs noms. Si ce n'tait pas le cas, il aurait fallu crire ici : DOS>c:\windows\wscript coucou.vbs DOS>c:\windows\command\cscript coucou.vbs On notera que la version de wsh utilise dans cet exemple et dans la suite du document est la version 5.6. Le fichier source du script a le suffixe .vbs. C'est le suffixe dsignant un script vbscript, un script javascript tant lui dsign par le suffixe .js.
2 3
Le programme cscript a diverses options de lancement qu'on obtient en lanant cscript sans arguments :
DOS>cscript Microsoft (R) Windows Script Host Version 5.6 Copyright (C) Microsoft Corporation 1996-2001. Tous droits rservs. Utilisation : CScript scriptname.extension [option...] [arguments...] Options: //B batch : Supprime l'affichage des invites et des erreurs de scripts //D Activer le dbogage //E:engine Utiliser le moteur pour l'excution de script //H:CScript Remplace l'environnement d'excution de scripts par dfaut par CScript.exe //H:WScript tRemplace l'environnement d'excution de scripts par dfaut par WScript.exe (default) //I Mode interactif (par dfaut, contraire de l'option //B) //Job :xxxx Excuter une tche WSF //Logo Afficher un logo (default) //Nologo Empcher l'affichage d'un logo : Aucune bannire ne s'affiche pendant la dure d'excution //S Enregistrer les options de ligne de commande actuelles pour cet utilisateur //T:nn Dure d'excution en secondes : Temps maximal autoris pour l'excution d'un script //X Excuter un script dans le dbogueur
-6Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
L'argument //nologo supprime l'affichage de la bannire de wsh : C:\>cscript //nologo coucou.vbs coucou
Nous avons indiqu que le suffixe .vbs du fichier dsignait un script vbscript. Ce n'est pas une obligation. Nous aurions pu mettre le script dans un fichier de suffixe .wsf sous la forme suivante plus complexe :
-7Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Par la suite, nous utiliserons exclusivement vbscript dans des fichiers .vbs.
Un objet Obj a des proprits Pi qui fixent son tat. Ainsi un objet thermomtre peut avoir une proprit temprature. Cette proprit est un des aspects de l'tat du thermomtre. Une autre pourrait tre la temprature maximale Tmax qu'il peut supporter.
L'objet Obj peut avoir des mthodes Mj qui permettent des agents extrieurs soit de :
connatre son tat changer son tat
Ainsi notre thermomtre, s'il est lectronique, pourrait avoir une mthode allumer qui le mettrait en marche, une autre teindre qui l'teindrait, une autre afficher qui afficherait la temprature d'quilibre une fois celle-ci atteinte. En termes de programmation, une mthode est une fonction qui peut admettre des arguments et rendre des rsultats. En Vbscript, les proprits Pi d'un objet Obj sont notes Obj.Pi et les mthodes Mj sont notes Obj.Mj. L'objet wscript de WSH est un objet important pour les mthodes qu'il met a disposition des scripts. Ainsi sa mthode cho permet d'afficher un message. La syntaxe de cette mthode est la suivante : wscript.echo arg1, arg2, ..., argn Les valeurs des arguments argi sont alors affiches dans une fentre (excution par wscript) ou a l'cran (excution par cscript sous DOS).
-8Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Son chargement direct par Internet Explorer (Fichier/Ouvrir) donne les rsultats suivants :
Le contenu du fichier coucou2.htm nous montre que HTML est un langage de balisage. Connatre le langage HTML c'est connatre ces balises. Celles-ci ont pour but principal d'indiquer au navigateur comment afficher un document. HTML ne suit pas exactement la norme XML mais en est proche. Dans coucou2.htm, il y a deux informations reprsenter notes 1 et 2. Nous les avons reprsentes galement dans l'affichage qui en a t fait. C'est la balise <title>...</title> qui a fait que l'information 1 a t place dans la barre de titre du navigateur et la balise <body>..</body> qui a fait que l'information 2 a t place dans la partie document du navigateur. Nous n'entrerons pas davantage dans l'tude du langage HTML. Modifions le fichier coucou2.htm en y introduisant un script vbscript et appelons-le maintenant coucou1.htm :
-9Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Le script vbscript a t plac dans la balise <head>...</head>. Il aurait pu tre plac ailleurs. Il affiche "coucou" au chargement initial de la page. Ici, le navigateur doit tre Internet Explorer car seul ce navigateur est par dfaut un conteneur pour des scripts vbscript. L'affichage obtenu est alors le suivant :
Alors que le conteneur WSH mettait disposition du script un objet appel wscript permettant de faire des affichages avec sa mthode echo, ici IE met disposition du script un objet window permettant de faire des affichages avec la mthode alert. Ainsi pour afficher "coucou", on crit wscript.echo "coucou" dans WSH et window.alert "coucou" dans IE. On peut montrer ici aussi qu'en fait on peut utiliser plusieurs langages dans le conteneur IE. Nous reprenons l'exemple dj prsent dans WSH au sein d'une page coucou3.htm :
- 10 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Le chargement de cette page par IE affiche tout d'abord trois fentres d'information :
- 11 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
On y trouve l'aide du conteneur WSH mais galement celle pour les langages vbscript et javascript. C'est un outil indispensable la fois pour le dbutant et le programmeur confirme. Il y a plusieurs faons de travailler avec cette aide : on ne sait pas trop ce qu'on cherche. On veut simplement dcouvrir ce qui est propose. L'onglet Sommaire ci-dessus peut tre alors utilise. On peut par exemple regarder ce qui est propose pour vbscript :
- 12 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Vous dcouvrirez dans l'aide de VBscript de nombreuses informations qui ne sont pas dans ce document. vous pouvez chercher quelque chose de prcis, par exemple la faon d'utiliser la fonction msgbox de VBscript. Utilisez alors l'onglet Rechercher :
- 13 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
L'aide ramne toutes les rubriques qui ont un rapport avec le mot recherch. En gnral, les premires rubriques proposes sont les plus pertinentes. C'est le cas ici o la premire rubrique propose est la bonne. Il suffit de double-cliquer dessus pour avoir l'information de cette rubrique :
- 14 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Les conteneurs vbscript ne sont pas sensibles la "casse" utilise (majuscules/minuscules) dans le texte du script. Aussi pourra-t-on crire indiffremment wscript.echo "coucou" ou WSCRIPT.ECHO "coucou". Les programmes prsents dans la suite font beaucoup d'critures a l'cran aussi allons-nous prsenter de nouveau les mthodes d'criture de l'objet wscript.
- 15 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Par dfaut, on crit une instruction par ligne. Nanmoins, on peut crire plusieurs instructions par ligne en les sparant par le caractre : comme dans inst1:inst2:inst3. Si une ligne est trop longue, on peut la dcouper en morceaux. Il faut alors que les diffrentes parties de l'instruction soient termines par les deux caractres (espace)_. Nous reprenons l'exemple prcdent en rcrivant diffremment les instructions :
Les valeurs utiliser pour prciser l'icne et les boutons de la fentre d'affichage sont les suivantes : Constante vbOKOnly vbOKCancel vbAbortRetryIgnore vbYesNoCancel vbYesNo vbRetryCancel vbCritical vbQuestion vbExclamation vbInformation vbDefaultButton1 vbDefaultButton2 vbDefaultButton3 vbDefaultButton4 vbApplicationModal vbSystemModal Valeur 0 1 2 3 4 5 16 32 48 64 0 256 512 768 0 4096 Description Affiche uniquement le bouton OK. Affiche les boutons OK et Annuler. Affiche les boutons Abandon, Ressayer et Ignorer. Affiche les boutons Oui, Non et Annuler. Affiche les boutons Oui et Non. Affiche les boutons Ressayer et Annuler. Affiche l'icne Message critique. Affiche l'icne Demande d'avertissement. Affiche l'icne Message d'avertissement. Affiche l'icne Message d'information. Le premier bouton est le bouton par dfaut. Le deuxime bouton est le bouton par dfaut. Le troisime bouton est le bouton par dfaut. Le quatrime bouton est le bouton par dfaut. Application modale ; l'utilisateur doit rpondre au message avant de continuer travailler dans l'application courante. Systme modal ; toutes les applications sont suspendues jusqu' ce que l'utilisateur rponde au message.
- 16 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Dans certains cas, on prsente une fentre d'information qui est galement une fentre de saisie. Si on pose une question, on veut par exemple savoir si l'utilisateur a cliqu sur le bouton oui ou sur le bouton non. La fonction msgBox rend un rsultat que dans le programme prcdent nous n'avons pas utilis. Ce rsultat est un nombre entier reprsentant le bouton utilis par l'utilisateur pour fermer la fentre d'affichage : Constante vbOK vbCancel vbAbort Valeur 1 2 3 Bouton choisi OK Annuler Abandon
- 17 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
4 5 6 7
Le programme suivant montre l'utilisation du rsultat de la fonction msgBox. On prsente 4 fois une fentre avec les boutons oui, non, annuler.
- 18 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Commentaires :
un certain nombre de langages de programmation (C, C++, Pascal, Java, C#, ...) exigent la dclaration pralable d'une variable avant son utilisation. Cette dclaration consiste indiquer le nom de la variable et le type de donnes elle peut contenir (entier, rel, chane, date, boolen, ...). La dclaration des variables permet diffrentes choses : connatre la place mmoire ncessaire la variable si diffrents types de donnes ncessitent diffrents espaces mmoire de vrifier la cohrence du programme. Ainsi si i est un entier et c une chane de caractres, multiplier i par c n' aucun sens. Si le type des variables i et c a t dclar par le programmeur, le programme charg d'analyser le programme avant son excution peut signaler une telle incohrence.
- 19 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Comme la plupart des langages de script type de donnes unique (Perl, Python, Javascript, ...) Vbscript autorise de ne pas dclarer les variables. C'est ce qui a t fait dans l'exemple ci-dessus. notons la syntaxe de diffrentes donnes 10.2 en ligne 10 (point dcimal et non virgule). On notera qu' l'affichage c'est 10,2 qui est affich. 1.4e-2 en ligne 13 (notation scientifique). A l'affichage, c'est le nombre 0,014 qui a t affich #01/10/2002# (ligne 26) pour reprsenter la date du 10 janvier 2002. C'est donc le format #mm/jj/aaaa# que vbscript utilise pour reprsenter la date jj du mois mm de l'anne aaaa les boolens true et false (vrai/faux) en lignes 31 et 34. Ces deux valeurs sont reprsentes respectivement par les entiers -1 et 0 comme le montre l'affichage des lignes 32 et 35. Lorsqu'un boolen est concatn une chane de caractres, ces valeurs deviennent respectivement les chanes "Vrai" et "Faux" comme le montrent les lignes 33 et 36. On remarquera au passage que l'oprateur & de concatnation peut servir concatner autre chose que des chanes. une variable v n'ayant pas de type assign, elle peut accueillir successivement dans le temps des valeurs de diffrents types.
Double
- 20 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Une autre fonction possible est vartype(var) qui rend un nombre reprsentant le type de la donne contenue par la variable var : Constante Valeur vbEmpty 0 vbNull 1 vbInteger 2 vbLong 3 vbSingle 4 vbDouble 5 vbCurrency 6 vbDate 7 vbString 8 vbObject 9 vbError 10 vbBoolean 11 vbVariant 12 vbDataObject13 vbByte 17 vbArray 8192 Description Empty (non initialise) Null (aucune donne valide) Entier Entier long Nombre en virgule flottante en simple prcision Nombre en virgule flottante en double prcision Montaire Date Chane Objet Automation Erreur Boolen Variant (utilis seulement avec des tableaux de Variants) Objet non Automation Octet Tableau
- 21 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Remarque Ces constantes sont spcifies par VBScript. En consquence, les noms peuvent tre utiliss n'importe o dans votre code la place des valeurs relles. Les informations ci-dessus proviennent de la documentation de VBscript. Celle-ci est parfois incorrecte, issue probablement de copier-coller faits partir de la documentation de VB. La fonction vartype de VBScript ne fait qu'une partie de ce qui est annonc ci-dessus. Le programme prcdent, rcrit pour vartype donne les rsultats suivants :
- 22 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
... dim somme 1 somme=4 ... somme=smme+10 Dans cet exemple, vbscript indiquera qu'il y a une variable non dclare smme en 2) comme le montre l'exemple qui suit :
Si dans les courts exemples du document, les variables ne sont la plupart du temps pas dclares, nous forcerons leur dclaration ds que nous crirons les premiers scripts significatifs. La directive Option explicit sera alors utilise systmatiquement.
- 23 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
- 24 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Commentaires :
Dans la colonne des rsultats et dans la ligne [Tapez votre nom : st] , st est la ligne tape par l'utilisateur.
Si le texte tap au clavier reprsente un nombre, il est quand mme considr avant tout comme une chane de caractres comme le montre l'exemple ci-dessous :
Si ce nombre intervient dans une opration arithmtique, VBscript fera automatiquement la conversion de la chane vers un nombre mais pas toujours. Regardons l'exemple qui suit :
Dans les rsultats, on voit que la ligne 8 du script ne s'est pas droule comme attendu, ceci parce que (malheureusement) en vbscript l'oprateur + a deux significations : addition de deux nombres ou concatnation de
- 25 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
deux chanes (les deux chanes sont colles l'une l'autre). Nous avons vu prcdemment que les nombres taps au clavier taient lus comme tant des chanes de caractres et que vbscript transformait celles-ci en nombres selon les besoins. Il l'a correctement fait pour les oprations -,*,/ qui ne peuvent faire intervenir que des nombres mais pas pour l'oprateur + qui lui peut galement faire intervenir des chanes. Il a suppos ici qu'on voulait faire une concatnation de chanes. Une solution simple ce problme est de transformer en nombres les chanes ds leur lecture comme le montre l'amlioration qui suit du programme prcdent :
reponse=inputBox(message,titre)
message : la question que vous posez a l'utilisateur titre (facultatif) : le titre que vous donnez a la fentre de saisie rponse : le texte tape par l'utilisateur. Si celui-ci a ferme la fentre sans rpondre, rponse est la chane vide.
Voici un exemple o on demande le nom et l'age d'une personne. Pour le nom on donne une information et on fait OK. Pour l'age, on donne galement une information mais on fait Annuler.
- 26 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
C'est l'instruction [Dim nom,age] qui dfinit les deux proprits de la classe personne. Pour crer des exemplaires (on parle d'instances) de la classe personne, on crit :
- 27 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Parce qu'un variant ne peut contenir un objet. Il peut seulement en contenir l'adresse. En crivant set personne1=new personne, la squence d'vnements suivante prend place : 1 2 un objet personne est cr. Cela veut dire que de la mmoire lui est alloue. l'adresse de cet objet personne est affecte la variable personne1
Nous avons alors le schma mmoire suivant pour les variables personne1 et personne2 :
Par abus de langage, on pourra dire que personne1 est un objet personne. On peut accepter cet abus de langage si on se rappelle que personne1 est en fait l'adresse d'un objet personne et non l'objet personne lui-mme. Nous avons dit qu'un objet personne avait deux proprits nom et age. Comment exploiter ces proprits ? Par la notation objet.proprit comme il a t expliqu un peu plus haut. Ainsi personne1.nom dsigne le nom de la personne 1 et personne1.age son ge. Voici un court programme d'illustration :
- 28 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Nous avons utilis ici la structure with ... end with qui permet de "factoriser" des noms d'objets dans des expressions. La structure with p1 ... end with des lignes 9-12 et 15-18 permet d'utiliser ensuite la syntaxe .nom en lieu et place de p1.nom et .age en lieu et place de p1.age. Cela permet d'allger l'criture des instructions o le mme nom d'objet est utilis de faon rpte.
La forme 2 est rserve aux expressions dont le rsultat est une rfrence d'objet. Pour tous les autres types d'expressions c'est la forme 1 qui convient. La diffrence entre les deux formes est la suivante : 1 dans l'instruction variable=expression, variable reoit une valeur. Si v1 et v2 sont deux variables, crire v1=v2 affecte la valeur de v1 v2. On a donc la duplication d'une valeur deux endroits diffrents. Si par la suite, la valeur de v2 est modifie, celle de v1 ne l'est en rien.
dans l'instruction set variable=expression, variable reoit comme valeur l'adresse d'un objet. Si v1 et v2 sont deux variables et si v2 est l'adresse d'un objet obj2, crire set v1=v2 affecte la valeur de v1 v2, donc l'adresse de l'objet obj2. Lorsque le script manipule ensuite v1 et v2, ce ne sont pas les "valeurs" de v1 et v2 qui sont manipules mais bien les objets "points" par v1 et v2, donc le mme objet ici. On dit que v1 et v2 sont deux rfrences au mme objet et manipuler ce dernier via v1 ou v2 ne fait aucune diffrence. Dit autrement, modifier l'objet rfrenc par v2 modifie celui rfrenc par v1.
- 29 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Voici un exemple :
- 30 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Logique
Concatnation
a et b peuvent tre tous deux des nombres ou tous deux des chanes de caractres. Dans ce dernier cas, chaine1<chaine2 si dans l'ordre alphabtique chaine1 prcde chaine2. Dans la comparaison de chanes, les majuscules prcdent les minuscules dans l'ordre alphabtique. is obj1 is obj2 est vrai si obj1 et obj2 sont des rfrences sur le mme objet. and, or, not, Les oprandes sont tous ici boolens. bool1 or bool2 est vrai si xor bool1 ou bool2 est vrai bool1 and bool2 est vrai si bool1 et bool2 sont vrais not bool1 est vrai si bool1 est faux et vice-versa bool1 xor bool2 est vrai si seulement un seul des boolens bool1, bool2 est vrai &, + Il est dconseill d'utiliser l'oprateur + pour concatner deux chanes cause de la confusion possible avec l'addition de deux nombres. On utilisera donc exclusivement l'oprateur &.
II-N - contrler l'excution du programme II-N-1 - excuter des actions de faon conditionnelle
L'instruction vbscript permettant de faire des actions selon la valeur vraie/fausse d'une condition est la suivante : if expression then actionvrai1 actionvrai2 L'expression expression est tout d'abord value. Cette expression doit avoir une valeur boolenne. Si elle a la valeur vrai, les actions du then sont excutes sinon ce sont celles du else s'il est prsent.
- 31 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Commentaires :
en vbscript, on peut crire instruction1:instruction2:... : instruction au lieu d'crire une instruction par ligne. C'est cette possibilit qui a t exploite en ligne 10 par exemple.
2 3
- 32 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
on reboucle l'tape 3 prcdente. Au bout d'un nombre fini d'tapes, la valeur de i dpassera ifin. L'excution du script se poursuit avec l'instruction qui suit le next si l'incrment ipas est ngatif, la condition de l'tape 3 est change. On excute les actions du for...next que si i>=ifin.
On peut sortir d'une boucle for tout moment avec l'instruction exit for. 1 l'expression condition est value. Si elle est vraie, les actions du while...loop sont excutes 2 les actions excutes ont pu modifier la valeur de condition. On reboucle sur l'tape 1 prcdente. 3 lorsque l'expression condition devient fausse, la boucle est termine On peut sortir d'une boucle do while tout moment avec l'instruction exit do.
- 33 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
- 34 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Note : Dans la phase de dveloppement d'un programme, il n'est pas rare qu'un programme "boucle", c.a.d. qu'il ne s'arrte jamais. En gnral, le programme excute une boucle dont la condition de sortie ne peut tre vrifie comme par exemple dans l'exemple qui suit :
' boucle infinie i=0 Do While 1=1 i=i+1 wscript.echo i Loop ' une autre du mme genre i=0 Do While true i=i+1 wscript.echo i Loop
Si on excute le programme prcdent, la premire boucle ne s'arrtera jamais d'elle-mme. On peut forcer son arrt en tapant CTRL-C au clavier (touche CTRL et touche C enfonces en mme temps).
La commande DOS 1 teste si le code d'erreur retourn par le programme est >=5. Si oui, elle affiche (echo) 5 sinon rien. La commande DOS 2 teste si le code d'erreur retourn par le programme est >=4. Si oui, elle affiche 4 sinon rien. La commande DOS 3 teste si le code d'erreur retourn par le programme est >=3. Si oui, elle affiche 3 sinon rien. Des rsultats affichs, on peut dduire que le code d'erreur retourn par le programme tait 4.
- 35 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
un variant T peut tre initialise avec un tableau vide par la syntaxe T=array() ou avec une suite d'lments par la syntaxe T=array(element0, element1, ...., elementn) on peut ajouter des lments a un tableau T dj cr. Pour cela, on utilise l'instruction redim preserve T(N) ou N est le nouvel indice du dernier lment du tableau T. L'opration est appele un redimensionnent (redim). Le mot cl preserve indique que lors de ce redimensionnent, le contenu actuel du tableau doit tre prserv. En l'absence de ce mot cl, T est redimensionne et vid de ses lments. un lment T(i) du tableau T est de type variant et peut donc contenir n'importe quelle valeur et en particulier un tableau. Dans ce cas, la notation T(i)(j) dsigne l'lment j du tableau T(i).
Ces diverses proprits des tableaux sont illustres par le programme qui suit :
Commentaires
on a utilise ici une fonction appele join explicite un peu plus loin.
- 36 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
dim tableau(n) dclare un tableau statique de n+1 lments numrotes de 0 a n. Ce type de tableau ne peut pas tre redimensionne dim tableau() dclare un tableau dynamique vide. Il devra tre redimensionne pour tre utilise par l'instruction redim de la mme manire que pour un variant contenant un tableau dim tableau(n,m) dclare un tableau 2 dimensions de (n+1)*(m+1) lments. L'lment (i,j) du tableau est not tableau(i,j). On notera la diffrence avec un variant o le mme lment aurait t not tableau(i)(j).
Pourquoi deux types de tableaux qui finalement sont trs proches ? La documentation de vbscript n'en parle pas et n'indique pas non plus si l'un est plus performant que l'autre. Par la suite, nous utiliserons quasi exclusivement le tableau dans un variant dans nos exemples. On se rappellera cependant que VBscript drive du langage Visual Basic qui contient lui des donnes types (integer, double, boolean, ...). Dans ce cas, si on doit utiliser un tableau de nombres rels par exemple, la variable tableau sera plus performante que la variable variant. On dclarera alors quelque chose comme dim tableau(1000) as double pour dclarer un tableau de nombres rels ou simplement dim tableau() as double si le tableau est dynamique. Voici un exemple illustrant l'utilisation de variables tableau :
- 37 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Voici un exemple :
- 38 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Programme
' transformation tableau-->chane et viceversa ' tableau --> chaine tableau=array("un",2,"trois") chaine=join(tableau,",") wscript.echo chaine ' chaine --> tableau tableau2=split(chaine,",") For i=0 To ubound(tableau2) wscript.echo tableau(i) Next
Rsultats
un,2,trois un 2 trois
- 39 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
set dico=CreateObject("Scripting.Dictionary") CreateObject est une mthode de l'objet WScript permettant de crer des instances d'objets Active X. La version 2 montre que wscript peu tre un objet implicite. Lorsqu'une mthode ne peut tre "rapproche" d'un objet, le conteneur WSH essaiera de le rapprocher de l'objet wscript. 2 Une fois le dictionnaire cr, on va pouvoir lui ajouter des lments avec la mthode add : dico.add "cl",valeur va crer une nouvelle entre dans le dictionnaire associe la cl "cl". La valeur associe est un variant dont une donne quelconque. Pour rcuprer la valeur associe une cl donne on utilise la mthode item du dictionnaire : var=dico.item("cl") ou set var=dico.item("cl) si la valeur associe la cl est un objet. L'ensemble des cls du dictionnaire peut tre rcupr dans un tableau variant grce la mthode keys : cls=dico.keys cls est un tableau dont on peut parcourir les lments. L'ensemble des valeurs du dictionnaire peut tre rcupr dans un tableau variant grce la mthode items : valeurs=dico.items items est un tableau dont on peut parcourir les lments L'existence d'une cl peut tre teste avec la mthode exists : dico.exists("cl") est vrai si la cl "cl" existe dans le dictionnaire On peut enlever une entre du dictionnaire (cl+valeur) avec la mthode remove : dico.remove("cl") enlve l'entre du dictionnaire associe la cl "cl". dico.removeall enlve toutes les cls, c.a.d. vide le dictionnaire. Le programme suivant utilise ces diverses possibilits : Programme
' cration et utilisation d'un dictionnaire Set dico=CreateObject("Scripting.Dictionary") ' remplisage dico dico.add "cl1","valeur1" dico.add "cl2","valeur2" dico.add "cl3","valeur3" ' nombre d'lments wscript.echo "Le dictionnaire a " & dico.count & " lments" ' liste des cls wscript.echo "liste des cls" cles=dico.keys - 40 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Programme
For i=0 To ubound(cles) wscript.echo cles(i) Next ' liste des valeurs wscript.echo "liste des valeurs" valeurs=dico.items For i=0 To ubound(valeurs) wscript.echo valeurs(i) Next ' liste des cls et valeurs wscript.echo "liste des cls et valeurs" cles=dico.keys For i=0 To ubound(cles) wscript.echo "dico(" & cles(i) & ")=" & dico.item(cles(i)) Next ' recherche d'lments ' cl1 If dico.exists("cl1") Then wscript.echo "La cl cl1 existe dans le dictionnaire et la valeur associe est " & dico.item("cl1") Else wscript.echo "La cl cl1 n'existe pas dans le dictionnaire" End If ' cl4 If dico.exists("cl4") Then wscript.echo "La cl cl4 existe dans le dictionnaire et la valeur associe est " & dico.item("cl4") Else wscript.echo "La cl cl4 n'existe pas dans le dictionnaire" End If ' on enlve la cl 1 dico.remove("cl1") ' liste des cls et valeurs wscript.echo "liste des cls et valeurs aprs suppression de cl1" cles=dico.keys For i=0 To ubound(cles) wscript.echo "dico(" & cles(i) & ")=" & dico.item(cles(i)) Next ' on supprime tout dico.removeall ' liste des cls et valeurs wscript.echo "liste des cls et valeurs aprs suppression de tous les lments" cles=dico.keys For i=0 To ubound(cles) wscript.echo "dico(" & cles(i) & ")=" & dico.item(cles(i)) Next ' fin wscript.quit 0
Rsultats
Le dictionnaire a 3 lments liste des cls cl1 cl2 cl3 liste des valeurs valeur1 valeur2 valeur3 liste des cls et valeurs dico(cl1)=valeur1 dico(cl2)=valeur2 dico(cl3)=valeur3
- 41 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Rsultats
La cl cl1 existe dans le dictionnaire et la valeur associe est valeur1 La cl cl4 n'existe pas dans le dictionnaire liste des cls et valeurs aprs suppression de cl1 dico(cl2)=valeur2 dico(cl3)=valeur3 liste des cls et valeurs aprs suppression de tous les lments
Commentaires
WScript.Arguments est la collection des arguments passes au script une collection C est un objet qui a une proprit count qui est le nombre d'lments dans la collection une mthode C(i) qui donne l'lment i de la collection
- 42 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
on calcule son coefficient familial Q=R/N on calcule son impt I d'aprs les donnes suivantes
12620.0 0 0 13190 0.05 631 15640 0.1 1290.5 24740 0.15 2072.5 31810 0.2 3309.5 39970 0.25 4900 48360 0.3 6898.5 55790 0.35 9316.5 92970 0.4 12106 127860 0.45 16754.5 151250 0.50 23147.5 172040 0.55 30710 195000 0.60 39312 0 0.65 49062 Chaque ligne a 3 champs. Pour calculer l'impt I, on recherche la premire ligne o QF<=champ1. Par exemple, si QF=30000 on trouvera la ligne 24740 0.15 2072.5 L'impt I est alors gal 0.15*R - 2072.5*nbParts. Si QF est tel que la relation QF<=champ1 n'est jamais vrifie, alors ce sont les c#fficients de la dernire ligne qui sont utiliss. Ici : 0 0.65 ce qui donne l'impt I=0.65*R - 49062*nbParts. Le programme est le suivant : Programme
' calcul de l'impt d'un contribuable ' le programme doit tre appel avec trois paramtres : mari enfants salaire ' mari : caractre O si mari, N si non mari ' enfants : nombre d'enfants ' salaire : salaire annuel sans les centimes ' aucune vrification de la validit des donnes n'est faite mais on ' vrifie qu'il y en a bien trois ' dclaration obligatoire des variables Option Explicit ' on vrifie qu'il y a 3 arguments Dim nbArguments nbArguments=wscript.arguments.count If nbArguments<>3 Then wscript.echo "Syntaxe : pg mari enfants salaire" wscript.echo "mari : caractre O si mari, N si non mari" wscript.echo "enfants : nombre d'enfants" wscript.echo "salaire : salaire annuel sans les centimes" ' arrt avec code d'erreur 1 wscript.quit 1 End If ' on rcupre les arguments sans vrifier leur validit Dim marie, enfants, salaire If wscript.arguments(0) = "O" Or wscript.arguments(0)="o" Then marie=true Else
49062
- 43 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Programme
marie=false End If ' enfants est un nombre entier enfants=cint(wscript.arguments(1)) ' salaire est un entier long salaire=clng(wscript.arguments(2)) ' on dfinit les donnes ncessaire au calcul de l'impt dans 3 tableaux Dim limites, coeffn, coeffr limites=array(12620,13190,15640,24740,31810,39970,48360, _ 55790,92970,127860,151250,172040,195000,0) coeffr=array(0,0.05,0.1,0.15,0.2,0.25,0.3,0.35,0.4,0.45, _ 0.5,0.55,0.6,0.65) coeffn=array(0,631,1290.5,2072.5,3309.5,4900,6898.5,9316.5, _ 12106,16754.5,23147.5,30710,39312,49062) ' on calcule le nombre de parts Dim nbParts If marie=true Then nbParts=(enfants/2)+2 Else nbParts=(enfants/2)+1 End If If enfants>=3 Then nbParts=nbParts+0.5 ' on calcule le quotient familial et le revenu imposable Dim revenu, qf revenu=0.72*salaire qf=revenu/nbParts ' on calcule l'impt Dim i, impot i=0 Do While i<ubound(limites) And qf>limites(i) i=i+1 Loop impot=int(revenu*coeffr(i)-nbParts*coeffn(i)) ' on affiche le rsultat wscript.echo "impt=" & impot ' on quitte sans erreur wscript.quit 0
Resultats
C:\>cscript impots1.vbs o 2 200000 impt=22504 C:\>cscript impots1.vbs o 2 20000 impt=0 C:\>cscript impots1.vbs o 2 2000000 impt=746064 C:\>cscript impots1.vbs n 2 200000 impt=33388 C:\>cscript impots1.vbs n 3 200000 impt=22504 C:\>cscript impots1.vbs Syntaxe : pg mari enfants salaire mari : caractre O si mari, N si non mari enfants : nombre d'enfants salaire : salaire annuel sans les centimes
Commentaires :
le programme utilise ce qui a t expose prcdemment (dclaration des variables, arguments, changements de types, tests, boucles, tableau dans un variant) il ne vrifie pas la validit des donnes, ce qui serait anormal dans un programme rel seule la boucle while prsente une difficult. Elle cherche a dterminer l'indice i du tableau limites pour lequel on a limites(i)>qf et cela pour i<ubound(limites) (c.a.d. ici i<13) car le dernier lment du tableau
- 44 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
limites n'est pas significatif. Il a t ajout uniquement pour que le test [Do While i<ubound(limites) And qf>limites(i)] puisse se faire pour i=13. Le test est alors 13<13 and qf>limites(13) et il faut alors (en vbscript) que limites(13) existe. Lorsqu'on sort de la boucle while, la dernire valeur de i calcule permet de calculer l'impt : [impt=int(revenu*coeffr(i)-nbParts*coeffn(i))].
- 45 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
C:\>cscript impots1.vbs o xyzt 200000 C:\impots1.vbs(33, 3) Erreur d'xecution Microsoft VBScript: Type incompatible: 'cint'
C'est ce qu'on appelle un plantage sauvage. Il y a eu "plantage" sur l'instruction enfants=cint(wscript.arguments(1)) car arguments(1) contenait la chane "xyzt". Avant d'utiliser un variant dont on ne connat pas la nature exacte, il faut vrifier son sous-type exact. On peut faire ceci de diffrentes faons : tester le type rel de la donne contenue dans un variant avec les fonctions vartype ou typename utiliser une expression rgulire pour vrifier que le contenu du variant correspond a un certain modle laisser l'erreur se produire puis l'intercepter pour ensuite la grer Nous examinons ces diffrentes mthodes.
isNumeric(expression)
- 46 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Programme
Do While Not fini ' on demande le nombre wscript.stdout.write "Tapez un nombre : " ' on le lit nombre=wscript.stdin.readLine ' le type est forcment string lors d'une lecture wscript.echo "Type de la donne lue : " & typename(nombre) & "," & vartype(nombre) ' on teste le type rel de la donne lue If isNumeric(nombre) Then fini=true Else wscript.echo "Erreur, vous n'avez pas tap un nombre. Recommencez svp..." End If Loop ' confirmation wscript.echo "Merci pour le nombre " & nombre ' et fin wscript.quit 0
Rsultat
Tapez un nombre : a Type de la donne lue : String,8 Erreur, vous n'avez pas tap un nombre. Recommencez svp... Tapez un nombre : -12 Type de la donne lue : String,8 Merci pour le nombre -12
La fonction isNumeric ne nous dit pas si une expression est un entier ou pas. Pour avoir cette information, il faut faire des tests supplmentaires. L'exemple suivant demande un nombre entier >0 : Programme
' lecture d'une donne jusqu' ce que celle-ci soit reconnue comme un nombre entier >0 Option Explicit Dim fini, nombre ' on boucle tant que la donne saisie n'est pas correcte ' la boucle est contrle par un boolen fini, mis faux au dpart (= ce n'est pas fini) fini=false Do While Not fini ' on demande le nombre wscript.stdout.write "Tapez un nombre entier >0: " ' on le lit nombre=wscript.stdin.readLine ' on teste le type rel de la donne lue If isNumeric(nombre) Then ' est-ce un entier (nombre gal sa partie entire) positif ? If (nombre-int(nombre))=0 And nombre>0 Then fini=true End If End If ' msg d'erreur ventuel If Not fini Then wscript.echo "Erreur, vous n'avez pas tap un nombre entier >0. Recommencez svp..." Loop ' confirmation wscript.echo "Merci pour le nombre entier >0 : " & nombre ' et fin wscript.quit 0
- 47 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Rsultats
Tapez un nombre entier >0: a Erreur, vous n'avez pas tap un nombre entier >0. Recommencez svp... Tapez un nombre entier >0: -1 Erreur, vous n'avez pas tap un nombre entier >0. Recommencez svp... Tapez un nombre entier >0: 10.6 Erreur, vous n'avez pas tap un nombre entier >0. Recommencez svp... Tapez un nombre entier >0: 12 Merci pour le nombre entier >0 : 12
Commentaires :
int(nombre) donne la partie entire d'un nombre. Un nombre gal sa partie entire est un entier. On notera, de faon intressante, qu'il a fallu employer le test If (nombre-int(nombre))=0 And nombre>0 parce que le test If nombre=int(nombre) And nombre>0 ne donnait pas les rsultats escomptes. Il ne dtectait pas les nombres entiers positifs. Nous laissons au lecteur le soin de dcouvrir pourquoi. Le test If (nombre-int(nombre))=0 n'est pas totalement fiable. Regardons l'exemple d'excution suivant : Tapez un nombre entier >0: 4,0000000000000000000000001 Merci pour le nombre entier >0 : 4,0000000000000000000000001 Les nombres rels ne sont pas reprsents de faon exacte mais de faon approche. Et ici, l'opration nombre-int(nombre) a donn 0 la prcision prs de l'ordinateur.
^ $ * + ? . (modle)
x|y
- 48 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
{n}
{n,}
{n,m}
[^m-z]
\b
\B \d \D \f \n \r \s \S \t \v \w
\num
\n
\xn
n est un nombre entier non ngatif. Correspond exactement n fois le caractre. Par exemple, "o{2}" ne correspond pas "o" dans "Bob," mais aux deux premiers "o" dans "fooooot". n est un entier non ngatif. Correspond au moins n fois le caractre. Par exemple, "o{2,}" ne correspond pas "o" dans "Bob", mais tous les "o" dans "fooooot". "o{1,}" quivaut "o+" et "o{0,}" quivaut "o*". m et n sont des entiers non ngatifs. Correspond au moins n et au plus m fois le caractre. Par exemple, "o{1,3}" correspond aux trois premiers "o" dans "foooooot" et "o{0,1}" quivaut "o?". Jeu de caractres. Correspond l'un des caractres indiqus. Par exemple, "[abc]" correspond "a" dans "plat". Jeu de caractres ngatif. Correspond tout caractre non indiqu. Par exemple, "[^abc]" correspond "p" dans "plat". Plage de caractres. Correspond tout caractre dans la srie spcifie. Par exemple, "[a-z]" correspond tout caractre alphabtique minuscule compris entre "a" et "z". Plage de caractres ngative. Correspond tout caractre ne se trouvant pas dans la srie spcifie. Par exemple, "[^m-z]" correspond tout caractre ne se trouvant pas entre "m" et "z". Correspond une limite reprsentant un mot, autrement dit, la position entre un mot et un espace. Par exemple, "er\b" correspond "er" dans "lever", mais pas "er" dans "verbe". Correspond une limite ne reprsentant pas un mot. "en*t\B" correspond "ent" dans "bien entendu". Correspond un caractre reprsentant un chiffre. quivaut [0-9]. Correspond un caractre ne reprsentant pas un chiffre. quivaut [^0-9]. Correspond un caractre de saut de page. Correspond un caractre de nouvelle ligne. Correspond un caractre de retour chariot. Correspond tout espace blanc, y compris l'espace, la tabulation, le saut de page, etc. quivaut "[ \f\n\r\t\v]". Correspond tout caractre d'espace non blanc. quivaut "[^ \f\n\r\t\v]". Correspond un caractre de tabulation. Correspond un caractre de tabulation verticale. Correspond tout caractre reprsentant un mot et incluant un trait de soulignement. quivaut "[A-Za-z0-9 pond tout caractre ne reprsentant pas un mot. quivaut "[^A-Za-z0-9_]". Correspond num, o num est un entier positif. Fait rfrence aux correspondances mmorises. Par exemple, "(.)\1" correspond deux caractres identiques conscutifs. Correspond n, o n est une valeur d'chappement octale. Les valeurs d'chappement octales doivent comprendre 1, 2 ou 3 chiffres. Par exemple, "\11" et "\011" correspondent tous les deux un caractre de tabulation. "\0011" quivaut "\001" & "1". Les valeurs d'chappement octales ne doivent pas excder 256. Si c'tait le cas, seuls les deux premiers chiffres seraient pris en compte dans l'expression. Permet d'utiliser les codes ASCII dans des expressions rgulires. Correspond n, o n est une valeur d'chappement hexadcimale. Les valeurs d'chappement hexadcimales doivent comprendre deux chiffres obligatoirement. Par exemple, "\x41" correspond "A". "\x041" quivaut "\x04" & "1". Permet d'utiliser les codes ASCII dans des expressions rgulires.
- 49 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Un lment dans un modle peut tre prsent en 1 ou plusieurs exemplaires. Considrons quelques exemples autour du symbole \d qui reprsente 1 chiffre : modle \d \d? \d* \d+ \d{2} \d{3,} \d{5,7} signification un chiffre 0 ou 1 chiffre 0 ou davantage de chiffres 1 ou davantage de chiffres 2 chiffres au moins 3 chiffres entre 5 et 7 chiffres
Imaginons maintenant le modle capable de dcrire le format attendu pour une chane de caractres : chane recherche une date au format jj/mm/aa une heure au format hh:mm:ss un nombre entier non sign une suite d'espaces ventuellement vide un nombre entier non sign qui peut tre prcd ou suivi d'espaces un nombre entier qui peut tre sign et prcd ou suivi d'espaces un nombre rel non sign qui peut tre prcd ou suivi d'espaces un nombre rel qui peut tre sign et prcd ou suivi d'espaces une chane contenant le mot juste modle \d{2}/\d{2}/\d{2} \d{2}:\d{2}:\d{2} \d+ \s* \s*\d+\s* \s*[+|-]?\s*\d+\s* \s*\d+(.\d*)?\s* \s*[+|]?\s*\d+(.\d*)?\s* \bjuste\b
On peut prciser o on recherche le modle dans la chane : modle ^modle modle$ ^modle$ modle signification le modle commence la chane le modle finit la chane le modle commence et finit la chane le modle est cherch partout dans la chane en commenant par le dbut de celle-ci. modle !$ \.$ ^// ^\s*\w+\s*$ ^\s*\w+\s*\w+\s*$
chane recherche une chane se terminant par un point d'exclamation une chane se terminant par un point une chane commenant par la squence // une chane ne comportant qu'un mot ventuellement suivi ou prcd d'espaces une chane ne comportant deux mot ventuellement suivis ou prcds d'espaces une chane contenant le mot secret
\bsecret\b
- 50 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Les sous-ensembles d'un modle peuvent tre "rcuprs". Ainsi non seulement, on peut vrifier qu'une chane correspond un modle particulier mais on peut rcuprer dans cette chane les lments correspondant aux sous-ensembles du modle qui ont t entours de parenthses. Ainsi si on analyse une chane contenant une date jj/mm/aa et si on veut de plus rcuprer les lments jj, mm, aa de cette date on utilisera le modle (\d\d)/(\d\d)/(\d\d). Voyons sur cet exemple, comment on opre avec vbscript. 1 il nous faut tout d'abord crer un objet RegExp (Regular Expression) set modele=new regexp ensuite on fixe le modle tester modele.pattern="(\d\d)/(\d\d)/(\d\d)" on peut vouloir ne pas faire de diffrence entre majuscules et minuscules (par dfaut elle est faite). Ici a n'a aucune importance. modele.IgnoreCase=true on peut vouloir rechercher le modle plusieurs fois dans la chane (par dfaut ce n'est pas fait) modele.Global=true Une recherche globale n'a de sens que si le modle utilis ne fait pas rfrence au dbut ou la fin de la chane. on recherche alors toutes les correspondences du modle dans la chane : set correspondances=modele.execute(chaine) La mthode execute d'un objet RegExp rend une collection d'objets de type match. Cet objet a une proprit value qui est l'lment de chaine correspondant au modle. Si on a crit modele.global=true, on peut avoir plusieurs correspondances. C'est pourquoi le rsultat de la mthode execute est une collection de correspondances. le nombre de correspondances est donn par correspondances.count. Si ce nombre vaut 0, c'est que le modle n'a t trouv nulle part. La valeur de la correspondance n i est donne par correspondances(i).value. Si le modle contient des sous-modles entre parenthses, alors l'lments de correspondances(i) correspondant la parenthse j d modle est correspondances(i).submatches(j).
- 51 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Programme
Do While true ' on demande l'utilisateur de taper un texte wscript.stdout.writeLine "Tapez un texte contenant des dates au format jj/mm/aa et fin pour arrter : " chaine=wscript.stdin.readLine ' fini si chaine=fin If chaine="fin" Then Exit Do ' on compare la chane lue au modle de la date Set correspondances=modele.execute(chaine) ' a-t-on trouv une correspondance If correspondances.count<>0 Then ' on a au moins une correspondance For i=0 To correspondances.count-1 ' on affiche la correspondance i wscript.echo "J'ai trouv la date " & correspondances(i).value ' on rcupre les sous-lments de la correspondance i wscript.echo "Les lments de la date " & i & " sont (" & correspondances(i).submatches(0) & "," _ & correspondances(i).submatches(1) & "," & correspondances(i).submatches(2) & ")" Next Else ' pas de correspondance wscript.echo "Je n'ai pas trouv de date au format jj/mm/aa dans votre texte" End If Loop ' fini wscript.quit 0
Rsultats
Tapez un texte contenant des dates au format jj/mm/aa et fin pour aujourd'hui on est le 01/01/01 et demain sera le 02/01/02 J'ai trouv la date 01/01/01 Les lments de la date 0 sont (01,01,01) J'ai trouv la date 02/01/02 Les lments de la date 1 sont (02,01,02) Tapez un texte contenant des dates au format jj/mm/aa et fin pour une date au format incorrect : 01/01/2002 Je n'ai pas trouv de date au format jj/mm/aa dans votre texte Tapez un texte contenant des dates au format jj/mm/aa et fin pour une suite de dates : 10/10/10, 11/11/11, 12/12/12 J'ai trouv la date 10/10/10 Les lments de la date 0 sont (10,10,10) J'ai trouv la date 11/11/11 Les lments de la date 1 sont (11,11,11) J'ai trouv la date 12/12/12 Les lments de la date 2 sont (12,12,12) Tapez un texte contenant des dates au format jj/mm/aa et fin pour fin arrter :
arrter :
arrter :
arrter :
Avec les expressions rgulires, le programme testant qu'une saisie clavier est bien un nombre entier positif pourrait s'crire comme suit : Programme
' lecture d'une donne jusqu' ce que celle-ci soit reconnue comme un nombre Option Explicit Dim fini, nombre ' on dfinit le modle d'un nombre entier positif (mais qui peut tre nul) Dim modele Set modele=new regexp modele.pattern="^\s*\d+\s*$"
- 52 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Programme
' on boucle tant que la donne saisie n'est pas correcte ' la boucle est contrle par un boolen fini, mis faux au dpart (= ce n'est pas fini) fini=false Do While Not fini ' on demande le nombre wscript.stdout.write "Tapez un nombre entier >0: " ' on le lit nombre=wscript.stdin.readLine ' on teste le format de la donne lue Dim correspondances Set correspondances=modele.execute(nombre) ' le modle a-t-il t vrifi ? If correspondances.count<>0 Then ' c'est un entier mais est-il >0 ? nombre=cint(nombre) If nombre>0 Then fini=true End If End If ' msg d'erreur ventuel If Not fini Then wscript.echo "Erreur, vous n'avez pas tap un nombre entier >0. Recommencez svp..." Loop ' confirmation wscript.echo "Merci pour le nombre entier >0 : " & nombre ' et fin wscript.quit 0
Resultats
Tapez un nombre entier >0: 10.3 Erreur, vous n'avez pas tap un nombre Tapez un nombre entier >0: abcd Erreur, vous n'avez pas tap un nombre Tapez un nombre entier >0: -4 Erreur, vous n'avez pas tap un nombre Tapez un nombre entier >0: 0 Erreur, vous n'avez pas tap un nombre Tapez un nombre entier >0: 1 Merci pour le nombre entier >0 : 1 entier >0. Recommencez svp... entier >0. Recommencez svp... entier >0. Recommencez svp... entier >0. Recommencez svp...
Trouver l'expression rgulire qui nous permet de vrifier qu'une chane correspond bien un certain modle est parfois un vritable dfi. Le programme suivant permet de s'entraner. Il demande un modle et une chane et indique alors si la chane correspond ou non au modle. Programme
' expression rgulire ' on veut vrifier qu'une chane correspond un modle Option Explicit ' on dfinit le modle Dim modele Set modele=new regexp modele.global=true ' on recherchera le modle plusieurs fois dans la chane ' c'est l'utilisateur qui donne la chane dans laquelle on cherchera le modle Dim chaine, correspondances, i Do While true ' on demande l'utilisateur de taper un modle wscript.stdout.write "Tapez le modle tester et fin pour arrter : " modele.pattern=wscript.stdin.readLine
- 53 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Programme
' fini ? If modele.pattern="fin" Then Exit Do ' on demande l'utilisateur les chanes comparer au modle Do While true ' on demande l'utilisateur de taper un modle wscript.stdout.writeLine "Tapez la chane tester avec le modle [" & modele.pattern & "] et fin pour arrter : " chaine=wscript.stdin.readLine ' fini ? If chaine="fin" Then Exit Do ' on compare la chane lue au modle de la date Set correspondances=modele.execute(chaine) ' a-t-on trouv une correspondance If correspondances.count<>0 Then ' on a au moins une correspondance For i=0 To correspondances.count-1 ' on affiche la correspondance i wscript.echo "J'ai trouv la correspondance " & correspondances(i).value Next Else ' pas de correspondance wscript.echo "Je n'ai pas trouv de correspondance" End If Loop Loop ' fini wscript.quit 0
Rsultats
Tapez le modle tester et fin pour arrter : ^\s*\d+(\,\d+)*\s*$ Tapez la chane tester avec le modle [^\s*\d+(\,\d+)*\s*$] et fin pour arrter : 18 J'ai trouv la correspondance [18] Tapez la chane tester avec le modle [^\s*\d+(\,\d+)*\s*$] et fin pour arrter : 145.678 Je n'ai pas trouv de correspondance Tapez la chane tester avec le modle [^\s*\d+(\,\d+)*\s*$] et fin pour arrter : 145,678 J'ai trouv la correspondance [ 145,678 ]
number : un nombre entier numro de la dernire erreur qui s'est produite. 0 veut dire "pas d'erreur" description : le message d'erreur qu'aurait affiche le systme si on n'avait pas mis l'instruction on error resume next
Rsultats
C:\ err5.vbs(6, 1) Erreur d'excution Microsoft VBScript: Type incompatible: 'cdbl'
Rsultats
L'erreur [Type incompatible] s'est produite
Rcrivons le programme de saisie d'un entier >0 avec cette nouvelle mthode : Programme
' lecture d'une donne jusqu' ce que celle-ci soit reconnue comme un nombre Option Explicit Dim fini, nombre ' on boucle tant que la donne saisie n'est pas correcte ' la boucle est contrle par un boolen fini, mis faux au dpart (= ce n'est pas fini) fini=false
- 55 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Programme
Do While Not fini ' on demande le nombre wscript.stdout.write "Tapez un nombre entier >0: " ' on le lit nombre=wscript.stdin.readLine ' on teste le format de la donne lue On Error Resume Next nombre=cdbl(nombre) If err.number=0 Then ' pas d'erreur c'est un nombre ' on revient au mode normal de gestion des erreurs On Error GoTo 0 ' est-ce un entier >0 If (nombre-int(nombre))=0 And nombre>0 Then fini=true End If End If ' on revient au mode normal de gestion des erreurs On Error GoTo 0 ' msg d'erreur ventuel If Not fini Then wscript.echo "Erreur, vous n'avez pas tap un nombre entier >0. Recommencez svp..." Loop ' confirmation wscript.echo "Merci pour le nombre entier >0 : " & nombre ' et fin wscript.quit 0
Rsultats
Tapez un nombre entier >0: 4.5 Erreur, vous n'avez pas tap un nombre Tapez un nombre entier >0: 4,5 Erreur, vous n'avez pas tap un nombre Tapez un nombre entier >0: abcd Erreur, vous n'avez pas tap un nombre Tapez un nombre entier >0: -4 Erreur, vous n'avez pas tap un nombre Tapez un nombre entier >0: 1 Merci pour le nombre entier >0 : 1 entier >0. Recommencez svp... entier >0. Recommencez svp... entier >0. Recommencez svp... entier >0. Recommencez svp...
Commentaires :
Cette mthode est parfois la seule utilisable. Il ne faut alors pas oublier de revenir au mode normal de gestion des erreurs des que la squence d'instructions susceptible de gnrer l'erreur est termine.
- 56 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Programme
Option Explicit Dim syntaxe syntaxe= _ "Syntaxe : pg mari enfants salaire" & vbCRLF & _ "mari : caractre O si mari, N si non mari" & vbCRLF & _ "enfants : nombre d'enfants (entier >=0)" & vbCRLF & _ "salaire : salaire annuel sans les centimes (entier >=0)" ' on vrifie qu'il y a 3 arguments Dim nbArguments nbArguments=wscript.arguments.count If nbArguments<>3 Then ' msg d'erreur wscript.echo syntaxe & vbCRLF & vbCRLF & "erreur : nombre d'arguments incorrect" ' arrt avec code d'erreur 1 wscript.quit 1 End If ' on rcupre les arguments en vrifiant leur validit ' un argument est transmis au programme sans espaces devant et derrire ' on utilisera des expression rgulires pour vrifier la validit des donnes Dim modele, correspondances Set modele=new regexp ' le statut marital doit tre parmi les caractres oOnN modele.pattern="^[oOnN]$" Set correspondances=modele.execute(wscript.arguments(0)) If correspondances.count=0 Then ' erreur wscript.echo syntaxe & vbCRLF & vbCRLF & "erreur : argument marie incorrect" ' on quitte wscript.quit 2 End If ' on rcupre la valeur Dim marie If lcase(wscript.arguments(0)) = "o"Then marie=true Else marie=false End If ' enfants doit tre un nombre entier >=0 modele.pattern="^\d{1,2}$" Set correspondances=modele.execute(wscript.arguments(1)) If correspondances.count=0 Then ' erreur wscript.echo syntaxe & vbCRLF & vbCRLF & "erreur : argument enfants incorrect" ' on quitte wscript.quit 3 End If ' on rcupre la valeur Dim enfants enfants=cint(wscript.arguments(1)) ' salaire doit tre un entier >=0 modele.pattern="^\d{1,9}$" Set correspondances=modele.execute(wscript.arguments(2)) If correspondances.count=0 Then ' erreur wscript.echo syntaxe & vbCRLF & vbCRLF & "erreur : argument salaire incorrect" ' on quitte wscript.quit 4 End If ' on rcupre la valeur Dim salaire salaire=clng(wscript.arguments(2)) ' on dfinit les donnes ncessaire au calcul de l'impt dans 3 tableaux Dim limites, coeffn, coeffr limites=array(12620,13190,15640,24740,31810,39970,48360, _ 55790,92970,127860,151250,172040,195000,0) coeffr=array(0,0.05,0.1,0.15,0.2,0.25,0.3,0.35,0.4,0.45, _ 0.5,0.55,0.6,0.65)
- 57 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Programme
coeffn=array(0,631,1290.5,2072.5,3309.5,4900,6898.5,9316.5, _ 12106,16754.5,23147.5,30710,39312,49062) ' on calcule le nombre de parts Dim nbParts If marie=true Then nbParts=(enfants/2)+2 Else nbParts=(enfants/2)+1 End If If enfants>=3 Then nbParts=nbParts+0.5 ' on calcule le quotient familial et le revenu imposable Dim revenu, qf revenu=0.72*salaire qf=revenu/nbParts ' on calcule l'impt Dim i, impot i=0 Do While i<ubound(limites) And qf>limites(i) i=i+1 Loop impot=int(revenu*coeffr(i)-nbParts*coeffn(i)) ' on affiche le rsultat wscript.echo "impt=" & impot ' on quitte sans erreur wscript.quit 0
Rsultats
C:\>cscript impots2.vbs Syntaxe : pg mari enfants salaire mari : caractre O si mari, N si non mari enfants : nombre d'enfants (entier >=0) salaire : salaire annuel sans les centimes (entier erreur : nombre d'arguments incorrect C:\>cscript impots2.vbs a b c Syntaxe : pg mari enfants salaire mari : caractre O si mari, N si non mari enfants : nombre d'enfants (entier >=0) salaire : salaire annuel sans les centimes (entier erreur : argument marie incorrect C:\>cscript impots2.vbs o b c Syntaxe : pg mari enfants salaire mari : caractre O si mari, N si non mari enfants : nombre d'enfants (entier >=0) salaire : salaire annuel sans les centimes (entier erreur : argument enfants incorrect C:\>cscript impots2.vbs o 2 c Syntaxe : pg mari enfants salaire mari : caractre O si mari, N si non mari enfants : nombre d'enfants (entier >=0) salaire : salaire annuel sans les centimes (entier erreur : argument salaire incorrect C:\>cscript impots2.vbs o 2 200000 impt=22504
>=0)
>=0)
>=0)
>=0)
- 58 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Dcrire un problme complexe peut ncessiter plusieurs milliers de ces instructions lmentaires et plus. Il est alors trs difficile pour l'esprit humain d'avoir une vue globale d'un programme. Devant cette difficult d'apprhender le problme dans sa globalit, on le dcompose alors en sous problmes plus simples rsoudre. Considrons le problme suivant : Trier une liste de valeurs numriques tapes au clavier et afficher la liste trie l'cran. On peut dans un premier temps dcrire la solution sous la forme suivante:
dbut lire les valeurs et les mettre dans un tableau T trier le tableau crire les valeurs tries du tableau T l'cran fin
On a dcompos le problme en 3 sous-problmes, plus simples rsoudre. L'criture algorithmique est souvent plus formalise que la prcdente et l'algorithme s'crira plutt:
dbut lire_tableau(T) trier_tableau(T) crire_tableau(T) fin
sont des oprations non lmentaires qui doivent tre dcrites leur tour par des oprations lmentaires. Ceci est fait dans ce qu'on appelle des modules. La donne T est appele un paramtre du module. C'est une information que le programme appelant passe au module appel (paramtre d'entre) ou reoit du module appel (paramtre de sortie). Les paramtres d'un module sont donc les informations qui sont changes entre le programme appelant et le module appel.
- 60 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
dbut crire "Tapez la suite de valeurs trier sous la forme val1 val2 ... : " lire valeurs construire tableau T partir de la chane valeurs fin
Ici, nous avons suffisamment dcrit le module lire_tableau. En effet, les trois actions ncessaires ont une traduction immdiate en vbscript. La dernire ncessitera l'utilisation de la fonction split. Si vbscript n'avait pas cette fonction, l'action 3 devrait tre dcompose son tour en actions lmentaires ayant un quivalent immdiat en vbscript. Le module crire_tableau(T) pourrait tre dcrit comme suit :
dbut construire chane texte "valeur1,valeur2,...." partir du tableau T crire texte fin
Le module crire_tableau(T) pourrait tre dcrit comme suit (on suppose que les indices des lments de T commencent 0) :
dbut N<-- indice dernier lment du tableau T pour IFIN variant de N 1 faire //on recherche l'indice IMAX du plus gd lment de T
- 61 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
// IFIN est l'indice du dernier lment de T chercher_max(T, IFIN, IMAX) // on change l'lment le plus grand de T avec le dernier lment de T changer (T, IMAX, IFIN) finfaire FIN
Ici l'algorithme utilise de nouveau des actions non lmentaires: . chercher_max(T, IFIN, IMAX) . changer(T, IMAX, IFIN) chercher_max(T, IFIN, IMAX) rend l'indice IMAX de l'lment le plus grand du tableau T dont l'indice du dernier lment est IFIN.
changer(T, IMAX, IFIN) change 2 lments du tableau T , ceux d'indice IMAX et IFIN.
Il faut donc dcrire les nouvelles oprations non lmentaires. module chercher_max(A, IFIN, IMAX)
dbut IMAX<--0 pour i variant de 1 IFIN faire si T[i] >T[IMAX] alors dbut IMAX<--i fin finfaire fin
Le problme initial a t compltement dcrit l'aide d'oprations lmentaires vbscript et peut donc maintenant faire l'objet d'une traduction dans ce langage. On notera que les actions lmentaires peuvent diffrer d'un langage l'autre et que donc l'analyse d'un problme doit un certain moment tenir compte du langage de programmation
- 62 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
utilis. Un objet qui existe dans un langage peut ne pas exister dans un autre et modifier alors l'algorithme utilis. Ainsi, si un langage avait une fonction de tri, il serait ici absurde de ne pas l'utiliser. Le principe appliqu ici, est celui dit de l'analyse descendante. Si on reprsente l'ossature de la solution, on a la chose suivante :
Pour rendre son rsultat, la fonction doit comporter une instruction d'affectation du rsultat une variable portant le nom de la fonction : nomFonction=rsultat
- 63 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Pour la fonction, on se rappellera que le rsultat doit avoir t affect une variable portant le nom de la fonction avant que celle-ci ne se termine par un end function ou exit function.
sub nomProcdure([Byref/Byval] param1, [Byref/Byval] param2, ...) function nomFonction([Byref/Byval] param1, [Byref/Byval] param2, ...)
Lorsque le mode de transmission byRef ou byVal n'est pas prcis, c'est le mode byRef qui est utilis. Paramtres effectifs, paramtres formels Soit une fonction vbscript dfinie par
Les paramtres parmamFormi utiliss dans la dfinition de la fonction ou de la procdure sont appels paramtres formels. La fonction prcdente pourra tre utilise partir du programme principal ou d'un autre module par une instruction du genre : rsultat=nomFonction(paramEff1, paramEff2, ...) Les paramtres parmamEffi utiliss dans l'appel la fonction ou la procdure sont appels paramtres effectifs. Lorsque l'excution de la fonction nomFonction commence, les paramtres formels reoivent les valeurs des paramtres effectifs correspondants. Les mots cls byRef et byVal fixent le mode de transmission de ces valeurs. Mode de transmission par valeur (byVal) Lorsqu'un paramtre formel prcise ce mode de transmission, le paramtre formel et le paramtre effectif sont alors deux variables diffrentes. La valeur du paramtre effectif est copie dans le paramtre formel avant excution de la fonction ou procdure. Si celle-ci modifie la valeur du paramtre formel au cours de son excution, cela ne modifie en rien la valeur du paramtre effectif correspondant. Ce mode de transmission convient bien aux paramtres d'entre de la fonction ou procdure.
- 64 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Mode de transmission par rfrence (byRef) Ce mode de transmission est le mode par dfaut si aucun mode de transmission du paramtre n'est indique. Lorsqu'un paramtre formel prcise ce mode de transmission, le paramtre formel et le paramtre effectif correspondant sont une seule et mme variable. Ainsi si la fonction modifie le paramtre formel, le paramtre effectif est galement modifie. Ce mode de transmission convient bien : aux paramtres de sortie car la valeur de ceux-ci doivent tre transmise au programme appelant aux paramtres d'entre coteux a recopier tels les tableaux
:",i,j,k
:",i,j,k
Rsultats
dans programme principal, avant l'appel proc1 : i=4 j=5 k=6 dans proc1 i=5 j=6 k=7 dans programme principal, aprs l'appel proc1 : i=4 j=6 k=7
- 65 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Commentaires
Dans un script vbscript, il n'y a pas de place particulire pour les fonctions et les procdures. Elles peuvent tre n'importe ou dans le texte source. En gnral, on les regroupe soit au dbut soit a la fin et on fait en sorte que le programme principal constitue un bloc continu.
IV-C-3 - Syntaxe d'appel des fonctions et procdures Soit une procdure p admettant des paramtres formels pf1, pf2, ...
l'appel a la procdure p se fait sous la forme p pe1, pe2, ... sans parenthses autour des paramtres si la procdure p n'admet aucun paramtre, on peut indiffremment utiliser l'appel p ou p() et la dclaration sub p ou sub p()
Soit une fonction f admettant des parametres formels pf1, pf2, ...
l'appel a la fonction f se fait sous la forme resultat=f(pe1, pe2, ...) les parenthses autour des paramtres sont obligatoires. Si la fonction f n'admet aucun paramtre, on peut indiffremment utiliser l'appel f ou f() et la dclaration function f ou function f(). le rsultat de la fonction f peut tre ignore par le programme appelant. La fonction f est alors considre comme une procdure et suit les rgles d'appel des procdures. On crit alors f pe1, pe2, ... (sans parenthses) pour appeler la fonction f.
Si la fonction ou procdure est une mthode d'objet, il semblerait que les rgles soient quelque peu diffrentes et non homognes. ainsi on peut crire MyFile.WriteLine "Ceci est un test." ou MyFile.WriteLine("Ceci est un test.") mais si on peut crire wscript.echo 4, on ne peut pas crire wscript.echo(4).
Programme
End If Else wscript.echo "Arguments (" & i & "," & j & ") errons" plusgrandque=false End If Exit Function End Function Function rendUnTableau(byval n) ' rend un tableau de n lments tableau=array() ' vrification validit du paramtre n If isnumeric(n) And n>=1 Then ReDim Preserve tableau(n) For i= 0 To n-1 tableau(i)=i Next Else wscript.echo "Argument [" & n & "] erron" End If ' on rend le rsultat rendUnTableau=tableau End Function Function argumentsVariables(byref arguments) ' arguments est un tableau de nombres dont on rend la somme somme=0 For i=0 To ubound(arguments) somme=somme+arguments(i) Next argumentsVariables=somme End Function ' deux fonctions sans paramtres dclares de 2 faons diffrentes Function sansParametres1 sansParametres=4 End Function Function sansParametres2() sansParametres=4 End Function ' ------------- appels aux fonctions et procdures ' appels fonction plusgrandque wscript.echo "plusgrandque(10,6)=" & plusgrandque(10,6) wscript.echo "plusgrandque(6,10)=" & plusgrandque(6,10) wscript.echo "plusgrandque(6,6)=" & plusgrandque(6,6) wscript.echo "plusgrandque(6,'a')=" & plusgrandque(6,"a") ' appels la fonction rendUnTableau monTableau=rendUnTableau(10) For i=0 To ubound(monTableau) wscript.echo monTableau(i) Next monTableau=rendUnTableau(-6) For i=0 To ubound(monTableau) wscript.echo monTableau(i) Next ' appels la fonction argumentsVariables wscript.echo "somme=" & argumentsVariables(array(-1,2,7,8)) wscript.echo "somme=" & argumentsVariables(array(-1,10,12)) ' appels des fonctions sans paramtres res=sansParametres1 res=sansParametres1() sansParametres1 sansParametres1() res=sansParametres2 res=sansParametres2() sansParametres2 sansParametres2() ' fin wscript.quit 0
- 67 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Rsultats
plusgrandque(10,6)=Vrai plusgrandque(6,10)=Faux plusgrandque(6,6)=Faux Arguments (6,a) errons plusgrandque(6,'a')=Faux 0 1 2 3 4 5 6 7 8 9 Argument [-6] erron somme=16 somme=21 somme=10
Commentaires
la fonction RendUnTableau montre qu'une fonction peut rendre plusieurs rsultats et non un seul. Il suffit qu'elle les place dans un variant tableau et qu'elle rende ce variant comme rsultat. inversement la fonction argumentsVariables montre qu'on peut crire une fonction qui admet un nombre variable d'arguments. Il suffit la galement de les mettre dans un variant tableau et de faire de ce variant un paramtre de la fonction.
- 68 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Programme
' lecture des valeurs T=lire_tableau ' tri des valeurs trier_tableau T ' affichage des valeurs tries ecrire_tableau T ' fin wscript.quit 0 ' ---------- fonctions & procdures ' -------- lire_tableau Function lire_tableau ' on demande les valeurs wscript.stdout.write "Tapez les valeurs trier sous la forme val1 val2 ... valn : " ' on les lit Dim valeurs valeurs=wscript.stdin.readLine ' on les met dans un tableau lire_tableau=split(valeurs," ") End Function ' -------- ecrire_tableau Sub ecrire_tableau(byref T) ' affiche le contenu du tableau T wscript.echo join(T," ") End Sub ' -------- trier_tableau Sub trier_tableau (byref T) ' tri le tableau T en ordre croissant ' on cherche l'indice imax du tableau T[0..ifin] ' pour changer T[imax] avec le dernier lment du tableau T[0..ifin] ' ensuite on recommence avec un tableau ayant 1 lment de moins Dim ifin, imax, temp For ifin=ubound(T) To 1 Step -1 ' on cherche l'indice imax du tableau T[0..ifin] imax=chercher_max(T,ifin) ' on l'change le max avec le dernier lment du tableau T[0..ifin] temp=T(ifin):T(ifin)=T(imax):T(imax)=temp Next End Sub ' -------- chercher_max Function chercher_max(byRef T, ByVal ifin) ' on cherche l'indice imax du tableau T[0..ifin] Dim i, imax imax=0 For i=1 To ifin If cdbl(T(i))>cdbl(T(imax)) Then imax=i Next ' On rend le rsultat chercher_max=imax End Function
Rsultats
Tapez les valeurs trier sous la forme val1 val2 ... valn : 10 9 8 7 6 1 1 6 7 8 9 10
Commentaires :
le module changer qui avait t identifie dans l'algorithme initial n'a pas fait ici l'objet d'un module en vbscript parce que juge trop simple pour faire l'objet d'un module particulier.
- 69 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Nous reprenons le programme de calcul de l'impt crit cette fois sous forme modulaire Programme
' calcul de l'impt d'un contribuable ' le programme doit tre appel avec trois paramtres : mari enfants salaire ' mari : caractre O si mari, N si non mari ' enfants : nombre d'enfants ' salaire : salaire annuel sans les centimes ' dclaration obligatoire des variables Option Explicit Dim erreur ' on rcupre les arguments en vrifiant leur validit Dim marie, enfants, salaire erreur=getArguments(marie,enfants,salaire) ' erreur ? If erreur(0)<>0 Then wscript.echo erreur(1) : wscript.quit erreur(0) ' on rcupre les donnes ncessaires au calcul de l'impt Dim limites, coeffR, coeffN getData limites,coeffR,coeffN ' on affiche le rsultat wscript.echo "impt=" & calculerImpot(marie,enfants,salaire,limites,coeffR,coeffN) ' on quitte sans erreur wscript.quit 0 ' ------------ fonctions et procdures ' ----------- getArguments Function getArguments(byref marie, ByRef enfants, ByRef salaire) ' doit rcuprer trois valeurs passes comme argument au programme principal ' un argument est transmis au programme sans espaces devant et derrire ' on utilisera des expression rgulires pour vrifier la validit des donnes ' rend un variant tableau erreur 2 valeurs ' erreur(0) : code d'erreur, 0 si pas d'erreur ' erreur(1) : message d'erreur si erreur sinon la chane vide Dim syntaxe syntaxe= _ "Syntaxe : pg mari enfants salaire" & vbCRLF & _ "mari : caractre O si mari, N si non mari" & vbCRLF & _ "enfants : nombre d'enfants (entier >=0)" & vbCRLF & _ "salaire : salaire annuel sans les centimes (entier >=0)" ' on vrifie qu'il y a 3 arguments Dim nbArguments nbArguments=wscript.arguments.count If nbArguments<>3 Then ' msg d'erreur getArguments= array(1,syntaxe & vbCRLF & vbCRLF & "erreur : nombre d'arguments incorrect") ' fin Exit Function End If Dim modele, correspondances Set modele=new regexp ' le statut marital doit tre parmi les caractres oOnN modele.pattern="^[oOnN]$" Set correspondances=modele.execute(wscript.arguments(0)) If correspondances.count=0 Then ' msg d'erreur getArguments=array(2,syntaxe & vbCRLF & vbCRLF & "erreur : argument marie incorrect") ' on quitte Exit Function End If ' on rcupre la valeur If lcase(wscript.arguments(0)) = "o"Then marie=true Else marie=false End If
- 70 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Programme
' enfants doit tre un nombre entier >=0 modele.pattern="^\d{1,2}$" Set correspondances=modele.execute(wscript.arguments(1)) If correspondances.count=0 Then ' erreur getArguments= array(3,syntaxe & vbCRLF & vbCRLF & "erreur : argument enfants incorrect") ' on quitte Exit Function End If ' on rcupre la valeur enfants=cint(wscript.arguments(1)) ' salaire doit tre un entier >=0 modele.pattern="^\d{1,9}$" Set correspondances=modele.execute(wscript.arguments(2)) If correspondances.count=0 Then ' erreur getArguments= array(4,syntaxe & vbCRLF & vbCRLF & "erreur : argument salaire incorrect") ' on quitte Exit Function End If ' on rcupre la valeur salaire=clng(wscript.arguments(2)) ' c'est fini sans erreur getArguments=array(0,"") End Function ' ----------- getData Sub getData(byref limites, ByRef coeffR, ByRef coeffN) ' on dfinit les donnes ncessaire au calcul de l'impt dans 3 tableaux limites=array(12620,13190,15640,24740,31810,39970,48360, _ 55790,92970,127860,151250,172040,195000,0) coeffr=array(0,0.05,0.1,0.15,0.2,0.25,0.3,0.35,0.4,0.45, _ 0.5,0.55,0.6,0.65) coeffn=array(0,631,1290.5,2072.5,3309.5,4900,6898.5,9316.5, _ 12106,16754.5,23147.5,30710,39312,49062) End Sub ' ----------- calculerImpot Function calculerImpot(byval marie,ByVal enfants,ByVal salaire, ByRef limites, ByRef coeffR, ByRef coeffN) ' on calcule le nombre de parts Dim nbParts If marie=true Then nbParts=(enfants/2)+2 Else nbParts=(enfants/2)+1 End If If enfants>=3 Then nbParts=nbParts+0.5 ' on calcule le quotient familial et le revenu imposable Dim revenu, qf revenu=0.72*salaire qf=revenu/nbParts ' on calcule l'impt Dim i, impot i=0 Do While i<ubound(limites) And qf>limites(i) i=i+1 Loop calculerImpot=int(revenu*coeffr(i)-nbParts*coeffn(i)) End Function
Commentaires
la fonction getArguments permet de rcuprer les informations (marie, enfants, salaire) du contribuable. Ici, elles sont passes en arguments au programme vbscript. Si cela devait changer, par exemple si ces
- 71 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
arguments venaient d'une interface graphique, seule la procdure getArguments devrait tre rcrite et pas les autres. la fonction getArguments peut dtecter des erreurs sur les arguments. Lorsque ceci se produit, on aurait pu dcider d'arrter l'excution du programme dans la fonction getArguments par une instruction wscript.quit. Ceci ne doit jamais tre fait dans une fonction ou procdure. Si une fonction ou procdure dtecte une erreur, elle doit le signaler d'une faon ou d'une autre au programme appelant. C'est a lui de prendre la dcision d'arrter l'excution ou non, pas a la procdure. Dans notre exemple, le programme appelant pourrait dcider de redemander a l'utilisateur de retaper la donne errone au clavier plutt que d'arrter l'excution. ici, la fonction getArguments rend un variant tableau ou le 1er lment est un code d'erreur (0 si pas d'erreur) et le second un message d'erreur si il y a eu erreur. En testant le rsultat obtenu, le programme appelant peut savoir s'il y a eu erreur ou non. la procdure getData permet d'obtenir les donnes ncessaires au calcul de l'impt. Ici elles sont directement dfinies dans la procdure getData. Si ces donnes devaient provenir d'une autre source, d'un fichier ou d'une base de donnes par exemple, seule la procdure getData devrait tre rcrite et pas les autres. la fonction calculerImpot permet de calculer l'impt une fois que toutes les donnes ont t obtenues quelque soit la faon dont elles ont t obtenues. on notera donc qu'une criture modulaire permet une (r)utilisation de certains modules dans diffrents contextes. Ce concept a t dans les vingt dernires annes fortement dvelopp dans le concept d'objet.
- 72 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Rsultats
C:\>cscript fic1.vbs C:\>dir FIC1 VBS 352 07/01/02 7:07 fic1.vbs
- 73 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Rsultats
TESTFILE TXT 25 07/01/02 7:07 testfile.txt C:\>more testfile.txt Ceci est un autre test.
Commentaires
la ligne 7 cre un objet fichier de type "Scripting.FileSystemObject" par la fonction CreateObject("Scripting.FileSystemObject"). Un tel objet permet l'accs a tout fichier du systme pas simplement a des fichiers texte. la ligne 9 cre un objet "TextStream". La cration de cet objet est associe a la cration du fichier testfile.txt. Ce fichier n'est pas dsigne par un nom absolu du genre c:\dir1\dir2\....\testfile.txt mais par un nom relatif testfile.txt. Il sera alors cre dans le rpertoire d'ou sera lance la commande d'excution du fichier. le systme de fichiers du systme windows n'a pas connaissance de concepts tels que fichier texte ou fichier non texte. Il ne connat que des fichiers. C'est donc au programme qui exploite ce fichier de savoir s'il va le traiter comme un fichier texte ou non. La ligne 9 cre un objet d'o la commande set utilise pour l'affectation. La cration d'un objet fichier texte passe par la cration de 2 objets : la cration d'un objet Scripting.FileSystemObject (ligne 7) puis par la cration d'un objet "TextStream" (fichier texte) par la mthode OpenTextFile de l'objet Scripting.FileSystemObject qui admet plusieurs paramtres : le nom du fichier a grer (obligatoire)
le mode d'utilisation du fichier. C'est un entier avec 3 valeurs possibles : 1 : utilisation du fichier en lecture 2 : utilisation du fichier en criture. S'il n'existe pas dj et si le 3ime paramtre est prsent et a la valeur true, il est cr sinon il n'est pas. S'il existe dj, il est cras. 8 : utilisation du fichier en ajout, c.a.d. criture en fin de fichier. Si le fichier n'existe pas dj et si le 3ime paramtre est prsent et a la valeur true, il est cr sinon il n'est pas. la ligne 11 crit une ligne de texte avec la mthode WriteLine de l'objet TextStream cre. la ligne 13 "ferme" le fichier. On ne peut alors plus crire ou lire dedans. la ligne 16 cre un nouvel objet "TextStream" pour exploiter le mme fichier que prcdemment mais cette fois-ci en mode "ajout". Les lignes qui seront crites le seront derrire les lignes existantes. la ligne 18 crit deux nouvelles lignes sachant que la constante vbCRLF est la marque de fin de ligne des fichiers texte. la ligne 20 ferme de nouveau le fichier la ligne 23 le rouvre en mode "lecture" : on va lire le contenu du fichier. La ligne 27 lit une ligne de texte avec la mthode ReadLine de l'objet TextStream. Lorsque le fichier vient d'tre "ouvert", on est positionne sur la 1ere ligne de texte de celui-ci.Lorsque celle-ci a t lue par la mthode ReadLine, on est positionn sur la seconde ligne. Ainsi la mthode Readline non seulement lit la ligne courante mais "avance" ensuite automatiquement a la ligne suivante. Pour lire toutes les lignes de texte, la mthode ReadLine doit tre applique de faon rpte dans une boucle. Celle-ci (ligne 26) se termine lorsque l'attribut AtEndOfStream de l'objet TextStream a la valeur true. Cela signifie alors qu'il n'y a plus de lignes a lire dans le fichier.
- 74 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Rsultats
C:\>dir FIC1 VBS 964 07/01/02 7:54 fic1.vbs TESTFILE TXT 0 07/01/02 8:18 testfile.txt FIC2 VBS 1 252 07/01/02 8:23 fic2.vbs 3 fichier(s) 2 216 octets 2 rpertoire(s) 4 007.11 Mo libre C:\>cscript fic2.vbs Le fichier [abcd] n'existe pas Le fichier [abcd] n'existe pas Le fichier [abcd] n'existe pas
- 75 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Nous reprenons l'application de calcul de l'impt en supposant que les donnes ncessaires au calcul de l'impt sont dans un fichier texte appel data.txt :
12620 13190 15640 24740 31810 39970 48360 55790 92970 127860 151250 172040 195000 0 0 0,05 0,1 0,15 0,2 0,25 0,3 0,35 0,4 0,45 0,5 0,55 0,6 0,65 0 631 1290,5 2072,5 3309,5 4900 6898,5 9316,5 12106 16754,5 23147,5 30710 39312 49062
Les trois lignes contiennent respectivement les donnes des tableaux limites, coeffR et coeffN de l'application. Grce la modularisation de notre application, les modifications interviennent essentiellement dans la procdure getData charge de construire les trois tableaux. Le nouveau programme est le suivant : Programme
' calcul de l'impt d'un contribuable ' le programme doit tre appel avec trois paramtres : mari enfants salaire ' mari : caractre O si mari, N si non mari ' enfants : nombre d'enfants ' salaire : salaire annuel sans les centimes ' dclaration obligatoire des variables Option Explicit Dim erreur ' on rcupre les arguments en vrifiant leur validit Dim marie, enfants, salaire erreur=getArguments(marie,enfants,salaire) ' erreur ? If erreur(0)<>0 Then wscript.echo erreur(1) : wscript.quit erreur(0) ' on rcupre les donnes ncessaires au calcul de l'impt Dim limites, coeffR, coeffN erreur=getData(limites,coeffR,coeffN) ' erreur ? If erreur(0)<>0 Then wscript.echo erreur(1) : wscript.quit 5 ' on affiche le rsultat wscript.echo "impt=" & calculerImpot(marie,enfants,salaire,limites,coeffR,coeffN) ' on quitte sans erreur wscript.quit 0 ' ------------ fonctions et procdures ' ----------- getArguments Function getArguments(byref marie, ByRef enfants, ByRef salaire) ' doit rcuprer trois valeurs passes comme argument au programme principal ' un argument est transmis au programme sans espaces devant et derrire ' on utilisera des expression rgulires pour vrifier la validit des donnes ' rend un variant tableau erreur 2 valeurs ' erreur(0) : code d'erreur, 0 si pas d'erreur ' erreur(1) : message d'erreur si erreur sinon la chane vide Dim syntaxe syntaxe= _ "Syntaxe : pg mari enfants salaire" & vbCRLF & _ "mari : caractre O si mari, N si non mari" & vbCRLF & _ "enfants : nombre d'enfants (entier >=0)" & vbCRLF & _ "salaire : salaire annuel sans les centimes (entier >=0)" ' on vrifie qu'il y a 3 arguments Dim nbArguments nbArguments=wscript.arguments.count If nbArguments<>3 Then ' msg d'erreur getArguments= array(1,syntaxe & vbCRLF & vbCRLF & "erreur : nombre d'arguments incorrect") ' fin Exit Function End If Dim modele, correspondances Set modele=new regexp ' le statut marital doit tre parmi les caractres oOnN modele.pattern="^[oOnN]$"
- 76 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Programme
Set correspondances=modele.execute(wscript.arguments(0)) If correspondances.count=0 Then ' msg d'erreur getArguments=array(2,syntaxe & vbCRLF & vbCRLF & "erreur : argument marie incorrect") ' on quitte Exit Function End If ' on rcupre la valeur If lcase(wscript.arguments(0)) = "o"Then marie=true Else marie=false End If ' enfants doit tre un nombre entier >=0 modele.pattern="^\d{1,2}$" Set correspondances=modele.execute(wscript.arguments(1)) If correspondances.count=0 Then ' erreur getArguments= array(3,syntaxe & vbCRLF & vbCRLF & "erreur : argument enfants incorrect") ' on quitte Exit Function End If ' on rcupre la valeur enfants=cint(wscript.arguments(1)) ' salaire doit tre un entier >=0 modele.pattern="^\d{1,9}$" Set correspondances=modele.execute(wscript.arguments(2)) If correspondances.count=0 Then ' erreur getArguments= array(4,syntaxe & vbCRLF & vbCRLF & "erreur : argument salaire incorrect") ' on quitte Exit Function End If ' on rcupre la valeur salaire=clng(wscript.arguments(2)) ' c'est fini sans erreur getArguments=array(0,"") End Function ' ----------- getData Function getData(byref limites, ByRef coeffR, ByRef coeffN) ' les donnes des trois tableaux limites, coeffR, coeffN sont dans un fichier texte ' appel data.txt. Chaque tableau occupe une ligne sous la forme val1 val2 ... valn ' on trouve dans l'ordre limites, coeffR, coeffN ' rend un variant erreur tableau 2 lments pour grer l'ventuelle erreur ' erreur(0) : 0 si pas d'erreur, un nombre entier >0 sinon ' erreur(1) : le message d'erreur si erreur Dim objFichier,MyFile,codeErreur Const ForReading = 1, dataFileName="data.txt" ' on cre un objet fichier Set objFichier=CreateObject("Scripting.FileSystemObject") ' on ouvre le fichier data.txt en lecture On Error Resume Next Set MyFile= objFichier.OpenTextFile(dataFileName, ForReading) ' erreur ? codeErreur=err.number On Error GoTo 0 If codeErreur<>0 Then ' il y a eu erreur - on la note getData=array(1,"Impossible d'ouvrir le fichier des donnes [" & dataFileName & "] en lecture") ' on rentre Exit Function End If ' on suppose maintenant que le contenu est correct et on ne fait aucune vrification
- 77 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
Programme
' on lit les 3 lignes ' limites Dim ligne, i ligne=MyFile.ReadLine getDataFromLine ligne,limites ' coeffR ligne=MyFile.ReadLine getDataFromLine ligne,coeffR ' coeffN ligne=MyFile.ReadLine coeffN=split(ligne," ") getDataFromLine ligne,coeffN ' on ferme le fichier MyFile.close ' c'est fini sans erreur getData=array(0,"") End Function ' ----------- getDataFromLine Sub getDataFromLine(byref ligne, ByRef tableau) ' met dans tableau les valeurs numriques contenues dans ligne ' celles-ci sont spares par un ou plusieurs espaces ' au dpart le tableau est vide tableau=array() ' on dfinit un modle pour la ligne Dim modele, correspondances Set modele= New RegExP With modele .pattern="\d+,\d+|\d+" ' 140,5 ou 140 .global=true ' toutes les valeurs End With ' on analyse la ligne Set correspondances=modele.execute(ligne) Dim i For i=0 To correspondances.count-1 ' on redimensionne le tableau ReDim Preserve tableau(i) ' on affecte une valeur au nouvel lment tableau(i)=cdbl(correspondances(i).value) Next 'fin End Sub ' ----------- calculerImpot Function calculerImpot(byval marie,ByVal enfants,ByVal salaire, ByRef limites, ByRef coeffR, ByRef coeffN) ' on calcule le nombre de parts Dim nbParts If marie=true Then nbParts=(enfants/2)+2 Else nbParts=(enfants/2)+1 End If If enfants>=3 Then nbParts=nbParts+0.5 ' on calcule le quotient familial et le revenu imposable Dim revenu, qf revenu=0.72*salaire qf=revenu/nbParts ' on calcule l'impt Dim i, impot i=0 Do While i<ubound(limites) And qf>limites(i) i=i+1 Loop calculerImpot=int(revenu*coeffr(i)-nbParts*coeffn(i)) End Function
Commentaires :
- 78 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
dans le fichier texte data.txt, les valeurs peuvent tre spares par un ou plusieurs espaces, d'ou l'impossibilit d'utiliser la fonction split pour rcuprer les valeurs de la ligne. Il a fallu passer par une expression rgulire la fonction getData rend, outre les trois tableaux limites, coeffR, coeffN, un rsultat indiquant s'il y a eu erreur ou non. Ce rsultat est un variant tableau de eux lments. Le premier lment est un code d'erreur (0 si pas d'erreur), le second le message d'erreur s'il y a eu erreur. la fonction getData ne teste pas la validit des valeurs trouves dans le fichier data.txt. En situation relle, elle devrait le faire.
- 79 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/
- 80 Ce document est issu de http://www.developpez.com et reste la proprit exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise l'obtention pralable de l'autorisation de l'auteur.
http://tahe.developpez.com/web/vbscript/