Skip to content

3. Noções básicas de programação VBSCRIPT

Depois de descrever os possíveis contextos de execução para um script VBScript, abordamos agora a própria linguagem. Daqui em diante, trabalharemos nas seguintes condições:

  1. o contêiner do script é WSH
  2. o script está em um arquivo com a extensão .vbs

Para apresentar um conceito, geralmente procedemos da seguinte maneira:

  • apresentamos o conceito, se necessário
  • apresentamos um programa ilustrativo com seus resultados
  • comentamos os resultados e o programa, se necessário

Os contêineres do VBScript não diferenciam maiúsculas de minúsculas no texto do script. Portanto, é possível escrever tanto wscript.echo “olá” quanto WSCRIPT.ECHO “olá”.

Os programas apresentados a seguir exibem muitas mensagens na tela; por isso, vamos apresentar novamente os métodos de saída do objeto wscript.

3.1. Exibir informações

Já utilizamos o método echo do objeto wscript, mas este último possui outros métodos que permitem exibir texto na tela, conforme mostra o script a seguir:

Programa
Resultados
1
2
3
4
un
deuxtrois
quatre
cinq

Observe os seguintes pontos:

  • Qualquer texto colocado após um apóstrofo é considerado um comentário do script e não é interpretado pelo WSH (linha 1).
  • O método echo grava seus argumentos e passa para a linha seguinte, assim como o método writeLine (linhas 2 e 6)
  • o método write grava seus argumentos e não passa para a linha seguinte (linha 3)
  • Um marcador de fim de linha é representado pela sequência de dois caracteres de código ASCII: 13 e 10. Assim, a linha 4 é representada pela expressão chr(13) & chr(10), em que chr(i) é o caractere de código ASCII i e & é o operador de concatenação de cadeias. Assim, “chat” & “eau” resulta na cadeia “chateau”.
  • O caractere de fim de linha pode ser representado mais facilmente pela constante vbCRLF (linha 5)

3.2. E a escrita de instruções em um script VBScript

Por padrão, escreve-se uma instrução por linha. No entanto, é possível escrever várias instruções por linha, separando-as pelo caractere :, como em inst1:inst2:inst3. Se uma linha for muito longa, é possível dividi-la em partes. Nesse caso, as diferentes partes da instrução devem terminar com os dois caracteres (espaço)_. Retomamos o exemplo anterior reescrevendo as instruções de maneira diferente:

Programa
Resultados
1
2
3
4
un
deuxtrois
quatre
cinq

3.3. Escrever com a função msgBox

Embora neste documento utilizemos quase exclusivamente o objeto wscript para escrever na tela, existe uma função mais sofisticada para exibir informações em uma janela. Trata-se da função msgbox, que geralmente é utilizada com três parâmetros:

msgbox mensagem, ícones+botões, título

  • mensagem é o texto da mensagem a ser exibida
  • ícones+botões (opcional) é, na verdade, um número que indica o tipo de ícone e os botões a serem colocados na janela da mensagem. Esse número é, na maioria das vezes, a soma de dois números: o primeiro determina o ícone, o segundo, os botões
  • título é o texto a ser exibido na barra de título da janela de mensagem

Os valores a serem utilizados para especificar o ícone e os botões da janela de exibição são os seguintes:

Constante
Valor
Descrição
vbOKOnly
   0
Exibe apenas o botão OK.
vbOKCancel
   1
Exibe os botões OK e Cancelar.
vbAbortRetryIgnore
   2
Exibe os botões Desistir, Tentar novamente e Ignorar.
vbYesNoCancel
   3
Exibe os botões “Sim”, “Não” e “Cancelar”.
vbYesNo
   4
Exibe os botões Sim e Não.
vbRetryCancel
   5
Exibe os botões “Tentar novamente” e “Cancelar”.
vbCritical
16
Exibe o ícone “Mensagem crítica”.
vbQuestion
32
Exibe o ícone “Solicitação de aviso”.
vbExclamation
48
Exibe o ícone “Mensagem de aviso”.
vbInformation
64
Exibe o ícone de mensagem informativa.
vbDefaultButton1
   0
O primeiro botão é o botão padrão.
vbDefaultButton2
256
O segundo botão é o botão padrão.
vbDefaultButton3
512
O terceiro botão é o botão padrão.
vbDefaultButton4
768
O quarto botão é o botão padrão.
vbApplicationModal
   0
Aplicativo modal; o usuário deve responder à mensagem antes de continuar trabalhando no aplicativo atual.
vbSystemModal
4096
Sistema modal; todas as aplicações ficam suspensas até que o usuário responda à mensagem.

Veja alguns exemplos:

Programa
Resultados
  
   
   

Em alguns casos, é exibida uma janela de informação que também funciona como janela de entrada de dados. Se for feita uma pergunta, queremos, por exemplo, saber se o usuário clicou no botão oui ou no botão non. A função msgBox retorna um resultado que, no programa anterior, não utilizamos. Esse resultado é um número inteiro que representa o botão utilizado pelo usuário para fechar a janela de exibição:

Constante
Valor
Botão selecionado
vbOK
1
OK
vbCancel
2
Cancelar
vbAbort
3
Desistência
vbRetry
4
Tentar novamente
vbIgnore
5
Ignorar
vbYes
6
Sim
vbNo
7
Não

O programa a seguir mostra como utilizar o resultado da função msgBox. É exibida quatro vezes uma janela com os botões “sim”, “não” e “cancelar”. A resposta é dada da seguinte forma:

  1. clica-se em “sim”
  2. clica-se em “Não”
  3. clica-se em “Cancelar”
  4. fecha-se a janela sem usar nenhum botão. O programa mostra que isso equivale a usar o botão “Cancelar”.
Programa
Resultados

3.4. O oferece dados que podem ser utilizados em VBScript

O VBscript reconhece apenas um tipo de dados: o variant. O valor de um variant pode ser um número (4, 10,2), uma sequência de caracteres (“olá”), um booleano (true/false), uma data (#01/01/2002#), o endereço de um objeto ou um conjunto de todos esses dados organizados em uma estrutura chamada matriz.

Vamos examinar o programa a seguir e seus resultados:

Programa
Resultados
4
i=4
10,2
r1=10,2
0,014
r2=0,014
c1=bonjour
01/10/02
d1=01/10/02
10/01/02
d2=10/01/02
-1
b1=Vrai
0
b2=Faux
v=4
v=10,2
v=bonjour
v=01/10/02
v=Vrai

Comentários:

  • Várias linguagens de programação (C, C++, Pascal, Java, C#, etc.) exigem a declaração prévia de uma variável antes de seu uso. Essa declaração consiste em indicar o nome da variável e o tipo de dados que ela pode conter (inteiro, real, string, data, booleano, etc.). A declaração de variáveis permite diversas coisas:
    • saber o espaço de memória necessário para a variável, já que diferentes tipos de dados exigem diferentes espaços de memória
    • verificar a coerência do programa. Assim, se i for um inteiro e c uma sequência de caracteres, multiplicar i por c não faz sentido. Se o tipo das variáveis i e c tiver sido declarado pelo programador, o programa encarregado de analisar o código antes de sua execução poderá sinalizar tal incoerência.

Assim como a maioria das linguagens de script com tipo de dados único (Perl, Python, JavaScript, etc.), o VBScript permite que as variáveis não sejam declaradas. Foi isso que ocorreu no exemplo acima.

  • Observe a sintaxe de diferentes valores
    • 10,2 na linha 10 (ponto decimal em vez de vírgula). Observe-se que, na exibição, o valor 10,2 é exibido.
    • 1.4e-2 na linha 13 (notação científica). Na exibição, o número 0,014 foi exibido
    • [#01/10/2002#] (linha 26) para representar a data de 10 de janeiro de 2002. Portanto, é o formato #mm/dd/aaaa# que o VBScript utiliza para representar a data jj do mês mm do ano aaaa
    • os valores booleanos true e false (verdadeiro/falso) nas linhas 31 e 34. Esses dois valores são representados, respectivamente, pelos números inteiros -1 e 0, conforme mostrado na exibição das linhas 32 e 35. Quando um valor booleano é concatenado a uma sequência de caracteres, esses valores se tornam, respectivamente, as sequências “Verdadeiro” e “Falso”, conforme mostrado nas linhas 33 e 36. Observe, a propósito, que o operador de concatenação & pode ser usado para concatenar outros tipos de dados além de sequências de caracteres.
  • Como uma variável v não tem um tipo atribuído, ela pode receber, sucessivamente ao longo do tempo, valores de diferentes tipos.

3.5. s subtipos do tipo variant

Eis o que diz a documentação oficial sobre os diferentes tipos de dados que um variant pode conter:

Além da simples distinção entre número e string, um Variant pode distinguir diferentes tipos de informação numérica. Por exemplo, certas informações numéricas representam uma data ou uma hora. Quando essas informações são utilizadas com outros dados de data ou hora, o resultado é sempre expresso na forma de uma data ou de uma hora. Você também dispõe de outros tipos de informação numérica, desde valores booleanos até grandes números de ponto flutuante. Essas diferentes categorias de informação que podem estar contidas em um Variant são subtipos. Na maioria dos casos, basta colocar seus dados em um Variant, e ele se comportará da maneira mais adequada de acordo com esses dados.

A tabela a seguir apresenta os diferentes subtipos que podem estar contidos em um Variant.

Subtipo
Descrição
Empty
O Variant não está inicializado. Seu valor é igual a zero para variáveis numéricas e a uma cadeia de comprimento nulo (“”) para variáveis de cadeia.
Null
O Variant contém dados incorretos intencionalmente.
Boolean
Contém True (verdadeiro) ou False (falso).
Byte
Contém um número inteiro de 0 a 255.
Inteiro
Contém um número inteiro de -32 768 a 32 767.
Moeda
-922 337 203 685 477,5808 a 922 337 203 685 477,5807.
Long
Contém um número inteiro de -2 147 483 648 a 2 147 483 647.
Single
Contém um número de ponto flutuante de precisão simples de -3,402823E38 a -1,401298E-45 para valores negativos; de 1,401298E-45 a 3,402823E38 para os valores positivos.
Duplo
Contém um número de ponto flutuante com precisão dupla de -1,79769313486232E308 a -4,94065645841247E-324 para valores negativos; de 4,94065645841247E-324 a 1,79769313486232E308 para valores positivos.
Data (Hora)
Contém um número que representa uma data entre 1º de janeiro de 100 e 31 de dezembro de 9999.
String
Contém uma sequência de caracteres de comprimento variável, limitada a aproximadamente 2 bilhões de caracteres.
Objeto
Contém um objeto.
Error
Contém um número de erro.

3.6. C onhecer o tipo exato dos dados contidos em um variante

Uma variável do tipo variant pode conter dados de diversos tipos. Às vezes, precisamos saber a natureza exata desses dados. Se, em um programa, escrevermos produit=nombre1*nombre2, supomos que nombre1 e nombre2 sejam dois dados numéricos. Às vezes, não temos certeza disso, pois esses valores podem provir de uma entrada pelo teclado, de um arquivo ou de qualquer fonte externa. Nesse caso, precisamos verificar a natureza dos dados contidos em nombre1 e nombre2. A função typename(var) permite-nos identificar o tipo de dados contidos na variável var. Veja alguns exemplos:

Programa
Resultados
var=1,type=Integer
var=deux,type=String
var=Vrai,type=Boolean
var=4,5,type=Double
var=11/10/01,type=Date

Outra função possível é a vartype(var), que retorna um número representando o tipo dos dados contidos na variável var:

Constante
Valor
Descrição
vbEmpty
0
Vazio (não inicializado)
vbNull
1
Nulo (sem dados válidos)
vbInteger
2
Inteiro
vbLong
3
Inteiro longo
vbSingle
4
Número de ponto flutuante de precisão simples
vbDouble
5
Número de ponto flutuante de dupla precisão
vbCurrency
6
Monetário
vbDate
7
Data
vbString
8
Cadeia
vbObject
9
Objeto de automação
vbError
10
Erro
vbBoolean
11
Booleano
vbVariant
12
Variante (usado apenas com tabelas de variantes)
vbDataObject
13
Objeto não relacionado à automação
vbByte
17
Byte
vbArray
8192
Tabela

Observação: Essas constantes são especificadas por VBScript. Portanto, os nomes podem ser usados em qualquer lugar do seu código no lugar dos valores reais.

As informações acima foram extraídas da documentação de VBscript. Essa documentação pode conter erros, provavelmente devido a cópias e colagens feitas a partir da documentação de VB. A função vartype do VBScript realiza apenas uma parte do que foi anunciado acima.

O programa anterior, reescrito para o vartype, apresenta os seguintes resultados:

Programa
Resultados
var=1,type=2
var=deux,type=8
var=Vrai,type=11
var=4,5,type=5
var=11/10/01,type=7

3.7. D clarear as variáveis utilizadas pelo script

Mencionamos que não é obrigatório declarar as variáveis utilizadas pelo script. Nesse caso, se escrevermos:


1) somme=4
...
2) somme=smme+10

Com um erro de digitação como smme em vez de “somme” na instrução 2, o VBScript não sinalizará nenhum erro. Ele presumirá que smme é uma nova variável. Ele a criará e, no contexto da instrução 2, a utilizará, inicializando-a com o valor 0.

Esse tipo de erro pode ser muito difícil de detectar. Por isso, é recomendável forçar a declaração das variáveis com a diretiva option explicit colocada no início do script. Em seguida, toda variável deve ser declarada com uma instrução dim antes de seu primeiro uso:


option explicit
...
dim somme
1) somme=4
...
2) somme=smme+10

Neste exemplo, o VBScript indicará que há uma variável não declarada, tal como em 2), conforme mostra o exemplo a seguir:

Programa
Resultados
dim1.vbs(9, 1) Erreur d'exécution Microsoft
 VBScript: Variable non définie: 'smme'

Embora, nos breves exemplos deste documento, as variáveis na maioria das vezes não sejam declaradas, exigiremos sua declaração assim que escrevermos os primeiros scripts significativos. A diretiva Option explicit será, então, utilizada sistematicamente.

3.8. As funções de conversão do ** **

O VBScript transforma os dados das variantes em cadeias de caracteres, números, booleanos, etc., dependendo do contexto. Na maioria das vezes, isso funciona bem, mas às vezes traz algumas surpresas, como veremos mais adiante. Pode-se, então, querer “forçar” o tipo de dados da variante. O VBscript possui funções de conversão que transformam uma expressão em diversos tipos de dados. Aqui estão algumas delas:

Cint (expressão)
transforma a expressão em um inteiro curto (integer)
Clng (expressão)
transforma a expressão em um inteiro longo (long)
Cdbl (expressão)
converte a expressão em um número real de precisão dupla (double)
Csng (expressão)
converte a expressão em um número real de precisão simples (single)
Ccur (expressão)
converte a expressão em valor monetário (currency)

Aqui estão alguns exemplos:

Programa
Resultados
var=4,code type=8,nom type=String
var=4,code type=2,nom type=Integer
var=1000000,code type=8,nom type=String
var=1000000,code type=3,nom type=Long
var=3,4e-5,code type=8,nom type=String
var=0,000034,code type=5,nom type=Double
var=3,4e-5,code type=8,nom type=String
var=0,000034,code type=4,nom type=Single
var=1000,45,code type=8,nom type=String
var=1000,45,code type=6,nom type=Currency
var=14,code type=2,nom type=Integer
var=14,code type=8,nom type=String
var=1000,45,code type=5,nom type=Double
var=1000,code type=2,nom type=Integer
var=1000,75,code type=5,nom type=Double
var=1001,code type=2,nom type=Integer

3.9. O e os dados digitados no teclado

O objeto wscript permite que um script recupere dados digitados no teclado. O método wscript.stdin.readLine permite ler uma linha de texto digitada no teclado e confirmada pela tecla “Enter”. Essa linha lida pode ser atribuída a uma variável.

Programa
Resultados

Tapez votre nom : st
Bonjour st

Comentários:

  • Na coluna de resultados e na linha [Tapez votre nom : st], st é a linha digitada pelo usuário.

Mesmo que o texto digitado no teclado represente um número, ele é considerado, antes de tudo, como uma sequência de caracteres, conforme mostra o exemplo abaixo:

Programa
Resultados
Tapez un nombre : 14
nombre lu=14,type=String

Se esse número for utilizado em uma operação aritmética, VBscript converterá automaticamente a sequência de caracteres em um número, mas nem sempre. Vejamos o exemplo a seguir:

Programa
Resultados
1
2
3
4
5
6
nombre1 : 3
nombre2 : 4
3+4=34
3-4=-1
3x4=12
3/4=0,75

Nos resultados, vemos que a linha 8 do script não funcionou como esperado, pois (infelizmente) no VBScript o operador + tem dois significados: soma de dois números ou concatenação de duas cadeias de caracteres (as duas cadeias são unidas uma à outra). Vimos anteriormente que os números digitados no teclado eram interpretados como sequências de caracteres e que o VBScript os transformava em números conforme necessário. Ele fez isso corretamente para as operações -, *, /, que só podem envolver números, mas não para o operador +, que também pode envolver sequências de caracteres. Nesse caso, ele presumiu que se desejava realizar uma concatenação de cadeias de caracteres.

Uma solução simples para esse problema é converter as cadeias de caracteres em números assim que forem lidas, como mostra a melhoria a seguir do programa anterior:

Programa
Resultados
nombre1 : 3
nombre1=3,type=String
nombre1=3,type=Long
nombre2 : 4
nombre2=4,type=String
nombre2=4,type=Long
3+4=7
3-4=-1
3x4=12
3/4=0,75

3.10. S nsadir dados com a função inputbox

Às vezes, pode ser preferível inserir dados em uma interface gráfica em vez de usar o teclado. Nesse caso, utiliza-se a função inputBox. Essa função aceita vários parâmetros, dos quais apenas os dois primeiros são frequentemente utilizados:

resposta=inputBox(mensagem, título)

  • mensagem: a pergunta que você faz ao usuário
  • título (opcional): o título que você atribui à janela de entrada
  • resposta: o texto digitado pelo usuário. Se ele fechou a janela sem responder, resposta é a string vazia.

Aqui está um exemplo em que solicitamos o nome e a idade de uma pessoa. Para o nome, fornecemos uma informação e clicamos em OK. Para a idade, também fornecemos uma informação, mas clicamos em Cancelar.

Programa
Resultados

3.11. U tilizar objetos estruturados

É possível criar, com VBScript, objetos que possuem métodos e propriedades. Para não complicar as coisas, apresentaremos aqui um objeto com propriedades, mas sem métodos. Consideremos uma pessoa. Ela possui várias propriedades que a caracterizam: altura, peso, cor da pele, dos olhos, do cabelo... Vamos nos concentrar em apenas duas: seu nome e sua idade. Antes de poder usar objetos, é preciso criar o molde que permitirá criá-los. Isso é feito em VBScript por meio de uma classe. A classe personne poderia ser definida da seguinte forma:


class personne
    Dim nom,age
End class

É a instrução [Dim nom,age] que define as duas propriedades da classe personne. Para criar exemplares (chamados de instâncias) da classe personne, escreve-se:

set personne1=new personne
set personne2=new personne

Por que não escrever

personne1=new personne
personne2=new personne

Porque uma variante não pode conter um objeto. Ela só pode conter o endereço do objeto. Ao escrever set pessoa1=new pessoa, ocorre a seguinte sequência de eventos:

  1. um objeto personne é criado. Isso significa que é alocada memória para ele.
  2. o endereço desse objeto personne é atribuído à variável personne1

Temos, então, o seguinte esquema de memória para as variáveis personne1 e personne2:

Por conveniência, pode-se dizer que personne1 é um objeto personne. É possível aceitar essa expressão, se lembrarmos que personne1 é, na verdade, o endereço de um objeto personne e não o próprio objeto personne.

Dissemos que um objeto personne possuía duas propriedades: nom e age. Como utilizar essas propriedades? Por meio da notação objet.propriété, conforme explicado um pouco acima. Assim,

personne1.nom representa o nome da pessoa 1 e personne1.age, sua idade. Aqui está um pequeno programa ilustrativo:

Programa
Resultados
p1=(dupont,18)

O programa anterior poderia ser modificado da seguinte forma:

Programa
Resultados
nom=dupont
age=18

Utilizamos aqui a estrutura with ... end with*, que permite “fatorar” nomes de objetos em expressões. A estrutura *with p1 ... end with das linhas 9a 12 e de 15 a 18 permite, posteriormente, utilizar a sintaxe .nom em vez de p1.nom e .age em vez de p1.age. Isso permite simplificar a escrita das instruções nas quais o mesmo nome de objeto é utilizado repetidamente.

3.12. Atribuir um valor a uma variável

Existem duas instruções para atribuir um valor a uma variável:

  1. variável=expressão
  2. definir variável=expressão

A forma 2 é reservada para expressões cujo resultado é uma referência a um objeto. Para todos os outros tipos de expressões, a forma 1 é a adequada. A diferença entre as duas formas é a seguinte:

  • na instrução variable=expression, a variável recebe um valor. Se v1 e v2 forem duas variáveis, escrever v1=v2 atribui o valor de v1 a v2. Portanto, ocorre a duplicação de um valor em dois locais diferentes. Se, posteriormente, o valor de v2 for alterado, o de v1 não será afetado de forma alguma.
  • na instrução `set variable=expression`, a variável recebe como valor o endereço de um objeto. Se v1 e v2 forem duas variáveis e se v2 for o endereço de um objeto obj2, escrever `set v1=v2` atribui o valor de v1 a v2, ou seja, o endereço do objeto obj2. Quando o script manipula v1 e v2 posteriormente, não são os “valores” de v1 e v2 que são manipulados, mas sim os objetos “apontados” por v1 e v2, ou seja, o mesmo objeto neste caso. Diz-se que v1 e v2 são duas referências ao mesmo objeto e que manipular esse objeto por meio de v1 ou v2 não faz diferença alguma. Em outras palavras, modificar o objeto referenciado por v2 modifica aquele referenciado por v1.

Veja um exemplo:

Programa
Resultados
i=4
j=4
i=4
j=5
p1.nom=dupont
p1.age=18
p1.nom=dupont
p1.age=19
p2.nom=dupont
p2.age=19

3.13. É avaliar expressões

Os principais operadores que permitem avaliar expressões são os seguintes:

Tipo de operadores
Operadores
Exemplo
Aritméticos
+,-,*,/
 
 
mod
 
\
 
^
   
Comparação
<, <=
>, >=
=,<>
a<>b é verdadeiro se a for diferente de b
a=b é verdadeiro se a for igual a b
a e b podem ser ambos números ou ambas cadeias de caracteres. Neste último caso, cadeia1<cadeia2 se, na ordem alfabética, cadeia1 vier antes de cadeia2. Na comparação de cadeias, as letras maiúsculas vêm antes das minúsculas na ordem alfabética.
 
is
   
Lógica
and, or, not, xor
Todos os operandos aqui são booleanos.
bool1 or bool2 é verdadeiro se bool1 ou bool2 for verdadeiro
bool1 and bool2 é verdadeiro se bool1 e bool2 forem verdadeiros
not bool1 é verdadeiro se bool1 for falso e vice-versa
bool1 xor bool2 é verdadeiro se apenas um dos booleanos bool1 ou bool2 for verdadeiro
   
Concatenação
&, +
Não é recomendável usar o operador + para concatenar duas cadeias de caracteres devido à possível confusão com a soma de dois números. Portanto, deve-se usar exclusivamente o operador &.

3.14. C ontrolar a execução do programa

3.14.1. E xecutar ações de forma condicional

A instrução do VBScript que permite realizar ações de acordo com o valor verdadeiro/falso de uma condição é a seguinte:


if expression then
    action-vrai-1
    action-vrai-2
    ..
else
    action-faux-1
    action-faux-2
    ...
end if
A expressão expression é avaliada primeiro. Essa expressão deve ter um valor booleano. Se o valor for verdadeiro, as ações do then são executadas; caso contrário, são executadas as do else, se ele estiver presente.

Segue-se um programa que apresenta diferentes variantes da estrutura if-then-else:

Programa
Resultados
1
2
3
4
5
3 est plus grand que 0
3 est plus grand que 2
i=4
4 est plus petit que 10
i=3

Comentários:

  • No VBScript, é possível escrever instrução1:instrução2:... : instruçãon em vez de escrever uma instrução por linha. Essa possibilidade foi utilizada na linha 10, por exemplo.

3.14.2. E xecutar ações repetidamente

Loop com número conhecido de iterações
for i=idébut to ifin step ipas
    actions
next
  1. A variável i é chamada aqui de variável de loop. Ela pode ter qualquer nome
  2. i assume o valor idebut
  3. o valor de i é comparado com ifin. Se i <= ifin, as ações entre o for... next são executadas
  4. i é incrementado pelo valor de ipas (i = i + ipas)
  5. retorna-se à etapa 3 anterior. Após um número finito de etapas, o valor de i ultrapassará ifin. A execução do script continua com a instrução que se segue ao next
  6. se o incremento ipas for negativo, a condição da etapa 3 é alterada. As ações do for...next só são executadas se i >= ifin.
É possível sair de um loop for a qualquer momento com a instrução exit for.
Loop com número desconhecido de iterações
do while condition
    actions
loop
  1. A expressão condicional é avaliada. Se for verdadeira, as ações do while...loop são executadas
  2. as ações executadas podem ter alterado o valor da condição. Retorna-se à etapa 1 anterior.
  3. Quando a expressão condicional se torna falsa, o loop é encerrado
É possível sair de um loop do while a qualquer momento com a instrução exit do.

O programa abaixo ilustra esses pontos:

Programa
Resultados
i=0,tableau(i)=10,somme=10
i=1,tableau(i)=20,somme=30
i=2,tableau(i)=30,somme=60
i=3,tableau(i)=40,somme=100
i=0,tableau(i)=10,somme=10
i=1,tableau(i)=20,somme=30
i=2,tableau(i)=30,somme=60
i=1
i=2
i=3
i=4
i=5
i=6
i=7
i=8
i=9
i=10
i=11
i=1
i=2
i=3
i=4
i=5
i=6

Observação: Na fase de desenvolvimento de um programa, não é raro que um programa entre em “loop”, c.a.d, e nunca pare. Geralmente, o programa executa um loop cuja condição de saída não pode ser verificada, como, por exemplo, no exemplo a seguir:


' loop infinito
i=0
Do While 1=1
  i=i+1
  wscript.echo i
Loop

' outra do mesmo tipo
i=0
Do While true
  i=i+1
  wscript.echo i
Loop

Se executarmos o programa anterior, o primeiro loop nunca irá parar por conta própria. É possível forçar sua interrupção digitando CTRL-C no teclado (teclas CTRL e C pressionadas ao mesmo tempo).

3.14.3. Encerrar a execução do programa

A instrução wscript.quit n encerra a execução do programa, retornando um código de erro igual a n. Em DOS, esse código de erro pode ser verificado com a instrução if ERRORLEVEL n, que é verdadeira se o código de erro retornado pelo último programa executado for >=n. Consideremos o seguinte programa e seus resultados:

  
début

Logo após a execução do programa, são emitidos os três comandos DOS a seguir:

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

C:\>if ERRORLEVEL 4 echo 4
4

C: >if ERRORLEVEL 3 echo 3
3

O comando DOS 1 verifica se o código de erro retornado pelo programa é >=5. Se for, ele exibe (echo) 5; caso contrário, nada.

O comando DOS 3 verifica se o código de erro retornado pelo programa é >=4. Se for, exibe 4; caso contrário, nada.

O comando DOS 5 verifica se o código de erro retornado pelo programa é >=3. Se for, ele exibe 3; caso contrário, nada.

A partir dos resultados exibidos, pode-se deduzir que o código de erro retornado pelo programa foi 4.

3.15. a tabelas de dados em uma variante

xml-ph-0000@deepl.internala tabelas de dados em uma variante Uma variante T pode conter uma lista de valores. Diz-se, então, que se trata de uma tabela. Uma tabela T possui diversas propriedades:

  • Tem-se acesso ao elemento i da matriz T por meio da sintaxe T(i), em que i é um número inteiro chamado índice, compreendido entre 0 e n-1, se T tiver n elementos.
  • É possível determinar o índice do último elemento da matriz T com a expressão ubound(T). O número de elementos da matriz T é, portanto, ubound(T)+1. Esse número é frequentemente chamado de tamanho da matriz.
  • Uma variável T pode ser inicializada com uma matriz vazia por meio da sintaxe T=array() ou com uma sequência de elementos por meio da sintaxe T=array(elemento0, elemento1, ...., elementoN)
  • É possível adicionar elementos a um array T já criado. Para isso, utiliza-se a instrução redim preserve T(N), em que N é o novo índice do último elemento do array T. A operação é chamada de redimensionamento (redim). A palavra-chave preserve indica que, durante esse redimensionamento, o conteúdo atual do array deve ser preservado. Na ausência dessa palavra-chave, T é redimensionado e seus elementos são removidos.
  • Um elemento T(i) da matriz T é do tipo variant e, portanto, pode conter qualquer valor e, em particular, uma matriz. Nesse caso, a notação T(i)(j) designa o elemento j da matriz T(i).

Essas diversas propriedades das matrizes são ilustradas pelo programa a seguir:

Programa
Resultados
Le tableau t1 a 5 éléments
t1(0)=1
t1(1)=-4,5
t1(2)=deux
t1(3)=Vrai
t1(4)=10/01/02
t1=1:-4,5:deux:Vrai:10/01/02
t1(5)=10:20:30
t1(5)(1)=20
t1=1 ~ -4,5 ~ deux
t1=:::

Comentários

  • Aqui foi utilizada uma função chamada `join`, explicada mais adiante.

3.16. as variáveis de matriz

No VBScript, existe outra maneira de utilizar um array: por meio de uma variável de array. Ao contrário das variáveis escalares, essa variável deve ser obrigatoriamente declarada por meio de uma instrução dim. São possíveis diversas declarações:

  • dim array(n) declara um array estático de n+1 elementos numerados de 0 a n. Esse tipo de array não pode ser redimensionado
  • dim array() declara um array dinâmico vazio. Ele deverá ser redimensionado para ser utilizado por meio da instrução redim, da mesma forma que para um variant que contenha um array
  • dim array(n,m) declara um array bidimensional com (n+1)*(m+1) elementos. O elemento (i,j) do array é denotado como tableau(i,j). Observe-se a diferença em relação a um variant, onde o mesmo elemento seria denotado como tableau(i)(j).

Por que existem dois tipos de matrizes que, no fim das contas, são muito semelhantes? A documentação do VBScript não aborda esse assunto nem indica se um é mais eficiente que o outro. Daqui em diante, utilizaremos quase exclusivamente a matriz dentro de uma variante em nossos exemplos. Lembre-se, porém, de que VBscript deriva da linguagem Visual Basic, que contém dados tipados (integer, double, boolean, ...). Nesse caso, se for necessário usar uma matriz de números reais, por exemplo, a variável matriz terá melhor desempenho do que a variável variante. Assim, declararemos algo como dim array(1000) as double para declarar um array de números reais ou simplesmente dim array() as double se o array for dinâmico.

Aqui está um exemplo que ilustra o uso de variáveis de tabela:

Programa
Resultados
Le tableau t1 a 5 éléments
t1(0)=1
t1(1)=-4,5
t1(2)=deux
t1(3)=Vrai
t1(4)=10/01/02
t1=1:-4,5:deux:Vrai:10/01/02
Le tableau t1 a 5 éléments
t2(0)=0
t2(1)(2)=30
t2=:::
t3(0,0)=0
t3(0,1)=1
t3(1,0)=10
t3(1,1)=11

3.17. as funções split e join

As funções split e join permitem converter uma sequência de caracteres em uma matriz e vice-versa:

  • Se T for um array e car uma sequência de caracteres, join(T,car) é uma sequência de caracteres formada pela junção de todos os elementos do array T, cada um separado do seguinte pela sequência car. Assim, join(array(1,2,3),"abcd") resultará na sequência "1abcd2abcd3"
  • Se C é uma sequência de caracteres formada por uma sucessão de campos separados pela sequência car, a função split(C,car) retorna um array cujos elementos são os diferentes campos da sequência C. Assim, split("1abcd2abcd3", "abcd") retornará o array (1,2,3)

Veja um exemplo:

Programa
Resultados

' transformação de tabela em string e vice-versa

' matriz --> string
tableau=array("un",2,"trois")
chaine=join(tableau,",")
wscript.echo chaine

' string --> matriz
tableau2=split(chaine,",")
For i=0 To ubound(tableau2)
  wscript.echo tableau2(i)
Next

un,2,trois
un
2
trois

3.18. Os dicionários

É possível acessar um elemento de uma matriz T quando se conhece seu número i. Ele pode então ser acessado pela notação T(i). Existem matrizes cujos elementos são acessados não por um número, mas por uma sequência de caracteres. O exemplo típico desse tipo de matriz é o dicionário. Quando se procura o significado de uma palavra no “Larousse” ou no “Le petit Robert”, acessa-se esse significado por meio da palavra. Esse dicionário poderia ser representado por uma matriz de duas colunas:

palavra1
descrição1
palavra2
descrição2
palavra3
descrição3
....
 

Assim, poderíamos escrever coisas como:

dicionário("palavra1") = "descrição1"

dicionário("palavra2") = "descrição2"

...

Estamos, então, próximos do funcionamento de um array, com a diferença de que os índices do array não são números inteiros, mas cadeias de caracteres. Esse tipo de array é chamado de dicionário (ou array associativo, hashtable) e os índices, que são cadeias de caracteres, são chamados de chaves do dicionário (keys). O uso de dicionários é extremamente comum no mundo da informática. Todos nós temos um cartão do plano de saúde com um número nele. Esse número nos identifica de forma única e dá acesso às informações que nos dizem respeito. No modelo dicionário("chave")="informações", "chave" seria, neste caso, o número do plano de saúde e "informações", todas as informações armazenadas sobre nós nos computadores do plano de saúde.

No Windows, existe um objeto ActiveX chamado “Scripting.Dictionary” que permite criar e gerenciar dicionários. Um objeto ActiveX é um componente de software que expõe uma interface utilizável por programas que podem ser escritos em diferentes linguagens, desde que respeitem o padrão de uso dos objetos ActiveX. O objeto Scripting.dictionary pode, portanto, ser utilizado pelas linguagens de programação do Windows: JavaScript, Perl, Python, C, C++, VB, VBA... e não apenas pelo VBScript.

1
Um objeto Scripting.Dictionary é criado por uma instrução
set dico=wscript.CreateObject("Scripting.Dictionary")
ou simplesmente
set dico=CreateObject("Scripting.Dictionary")
CreateObject é um método do objeto WScript que permite criar instâncias de objetos ActiveX. A versão 2 mostra que wscript pode ser um objeto implícito. Quando um método não pode ser “associado” a um objeto, o contêiner WSH tentará associá-lo ao objeto wscript.
2
Depois que o dicionário for criado, será possível adicionar elementos a ele com o método add:
dico.add "chave",valor
criará uma nova entrada no dicionário associada à chave “chave”. O valor associado é um variant com qualquer dado.
3
Para recuperar o valor associado a uma determinada chave, utiliza-se o método item do dicionário:
var = dico.item("chave")
ou set var=dico.item("chave") se o valor associado à chave for um objeto.
4
O conjunto de chaves do dicionário pode ser recuperado em uma matriz variável por meio do método `keys`:
chaves = dic.keys
chaves é um array cujos elementos podem ser percorridos.
5
O conjunto de valores do dicionário pode ser recuperado em um array variável por meio do método `items`:
valores = dic.items
items é um array cujos elementos podem ser percorridos.
6
É possível verificar se uma chave existe usando o método `exists`:
dico.exists("chave") é verdadeiro se a chave "chave" existir no dicionário
7
É possível remover uma entrada do dicionário (chave+valor) com o método remove:
dico.remove("chave") remove a entrada do dicionário associada à chave "chave". dico.removeall remove todas as chaves; c.a.d esvazia o dicionário.

O programa a seguir utiliza essas diversas possibilidades:

Programa

' criação e uso de um dicionário
Set dico=CreateObject("Scripting.Dictionary")

' preenchimento do dicionário
dico.add "clé1","valeur1"
dico.add "clé2","valeur2"
dico.add "clé3","valeur3"

' número de elementos
wscript.echo "Le dictionnaire a " & dico.count & " éléments"

' lista de chaves
wscript.echo "liste des clés"
cles=dico.keys
For i=0 To ubound(cles)
  wscript.echo cles(i)
Next

' lista de valores
wscript.echo "liste des valeurs"
valeurs=dico.items
For i=0 To ubound(valeurs)
  wscript.echo valeurs(i)
Next

' lista de chaves e valores
wscript.echo "liste des clés et valeurs"
cles=dico.keys
For i=0 To ubound(cles)
  wscript.echo "dico(" & cles(i) & ")=" & dico.item(cles(i))
Next

' busca de elementos
' chave1
If dico.exists("clé1") Then
    wscript.echo "La clé clé1 existe dans le dictionnaire et la valeur associée est " & dico.item("clé1")
  Else
    wscript.echo "La clé clé1  n'existe pas dans le dictionnaire"
  End If
' chave4  
If dico.exists("clé4") Then
    wscript.echo "La clé clé4 existe dans le dictionnaire et la valeur associée est " & dico.item("clé4")
  Else
    wscript.echo "La clé clé4  n'existe pas dans le dictionnaire"
  End If

' remoção da chave 1
dico.remove("clé1")

' lista de chaves e valores
wscript.echo "liste des clés et valeurs après suppression de clé1"
cles=dico.keys
For i=0 To ubound(cles)
  wscript.echo "dico(" & cles(i) & ")=" & dico.item(cles(i))
Next

' exclui tudo
dico.removeall

' lista de chaves e valores
wscript.echo "liste des clés et valeurs après suppression de tous les éléments"
cles=dico.keys
For i=0 To ubound(cles)
  wscript.echo "dico(" & cles(i) & ")=" & dico.item(cles(i))
Next

' fim
wscript.quit 0
Resultados
Le dictionnaire a 3 éléments
liste des clés
clé1
clé2
clé3
liste des valeurs
valeur1
valeur2
valeur3
liste des clés et valeurs
dico(clé1)=valeur1
dico(clé2)=valeur2
dico(clé3)=valeur3
La clé clé1 existe dans le dictionnaire et la valeur associée est valeur1
La clé clé4  n'existe pas dans le dictionnaire
liste des clés et valeurs après suppression de clé1
dico(clé2)=valeur2
dico(clé3)=valeur3
liste des clés et valeurs après suppression de tous les éléments

3.19. Classificar um array ou um dicionário

É comum querer ordenar uma matriz ou um dicionário em ordem crescente ou decrescente de seus valores ou, no caso de um dicionário, de suas chaves. Embora na maioria das linguagens existam funções de ordenação, parece não haver nenhuma no VBScript. Essa é uma lacuna.

3.20. Os argumentos de um programa

É possível chamar um programa em VBScript passando-lhe parâmetros, como neste exemplo:

cscript prog1.vbs arg1 arg2 .... argn

Isso permite que o usuário passe informações para o programa. Como ele faz para recuperá-las? Vejamos o seguinte programa:

Programa
Resultados
C:\>cscript arg1.vbs a b c

Il y a 3 arguments
a
b
c

Comentários

  • WScript.Arguments é a coleção dos argumentos passados ao script
  • uma coleção C é um objeto que possui
    • uma propriedade count, que representa o número de elementos na coleção
    • um método C(i) que retorna o elemento i da coleção

3.21. Uma primeira aplicação: IMPOTS

Propomos escrever um programa que permita calcular o imposto de um contribuinte. Consideramos o caso simplificado de um contribuinte que tenha apenas seu salário para declarar:

  • calcula-se o número de cotas do empregado nbParts = nbEnfants/2 + 1 se ele for solteiro, nbEnfants/2 + 2 se for casado, onde nbEnfants é o número de filhos.
  • calcula-se sua renda tributável R = 0,72 * S, onde S é seu salário anual
  • calcula-se seu coeficiente familiar Q = R/N

calcula-se seu imposto I com base nos seguintes dados

12620,0
0
0
13.190
0,05
631
15.640
0,1
1.290,5
24.740
0,15
2.072,5
31.810
0,2
3.309,5
39.970
0,25
4.900
48.360
0,3
6.898,5
55.790
0,35
9.316,5
92.970
0,4
12.106
127.860
0,45
16.754,5
151.250
0,50
23.147,5
172.040
0,55
30.710
195.000
0,60
39.312
0
0,65
49.062

Cada linha possui 3 campos. Para calcular o imposto I, procura-se a primeira linha em que QF ≤ campo1. Por exemplo, se QF = 30000, será encontrada a linha

    24740        0.15        2072.5

O imposto I é, então, igual a 0,15*R - 2072,5*nbParts. Se QF for tal que a relação QF <= campo1 nunca for verificada, então serão utilizados os coeficientes da última linha. Aqui:

    0                0.65        49062

o que resulta no imposto I = 0,65 * R - 49.062 * nbParts.

O programa é o seguinte:

Programa
' cálculo do imposto de um contribuinte
' o programa deve ser chamado com três parâmetros: casado, filhos, salário
' casado: caractere O se casado, N se solteiro
' filhos: número de filhos
' salário: salário anual sem os centavos

' não é feita nenhuma verificação da validade dos dados, mas
' verifica se há, de fato, três

' declaração obrigatória das variáveis
Option Explicit

' verifica-se se há 3 argumentos
Dim nbArguments
nbArguments=wscript.arguments.count
If nbArguments<>3 Then
    wscript.echo "Syntaxe : pg marié enfants salaire"
    wscript.echo "marié : caractère O si marié, N si non marié"
    wscript.echo "enfants : nombre d'enfants"
    wscript.echo "salaire : salaire annuel sans les centimes"
     ' interrupção com código de erro 1
    wscript.quit 1
End If

' recuperam-se os argumentos sem verificar sua validade
Dim marie, enfants, salaire
If wscript.arguments(0) = "O" Or wscript.arguments(0)="o" Then
    marie=true
Else
    marie=false
End If
' “crianças” é um número inteiro
enfants=cint(wscript.arguments(1))
' “salário” é um inteiro longo
salaire=clng(wscript.arguments(2))

' definem-se os dados necessários para o cálculo do imposto em três tabelas
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)

' calcula-se o número de cotas
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

' calcula-se o quociente familiar e a renda tributável
Dim revenu, qf
revenu=0.72*salaire
qf=revenu/nbParts

' calcula-se o imposto
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))

' exibe-se o resultado
wscript.echo "impôt=" & impot

' encerra sem erros
wscript.quit 0
Resultados
C:\>cscript impots1.vbs o 2 200000

impôt=22504

C:\>cscript impots1.vbs o 2 20000

impôt=0

C:\>cscript impots1.vbs o 2 2000000

impôt=746064

C:\>cscript impots1.vbs n 2 200000

impôt=33388

C:\>cscript impots1.vbs n 3 200000

impôt=22504

C:\>cscript impots1.vbs

Syntaxe : pg marié enfants salaire
marié : caractère O si marié, N si non marié
enfants : nombre d'enfants
salaire : salaire annuel sans les centimes

Comentários:

  • o programa utiliza o que foi apresentado anteriormente (declaração de variáveis, argumentos, conversões de tipos, verificações, loops, matriz em um variante)
  • ele não verifica a validade dos dados, o que seria incomum em um programa real
  • Apenas o loop while apresenta uma dificuldade. Ele procura determinar o índice i da matriz limites para o qual se tem limites(i)>qf, e isso para i<ubound(limites) (c.a.d. Aqui, i<13), pois o último elemento da matriz limites não é relevante. Ele foi adicionado apenas para que o teste [Do While i<ubound(limites) And qf>limites(i)] pudesse ser realizado para i=13. O teste é, então, 13<13 e qf>limites(13), e é necessário (em VBScript) que limites(13) exista. Ao sair do loop while, o último valor de i calculado permite calcular o imposto: [impot=int(revenu*coeffr(i)-nbParts*coeffn(i))].