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:
- o contêiner do script é WSH
- 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 |
![]() |
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 |
![]() |
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:
- clica-se em “sim”
- clica-se em “Não”
- clica-se em “Cancelar”
- 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 |
![]() |
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 | |
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 |
![]() |
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 |
![]() |
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 |
![]() |
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:
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 |
![]() | |
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 |
![]() |
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 |
![]() |
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 |
![]() |
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:
Por que não escrever
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:
- um objeto personne é criado. Isso significa que é alocada memória para ele.
- 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 |
![]() |
O programa anterior poderia ser modificado da seguinte forma:
Programa | Resultados |
![]() |
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:
- variável=expressão
- 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 |
![]() |
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:
| 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 |
![]() |
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 |
É possível sair de um loop for a qualquer momento com a instrução exit for. |
Loop com número desconhecido de iterações |
É 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 |
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:
![]() |
Logo após a execução do programa, são emitidos os três comandos DOS a seguir:
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 |
![]() |
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 |
![]() |
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 |
|
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 |
|
Resultados |
|
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:
Isso permite que o usuário passe informações para o programa. Como ele faz para recuperá-las? Vejamos o seguinte programa:
Programa | Resultados |
![]() |
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
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:
o que resulta no imposto I = 0,65 * R - 49.062 * nbParts.
O programa é o seguinte:
Programa | ||
| ||
Resultados | ||
|
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))].









































