Vous êtes sur la page 1sur 80

INTRODUCTION AU LANGAGE VBSCRIPT

par Serge Tah (tahe.developpez.com)

Date de publication : janvier 2002 Dernire mise jour :

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.

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

I - Les contextes d'excution de VBSCRIPT I-A - Introduction


Un programme vbscript ne s'excute pas directement sous Windows mais dans un conteneur qui lui fournit un contexte d'excution et un certain nombre d'objets qui lui sont propres. Par ailleurs, le programme vbscript peut utiliser des objets mis sa disposition par le systme Windows, objets appels objets ActiveX.

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.

Le conteneur dans lequel s'excute le programme vbscript joue un rle primordial :


les objets mis disposition du programme vbscript par le conteneur changent d'un conteneur l'autre. Ainsi WSH met disposition d'un programme vbs un objet appell WScript qui donne accs, par exemple, aux partages et imprimantes rseau de la machine hte. IE lui, met a disposition du programme vbs, un objet appel document qui reprsente la totalit du document HTML visualis. Le programme vbs va alors pouvoir agir sur ce document. Excel lui met a disposition d'un programme VBA des objets reprsentant des classeurs, des feuilles de classeurs, des graphiques, etc.... en fait tous les objets manipuls par Excel. si les objets d'un conteneur donnent toute sa puissance un programme vbscript, il peut parfois en limiter certains domaines. Ainsi un programme vbscript excut dans le navigateur IE ne peut pas accder au disque de la machine hte, ceci pour des raisons de scurit.

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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.

I-B - Le conteneur WSH


Le conteneur WSH (Windows Scripting Host) permet l'excution, au sein de Windows, de programmes crits en divers langages : vbscript, javascript, perlscript, python, ... Il existe une norme respecter pour qu'un langage puisse tre utilise au sein de WSH. Tout langage respectant cette norme est candidat l'excution au sein de WSH. On peut imaginer que la liste prcdente des langages s'excutant dans WSH puisse s'allonger. Un conteneur met la disposition des programmes qu'il excute des objets qui leur donnent leur vritable puissance. Ceci tend gommer les diffrences entre langages puisqu'ils utilisent alors tous le mme ensemble d'objets. Utiliser un langage plutt qu'un autre peut devenir alors une simple affaire de got plutt que de performances. L'excution d'un programme dans WSH se fait a l'aide de deux excutables : wscript.exe et cscript.exe. wscript.exe se trouve normalement dans le rpertoire d'installation de windows appelle gnralement %windir% :

C:\ >echo %windir% C:\WINDOWS C:\>dir c:\windows\wscript.exe WSCRIPT EXE 123 280 19/09/01 11:54 wscript.exe

L'excutable cscript.exe se trouve lui sous %windir%\command :

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

Voici un script coucou.vbs qui affiche coucou a l'cran :

Ouvrons une fentre DOS et excutons-le successivement avec wscript et cscript :

-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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

L'argument //nologo supprime l'affichage de la bannire de wsh : C:\>cscript //nologo coucou.vbs coucou

I-C - La forme d'un script WSH


Nous venons de voir un premier script : coucou.vbs

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 :

L'excution de ce script donne la chose suivante :

C:\>cscript //nologo coucou2.wsf coucou

Un script WSH peut mlanger les langages :

L'excution de ce script donne la chose suivante :

C:\>cscript //nologo coucou3.wsf coucou (vbscript) coucou (javascript) coucou (perlscript)

-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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

Nous retiendrons les points suivants :


1 2 3 4 Le conteneur WSH n'est pas li un langage. Un script wsh peut mlanger les langages dans un fichier de suffixe .wsf Le script est alors encadr par des balises <job id="..."> ... </job> A l'intrieur de l'application (=job), les langages utiliss par les diffrentes portions de code sont balises par <script language="...."> .... </script> Ce langage de balisages porte un nom : XML pour eXtended Markup Language. XML ne dfinit aucune balise mais des rgles d'agencement de balises. Ici on devrait donc dire que le langage de balisages utilis dans un script wsh suit la norme XML.

Par la suite, nous utiliserons exclusivement vbscript dans des fichiers .vbs.

I-D - L'objet WSCRIPT


Le conteneur WSH met a la disposition des scripts qu'il excute un objet appelle wscript. Un objet a des proprits et des mthodes :

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

I-E - Le conteneur Internet Explorer


Nous avons crit plus haut que Internet Explorer pouvait tre un conteneur pour un script vbscript. Montrons-le sur un exemple simple. Suit une page HTML (HyperText Markup Language) appele coucou2.htm ne contenant pas de script 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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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 :

suivi de l'affichage normal de la page :

Le script excut tait 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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

Le chargement de cette page par IE affiche tout d'abord trois fentres d'information :

avant d'afficher la page finale :

I-F - L'aide de WSH


WSH vient avec un systme d'aide situ habituellement dans le dossier "C:\Program Files\Microsoft Windows Script\ScriptDocs". pour la version 5.6 de WSH, le fichier d'aide s'appelle "SCRIPT56.CHM". Il suffit de double-cliquer sur ce fichier pour avoir accs l'aide. Il peut tre pratique d'en avoir un raccourci sur son bureau. Une fois lanc, on a quelque chose comme suit :

- 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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

II - Les bases de la programmation VBSCRIPT


Apres avoir dcrit les contextes d'excution possibles pour un script vbscript, nous abordons maintenant le langage lui-mme. Dans toute la suite, nous nous plaons dans les conditions suivantes : 1 2 le conteneur du script est WSH le script est place dans un fichier de suffixe .vbs

Pour prsenter un concept, nous oprons en gnral de la faon suivante :


on introduit le concept si besoin est on prsente un programme d'illustration avec ses rsultats on commente les rsultats et le programme si besoin est

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.

II-A - Afficher des informations


Nous avons dj utilis la mthode echo de l'objet wscript mais ce dernier a d'autres mthodes permettant d'crire l'cran comme le montre le script suivant :

On notera les points suivants :


Toute texte place aprs une apostrophe est considre comme un commentaire du script et n'est pas interprte par WSH ( ligne 1). la mthode echo crit ses arguments et passe la ligne suivante de mme que la mthode writeLine (lignes 2 et 6) la mthode write crit ses arguments et ne passe pas a la ligne suivante (ligne 3) une marque de fin de ligne est reprsente par la suite de deux caractres de codes ASCII 13 et 10. Ainsi ligne 4 est-elle reprsente par l'expression chr(13) & chr(10) ou chr(i) est le caractre de code ASCII i et & l'oprateur de concatnation de chane. Ainsi "chat" & "eau" est la chane "chteau". la marque de fin de ligne peut tre reprsente plus facilement par la constante vbCRLF (ligne 5)

II-B - criture des instructions dans un script Vbscript

- 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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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 :

II-C - crire avec la fonction msgBox


Si dans ce document, nous utilisons quasi exclusivement l'objet wscript pour crire l'cran, il existe une fonction plus sophistique pour afficher des informations dans une fentre cette fois ci. C'est la fonction msgbox qui s'utilise en gnral avec trois paramtres :

msgbox message, icnes+boutons, titre


message est le texte du message afficher icnes+boutons (facultatif) est en fait un nombre qui indique le type d'icne et les boutons a placer dans la fentre du message. Ce nombre est le plus souvent la somme de deux nombres : le premier dtermine l'icne, le second les boutons titre est le texte placer dans la barre de titre de la fentre de message

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

Voici des exemples :

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

vbRetry vbIgnore vbYes vbNo

4 5 6 7

Ressayer Ignorer Oui Non

Le programme suivant montre l'utilisation du rsultat de la fonction msgBox. On prsente 4 fois une fentre avec les boutons oui, non, annuler.

On rpond de la faon suivante :


1 2 3 4 on clique sur oui on clique sur non on clique sur annuler on ferme la fentre sans utiliser de bouton. Le programme montre que cela revient utiliser le bouton Annuler.

II-D - les donnes utilisables en Vbscript


VBscript ne connat qu'un type de donnes : le variant. La valeur d'un variant peut tre un nombre (4, 10.2), une chane de caractres ("bonjour"), un boolen (true/false), une date (#01/01/2002#), l'adresse d'un objet, un ensemble de toutes ces donnes places dans une structure appele tableau. Examinons le programme suivant et ses rsultats :

- 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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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.

II-E - les sous-types du type variant


Voici ce que dit la documentation officielle sur les diffrents types de donnes que peut contenir un variant : Au-del de la simple distinction nombre/chane, un Variant peut distinguer diffrents types d'information numrique. Par exemple, certaines informations numriques reprsentent une date ou une heure. Lorsque ces informations sont utilises avec d'autres donnes de date ou d'heure, le rsultat est toujours exprim sous la forme d'une date ou d'une heure. Vous disposez aussi d'autres types d'information numrique, des valeurs boolennes jusqu'aux grands nombres virgule flottante. Ces diffrentes catgories d'information qui peuvent tre contenues dans un Variant sont des sous-types. Dans la plupart des cas, vous placez simplement vos donnes dans un Variant et celui-ci se comporte de la faon la plus approprie en fonction de ces donnes. Le tableau suivant prsente diffrents sous-types susceptibles d'tre contenus dans un Variant. Sous-type Empty Null Boolean Byte Integer Currency Long Single Description Le Variant n'est pas initialis. Sa valeur est gale zro pour les variables numriques et une chane de longueur nulle ("") pour les variables chane. Le Variant contient intentionnellement des donnes incorrectes. Contient True (vrai) ou False (faux). Contient un entier de 0 255. Contient un entier de -32 768 32 767. -922 337 203 685 477,5808 922 337 203 685 477,5807. Contient un entier de -2 147 483 648 2 147 483 647. Contient un nombre virgule flottante en prcision simple de -3,402823E38 -1,401298E-45 pour les valeurs ngatives ; de 1,401298E-45 3,402823E38 pour les valeurs positives. Contient un nombre virgule flottante en prcision double de -1,79769313486232E308 -4,94065645841247E-324 pour les valeurs ngatives ; de 4,94065645841247E-324 1,79769313486232E308 pour les valeurs positives. Contient un nombre qui reprsente une date entre le 1er janvier 100 et le 31 dcembre 9999. Contient une chane de longueur variable limite environ 2 milliards de caractres. Contient un objet. Contient un numro d'erreur.

Double

Date (Time) String Object Error

- 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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

II-F - connatre le type exact de la donne contenue dans un variant


Une variable de type variant peut contenir des donnes de divers types. Il nous faut quelquefois connatre la nature exacte de ces donnes. Si dans un programme nous crivons produit=nombre1*nombre2, nous supposons que nombre1 et nombre2 sont deux donnes numriques. Parfois nous n'en sommes pas srs car ces valeurs peuvent provenir d'une saisie au clavier, d'un fichier, d'une source extrieure quelconque. Il nous faut alors vrifier la nature des donnes places dans nombre1 et nombre2. La fonction typename(var) nous permet de connatre le type de donnes contenues dans la variable var. Voici des exemples :

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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 :

II-G - dclarer les variables utilises par le script


Nous avons indiqu qu'il n'tait pas obligatoire de dclarer les variables utilises par le script. Dans ce cas, si nous crivons : 1 somme=4 ... somme=smme+10 avec une faute de frappe smme au lieu de somme dans l'instruction 2, vbscript ne signalera aucune erreur. Il supposera que smme est une nouvelle variable. Il la crera et dans le contexte de l'instruction 2 l'utilisera en l'initialisant 0. Ce genre d'erreurs peut tre trs difficile retrouver. Aussi est-il conseill de forcer la dclaration des variables avec la directive option explicit place en dbut de script. Ensuite toute variable doit tre dclare avec une instruction dim avant sa premire utilisation : option explicit

- 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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

... 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.

II-H - les fonctions de conversion


Vbscript transforme les donnes des variants en chanes, nombres, boolens, ... selon le contexte. La plupart du temps, cela fonctionne bien mais parfois cela donne quelques surprises comme nous le verrons ultrieurement. On peut alors vouloir "forcer" le type de donne du variant. VBscript possde des fonctions de conversion qui transforment une expression en divers types de donnes. En voici quelques unes : Fonction Cint (expression) Clng (expression) Cdbl (expression) Csng (expression) Ccur (expression) Commentaire transforme expression en entier court (integer) transforme expression en entier long (long) transforme expression en rel double (double) transforme expression en rel simple (single) transforme expression en donne montaire (currency)

Voici quelques exemples :

- 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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

- 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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

II-I - lire des donnes tapes au clavier


L'objet wscript permet un script de rcuprer des donnes tapes au clavier. La mthode wscript.stdin.readLine permet de lire une ligne de texte tape au clavier et valide par la touche "Entre". Cette ligne lue peut tre affecte une variable.

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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 :

II-J - saisir des donnes avec la fonction inputbox


On peut vouloir saisir des donnes dans une interface graphique plutt qu'au clavier. On utilise alors la fonction inputBox. Celle-ci admet de nombreux paramtres dont seuls les deux premiers sont frquemment utilises :

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

II-K - utiliser des objets structurs


Il est possible de crer avec vbscript des objets ayant des mthodes et des proprits. Pour ne pas compliquer les choses, nous allons prsenter ici un objet avec des proprits et pas de mthodes. Considrons une personne. Elle a de nombreuses proprits qui la caractrisent : taille, poids, couleur de peau, des yeux, des cheveux, ... Nous n'en retiendrons que deux : son nom et son ge. Avant de pouvoir utiliser des objets, il faut crer le moule qui va permettre de les fabriquer. Cela se fait en vbscript avec une classe. La classe personne pourrait tre dfinie comme suit :

class personne Dim nom,age End class

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

set personne1=new personne set personne2=new personne

Pourquoi ne pas crire

personne1=new personne personne2=new personne

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 :

Le programme prcdent pourrait tre modifi comme suit :

- 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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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.

II-L - affecter une valeur une variable


Il y a deux instructions pour affecter une valeur une variable : 1 2 variable=expression set variable=expression

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

II-M - valuer des expressions


Les principaux oprateurs permettant d'valuer des expressions sont les suivantes : Type d'oprateurs Oprateurs Exemple Arithmtique +,-,*,/ mod a mod b donne le reste de la division entire de a par b. Auparavant a et b ont t transforms en entiers si besoin tait. \ a \ b donne le quotient de la division entire de a par b. Auparavant a et b ont t transforms en entiers si besoin tait. ^ a^b lve a la puissance b. Ainsi a^2 est gal a2 Comparaison <,<= a<>b est vrai si a est diffrent de b >, >= =,<> a=b est vrai si a est gal b

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

.. else actionfaux1 actionfaux2 ... end if

Suit un programme prsentant diffrentes variantes du if-then-else :

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.

II-N-2 - excuter des actions de faon rpte


Boucle nombre d'itrations connu 1 la variable i est ici appele variable de boucle. Elle peut porter un nom quelconque i prend la valeur idbut la valeur de i est compare ifin. Si i<=ifin, les actions situes entre le for... next sont excutes i est incrment de la quantit ipas (i=i+ipas)

for i=idbut to ifin step ipas actions next

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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.

Boucle nombre d'itrations inconnu

do while condition actions loop

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.

Le programme ci-dessous illustre ces points :

- 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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

- 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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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).

II-N-3 - Terminer l'excution du programme


L'instruction wscript.quit n termine l'excution du programme en renvoyant un code d'erreur gal n. Sous DOS, ce code d'erreur peut tre test avec l'instruction if ERRORLEVEL n qui est vrai si le code d'erreur renvoy par le dernier programme excut est >=n. Considrons le programme suivant et ses rsultats : Juste aprs l'excution du programme, on met les trois commandes DOS suivantes :

1. C:\>if ERRORLEVEL 5 echo 5 2. C:\>if ERRORLEVEL 4 echo 4 4 3. C: >if ERRORLEVEL 3 echo 3 3

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.

II-O - les tableaux de donnes dans un variant


Un variant T peut contenir une liste de valeurs. On dit alors que c'est un tableau. Un tableau T possde diverses proprits : on a accs a l'lment i du tableau T par la syntaxe T(i) ou i est un entier appel indice entre 0 et n-1 si T a n lments. on peut connatre l'indice du dernier lment du tableau T avec l'expression ubound(T). Le nombre d'lments du tableau T est alors ubound(T)+1. On appelle souvent ce nombre la taille du tableau.

- 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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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.

II-P - les variables tableaux


Il existe en vbscript une autre faon d'utiliser un tableau, c'est d'utiliser une variable tableau. Une telle variable doit alors tre obligatoirement dclare contrairement aux variables scalaires par une instruction dim. Diverses dclarations sont possibles :

- 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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

II-Q - les fonctions split et join


Les fonctions split et join permettent de passer d'une chane de caractres un tableau et vice versa : Si T est un tableau et car une chane de caractres, join(T,car) est une chane de caractres forme par la runion de tous les lments du tableau T, chacun tant spare du suivant par la chane car. Ainsi join(array(1,2,3),"abcd") donnera la chane "1abcd2abcd3" Si C est une chane de caractres forme d'une suite de champs spars par la chane car la fonction split(C,car) est un tableau dont les lments sont les diffrents de la chane C. Ainsi split("1abcd2abcd3","abcd") donnera le tableau (1,2,3)

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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

II-R - Les dictionnaires


On a accs l'lment d'un tableau T lorsqu'on connat son numro i. Il est alors accessible par la notation T(i). Il existe des tableaux dont on accde aux lments, non pas par un numro mais par une chane de caractres. L'exemple typique de ce type de tableau est le dictionnaire. Lorsqu'on cherche la signification d'un mot dans le "Larousse" ou "Le petit Robert", on accde celle-ci par le mot. On pourrait reprsenter ce dictionnaire par un tableau 2 colonnes : mot1 mot2 mot3 .... On pourrait alors crire des choses comme : dictionnaire("mot1")="description1" dictionnaire("mot2")="description2" ... On est alors proche du fonctionnement d'un tableau si ce n'est que les indices du tableau ne sont pas des nombres entiers mais des chanes de caractres. On appelle ce type de tableau un dictionnaire (ou tableau associatif, hashtable) et les indices chanes de caractres les cls du dictionnaire (keys). L'usage des dictionnaires est extrmement frquent dans le monde informatique. Nous avons tous une carte de scurit sociale avec dessus un numro. Ce numro nous identifie de faon unique et donne accs aux informations qui nous concernent. Dans le modle dictionnaire("cl")="informations", "cl" serait ici le n de scurit sociale et "informations" toutes les informations stockes notre sujet sur les ordinateurs de la scurit sociale. Sous Windows, on dispose d'un objet Active X appel "Scripting.Dictionary" qui permet de crer et grer des dictionnaires. Un objet Active X est un composant logiciel qui expose une interface utilisable par des programmes qui peuvent tre crits en diffrents langages, tant qu'ils respectent la norme d'utilisation des objets Active X. L'objet Scripting.dictionary est donc utilisable par les langages de programmation de Windows : javascript, per, python, C, C++, vb, vba,... et pas seulement par vbscript. 1 Un objet Scripting.Dictionary est cr par une instruction set dico=wscript.CreateObject("Scripting.Dictionary") ou simplement description1 description2 description3

- 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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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

II-S - Trier un tableau ou un dictionnaire


Il est courant de vouloir trier un tableau ou un dictionnaire dans l'ordre croissant ou dcroissant de ses valeurs ou de ses cls pour un dictionnaire. Alors que dans la plupart des langages, existent des fonctions de tri, il ne semble pas en exister en vbscript. C'est une lacune.

II-T - Les arguments d'un programme


Il est possible d'appeler un programme vbscript en lui passant des paramtres comme dans : cscript prog1.vbs arg1 arg2 .... argn Cela permet l'utilisateur de passer des informations au programme. Comment celui-ci fait-il pour les rcuprer ? Regardons le programme suivant :

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

II-U - Une premire application : IMPOTS


On se propose d'crire un programme permettant de calculer l'impt d'un contribuable. On se place dans le cas simplifi d'un contribuable n'ayant que son seul salaire dclarer : on calcule le nombre de parts du salari nbParts=nbEnfants/2 +1 s'il n'est pas mari, nbEnfants/2+2 s'il est mari, o nbEnfants est son nombre d'enfants. on calcule son revenu imposable R=0.72*S o S est son salaire annuel

- 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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

III - La gestion des erreurs


En programmation, il y a une rgle absolue : un programme ne doit jamais "planter" sauvagement. Toutes les erreurs qui peuvent se produire lors de l'excution du programme doivent tre gres et des messages d'erreurs significatifs gnrs. Si nous reprenons l'exemple des impts trait prcdemment, que se passe-t-il si l'utilisateur entre n'importe quoi pour le nombre d'enfants. Regardons sur cet exemple :

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.

III-A - Connatre le type exact d'une donne


Rappelons que les fonctions vartype ou varname permettent de connatre le type exact d'une donne. Cela ne nous est pas toujours d'un grand secours. Par exemple, lorsque nous lisons une donne tape au clavier, les fonctions vartype et typename vont nous dire que c'est une chane de caractres car c'est ainsi qu'est considre toute donne tape au clavier. Cela ne nous dit pas si cette chane peut par exemple tre considre comme un nombre valide. On utilise alors d'autres fonctions pour avoir accs ce type d'informations : rend vrai si expression peut tre utilise comme un nombre isDate(expression) rend vrai si expression peut tre utilise comme une date isEmpty(var) rend vrai si la variable var n'a pas t initialise isNull(var) rend vrai si la variable var contient des donnes invalides isArray(var) rend vrai si var est un tableau isObject(var) rend vrai si var est un objet L'exemple suivant demande de taper une donne au clavier jusqu' ce que celle-ci soit reconnue comme un nombre : 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

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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.

III-B - Les expressions rgulires


Les expressions rgulires nous permettent de tester le format d'une chane de caractres. Ainsi on peut vrifier qu'une chane reprsentant une date est au format jj/mm/aa. On utilise pour cela un modle et on compare la chane ce modle. Ainsi dans cet exemple, j m et a doivent tre des chiffres. Le modle d'un format de date valide est alors "\d\d/\d\d/\d\d" o le symbole \d dsigne un chiffre. Les symboles utilisables dans un modle sont les suivants (documentation Microsoft) : Caractre \ Description Marque le caractre suivant comme caractre spcial ou littral. Par exemple, "n" correspond au caractre "n". "\n" correspond un caractre de nouvelle ligne. La squence "\\" correspond "\", tandis que "\(" correspond "(". Correspond au dbut de la saisie. Correspond la fin de la saisie. Correspond au caractre prcdent zro fois ou plusieurs fois. Ainsi, "zo*" correspond "z" ou "zoo". Correspond au caractre prcdent une ou plusieurs fois. Ainsi, "zo+" correspond "zoo", mais pas "z". Correspond au caractre prcdent zro ou une fois. Par exemple, "a?ve?" correspond "ve" dans "lever". Correspond tout caractre unique, sauf le caractre de nouvelle ligne. Recherche le modle et mmorise la correspondance. La sous-chane correspondante peut tre extraite de la collection Matches obtenue, l'aide d'Item [0]...[n]. Pour trouver des correspondances avec des caractres entre parenthses ( ), utilisez "\(" ou "\)". Correspond soit x soit y. Par exemple, "z|foot" correspond "z" ou "foot". "(z|f)oo" correspond "zoo" ou "foo".

^ $ * + ? . (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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

{n}

{n,}

{n,m}

[xyz] [^xyz] [a-z]

[^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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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).

Tout ceci est montr dans l'exemple qui suit : Programme


' expression rgulire ' on veut vrifier qu'une chane contient une date au format jj/mm/aa Option Explicit Dim modele ' on dfinit le modle Set modele=new regexp modele.pattern="\b(\d\d)/(\d\d)/(\d\d)\b" ' une date n'importe o dans la chane 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 chaine="" ' on boucle tant que chaine<>"fin"

- 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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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 ]

III-C - Intercepter les erreurs d'excution


Une autre mthode de gestion des erreurs d'excution est de les laisser se produire, d'en tre avertis et de les grer alors. Normalement lorsqu'une erreur se passe l'excution, WSH affiche un message d'erreur et le programme est arrt. Deux instructions nous permettent de modifier ce fonctionnement : 1 on error resume next Cette instruction indique au systme (WSH) que nous allons grer les erreurs nous mmes. Apres cette instruction, toute erreur est simplement ignore. par le systme. on error goto 0 Cette instruction nous ramne au fonctionnement normal de gestion des erreurs. Lorsque l'instruction on error resume next est active, nous devons grer nous-mmes les erreurs qui peuvent survenir. L'objet Err nous y aide. Cet objet a diverses proprits et mthodes dont nous retiendrons les deux suivantes :
- 54 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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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

Regardons l'exemple qui suit : Programme


' erreur non gre Option Explicit Dim nombre nombre=cdbl("abcd") wscript.echo "nombre=" & nombre

Rsultats
C:\ err5.vbs(6, 1) Erreur d'excution Microsoft VBScript: Type incompatible: 'cdbl'

Grons maintenant l'erreur : Programme


' erreur gre Option Explicit Dim nombre ' on gre les erreurs nous-mmes On Error Resume Next nombre=cdbl("abcd") ' y-a-t-il eu erreur ? If Err.number<>0 Then wscript.echo "L'erreur [" & err.description & "] s'est produite" On Error GoTo 0 wscript.quit 1 End If ' pas d'erreur - on revient au fonctionnement normal On Error GoTo 0 wscript.echo "nombre=" & nombre wscript.quit 0

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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.

III-D - Application au programme de calcul d'impts


Nous reprenons le programme de calcul d'impts dj crit pour, cette fois, vrifier la validit des arguments passs au programme : 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

- 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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

IV - Les fonctions et procdures IV-A - Les fonctions prdfinies de vbscript


La richesse d'un langage drive en grande partie de sa bibliothque de fonctions, ces dernires pouvant tre encapsules dans des objets sous le nom de mthodes. Sous cet aspect, on peut considrer que vbscript est plutt pauvre. Le tableau suivant dfinit les fonctions de VBScript hors objets. Nous ne les dtaillerons pas. Leur nom est en gnral une indication de leur rle. Le lecteur consultera la documentation pour avoir des dtails sur une fonction particulire. Abs CBool CDbl Conversions Date DateSeria Eval FormatDateTime GetObject InputBox IsArray IsNumeric LCase Log Minute Now Right ScriptEngineBuildVersion SetLocale Split Tan TimeValue VarType Array CByte Chr Cos DateAdd DateValue Exp FormatNumber GetRef InStr IsDate IsObject Left LTrim; RTrim; and Trims Month Oct Rnd ScriptEngineMajorVersion Sgn Sqr Time TypeName Weekday Asc CCur CInt CreateObject DateDiff Day Filter FormatPercent Hex InStrRev IsEmpty Join Len Maths MonthName Replace Round ScriptEngineMinorVersion Sin StrComp Timer UBound WeekdayName Atn CDate CLng CSng DatePart Derived Maths FormatCurrency GetLocale Hour Int, Fixs IsNull LBound LoadPicture Mid MsgBox RGB ScriptEngine Second Space String TimeSerial UCase Year

IV-B - Programmation modulaire


Dcrire la solution programme d'un problme, c'est dcrire la suite d'actions lmentaires excutables par l'ordinateur et capables de rsoudre le problme. Selon les langages ces oprations lmentaires sont plus ou moins sophistiques. On trouve par exemple: . lire une donne provenant du clavier ou du disque . crire une donne l'cran, sur imprimante, sur disque, etc . calculer des expressions . se dplacer dans un fichier . ...
- 59 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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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

o T reprsente un tableau. Les oprations lire_tableau(T) trier_tableau(T) crire_tableau(T)

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

Le module lire_tableau(T) pourrait tre dcrit comme suit :

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

// 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

module changer(T IMAX, IFIN)


dbut temp<----T[IMAX] T[IMAX]<---T[IFIN] T[IFIN]<---temp 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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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 :

On a une structure en arbre.

IV-C - Les fonctions et procdures vbscript


Une fois l'analyse modulaire opre, le programmeur peut traduire les modules de son algorithme en fonctions ou procdures vbscript. Les fonctions et procdures admettent toutes deux des paramtres d'entre/sortie mais la fonction rend un rsultat qui permet son utilisation dans des expressions alors que la procdure n'en rend pas.

IV-C-1 - Dclaration des fonctions et procdures vbscript


La dclaration d'une procdure vbscript est la suivante

sub nomProcdure([Byref/Byval] param1, [Byref/Byval] param2, ...) instructions end sub

et celle d'une fonction

function nomFonction([Byref/Byval] param1, [Byref/Byval] param2, ...) instructions end sub

Pour rendre son rsultat, la fonction doit comporter une instruction d'affectation du rsultat une variable portant le nom de la fonction : nomFonction=rsultat

L'excution d'une fonction ou procdure s'arrte de deux faons :


la rencontre de l'instruction de fin de fonction (end function) ou fin de procdure (end sub) la rencontre de l'instruction de sortie de fonction (exit function) ou de procdure (exit sub)

- 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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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.

IV-C-2 - Modes de passage des paramtres d'une fonction ou procdure


Dans la dclaration des paramtres d'entre-sortie d'une fonction ou procdure, on prcise le mode (byRef,byVal) de transmission du paramtre du programme appelant vers le programme appel :

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

function nomFonction([Byref/Byval] paramForm1, [Byref/Byval] paramForm2, ...) ... end function

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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

Le programme suivant montre des exemples de passage de paramtres : Programme


Sub proc1(byval i, ByRef j, k) ' i est pass par valeur (byval) - le paramtre effectif alors diffrents ' j est pass par valeur (byref) - le paramtre effectif alors identiques ' le mode de passage de k n'est pas prcis. Par dfaut, i=i+1 j=j+1 k=k+1 affiche "dans proc1",i,j,k End Sub Sub affiche(byval msg, ByVal i, ByVal j, ByVal k) ' affiche les valeurs de i et j et k wscript.echo msg & " i=" & i & " j=" & j & " k=" & k End Sub ' ------------- appels aux fonctions et procdures ' init i et j i=4:j=5 : k=6 ' vrification affiche "dans programme principal, avant l'appel proc1 ' appel procdure proc1 proc1 i,j,k ' vrification affiche "dans programme principal, aprs l'appel proc1 ' fin wscript.quit 0 et le paramtre formel sont et le paramtre formel sont c'est par rfrence

:",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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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).

On s'en tiendra aux rgles suivantes :


pas de parenthses autour des paramtres d'une procdure ou d'une fonction utilise comme une procdure parenthses autour des paramtres d'une fonction

IV-C-4 - Quelques exemples de fonctions


On trouvera ci-dessous quelques exemples de dfinitions et utilisations de fonctions : Programme
Function plusgrandque(byval i, ByVal j) ' rend le boolen vrai si i>j, le boolen faux sinon ' vrification des donnes If isnumeric(i) And isnumeric(j) Then If i>j Then plusgrandque=true Else plusgrandque=false - 66 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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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.

IV-C-5 - Paramtre de sortie ou rsultat d'une fonction


Supposons que l'analyse d'une application ait montr la ncessit d'un module M avec des paramtres d'entre Ei et des paramtres de sortie Sj. Rappelons que les paramtres d'entre sont des informations que le programme appelant donne au programme appel et qu'inversement les paramtres de sortie sont des informations que le programme appel donne au programme appelant. On a en vbscript plusieurs solutions pour les paramtres de sortie : s'il n'y a qu'un seul paramtre de sortie, on peut en faire le rsultat d'une fonction. Il n'y a alors plus de paramtre de sortie mais simplement un rsultat de fonction. s'il y a n paramtres de sortie, l'un d'entre-eux peut servir de rsultat de fonction , les n-1 autres restant des paramtres de sortie. On peut aussi ne pas utiliser de fonction mais une procdure a n paramtres de sortie. On peut galement utiliser une fonction qui rendra un tableau dans lequel on aura place les n valeurs a rendre au programme appelant. On se rappellera que le programme appelle rend ses rsultats au programme appelant par recopie de valeurs. Cette recopie est vite dans le cas de paramtres de sortie passes par rfrence. Il y a donc dans cette dernire solution un gain de temps.

IV-D - Le programme vbscript de tri de valeurs


Nous avions commenc la discussion sur la programmation modulaire par l'tude algorithmique d'un tri de valeurs numriques tapes au clavier. Voici la traduction vbscript qui pourrait en tre faite : Programme
' programme principal Option Explicit Dim T ' le tableau de valeurs trier

- 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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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.

IV-E - Le programme IMPOTS sous forme modulaire

- 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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

V - Les fichiers texte


Un fichier texte est un fichier contenant des lignes de texte. Examinons la cration et l'utilisation de tels fichiers sur des exemples.

V-A - Cration et utilisation

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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.

V-B - Les cas d'erreur On rencontre deux cas d'erreur frquents :


ouverture en lecture d'un fichier qui n'existe pas ouverture en criture ou ajout d'un fichier qui n'existe pas avec le troisime paramtre a false dans l'appel a la mthode OpenTextFile.

- 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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

Le programme suivant montre comment dtecter ces erreurs : Programme


' cration & remplissage d'un fichier texte Option Explicit Dim objFichier,MyFile Const ForReading = 1, ForWriting = 2, ForAppending = 8 Dim codeErreur ' on cre un objet fichier Set objFichier=CreateObject("Scripting.FileSystemObject") ' on ouvre un fichier texte devant exister en lecture On Error Resume Next Set MyFile= objFichier.OpenTextFile("abcd", ForReading) codeErreur=err.number On Error GoTo 0 If codeErreur<>0 Then ' le fichier n'existe pas wscript.echo "Le fichier [abcd] n'existe pas" Else ' on ferme le fichier texte MyFile.Close End If ' on ouvre un fichier texte devant exister en criture On Error Resume Next Set MyFile= objFichier.OpenTextFile("abcd", ForWriting, False) codeErreur=err.number On Error GoTo 0 If codeErreur<>0 Then wscript.echo "Le fichier [abcd] n'existe pas" Else ' on ferme le fichier texte MyFile.Close End If ' on ouvre un fichier texte devant exister en ajout On Error Resume Next Set MyFile= objFichier.OpenTextFile("abcd", ForAppending, False) codeErreur=err.number On Error GoTo 0 If codeErreur<>0 Then wscript.echo "Le fichier [abcd] n'existe pas" Else ' on ferme le fichier texte MyFile.Close End If ' fin wscript.quit 0

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

V-C - L'application IMPOTS avec un fichier texte

- 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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

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/

INTRODUCTION AU LANGAGE VBSCRIPT par Serge Tah (tahe.developpez.com)

- 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/

Vous aimerez peut-être aussi