3. Noções básicas de programação em VBScript
Depois de descrever os possíveis contextos de execução de um script VBScript, vamos agora discutir a própria linguagem. A partir daqui, assumiremos as seguintes condições:
- o contêiner do script é o WSH
- o script está num ficheiro com a extensão .vbs
Para introduzir um conceito, procedemos geralmente da seguinte forma:
- apresentamos o conceito, se necessário
- apresentamos um programa ilustrativo juntamente com os seus resultados
- comentamos os resultados e o programa, se necessário
Os contêineres VBScript não distinguem maiúsculas de minúsculas no texto do script. Por isso, pode escrever tanto wscript.echo "hello" como WSCRIPT.ECHO "hello".
Os programas apresentados abaixo geram muitos resultados no ecrã, pelo que iremos rever os métodos de saída do objeto wscript.
3.1. Exibição de informações
Já utilizámos o método echo do objeto wscript, mas este possui outros métodos para escrever no ecrã, conforme demonstrado no seguinte script:
Programa | Resultados |
![]() |
Devem ser tidos em conta os seguintes pontos:
- Qualquer texto que se siga a um apóstrofo é tratado como um comentário de script e não é interpretado pelo WSH (linha 1).
- O método echo imprime os seus argumentos e passa para a linha seguinte, tal como o método writeLine (linhas 2 e 6)
- O método write imprime os seus argumentos e não passa para a linha seguinte (linha 3)
- Um caractere de fim de linha é representado pela sequência de dois caracteres ASCII 13 e 10. Assim, a linha 4 é representada pela expressão chr(13) & chr(10), onde chr(i) é o caractere ASCII i e & é o operador de concatenação de cadeias. Assim, "chat" & "eau" resulta na cadeia "chateau".
- O carácter de fim de linha pode ser representado mais facilmente pela constante vbCRLF (linha 5)
3.2. : Escrever instruções num script VBScript
Por predefinição, escreve-se uma instrução por linha. No entanto, é possível escrever várias instruções numa única linha, separando-as com o caractere: como em inst1:inst2:inst3. Se uma linha for demasiado longa, pode ser dividida em partes. Neste caso, as diferentes partes da instrução devem ser terminadas pelos dois caracteres (espaço)_. Vamos revisitar o exemplo anterior, reescrevendo as instruções de forma diferente:
Programa | Resultados |
![]() |
3.3. Escrever com a função msgBox
Embora neste documento utilizemos o objeto wscript quase exclusivamente para exibir texto no ecrã, existe uma função mais sofisticada para exibir informações numa 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
- icons+buttons (opcional) é, na verdade, um número que especifica o tipo de ícone e os botões a colocar na janela da mensagem. Este 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 colocado na barra de título da janela de mensagem
Os valores a utilizar para especificar o ícone e os botões na 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 Abortar, Repetir e Ignorar. |
vbSimNãoCancelar | 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 «Repetir» e «Cancelar». |
vbCritical | 16 | Exibe o ícone de mensagem crítica. |
vbQuestion | 32 | Exibe o ícone de Pedido de Aviso. |
vbExclamation | 48 | Exibe o ícone de mensagem de aviso. |
vbInformation | 64 | Exibe o ícone de mensagem de informação. |
vbDefaultButton1 | 0 | O primeiro botão é o botão predefinido. |
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 | Aplicação modal; o utilizador deve responder à mensagem antes de continuar a trabalhar na aplicação atual. |
vbSystemModal | 4096 | Modal do sistema; todas as aplicações são suspensas até que o utilizador responda à mensagem. |
Aqui estão alguns exemplos:
Programa | ||||||||||||||||||||||||
![]() | ||||||||||||||||||||||||
Resultados | ||||||||||||||||||||||||
| ||||||||||||||||||||||||
Em alguns casos, é apresentada uma janela de informação que também funciona como janela de entrada. Se for feita uma pergunta, por exemplo, queremos saber se o utilizador clicou no botão Sim ou no botão Não. A função msgBox devolve um resultado que não utilizámos no programa anterior. Este resultado é um número inteiro que representa o botão em que o utilizador clicou para fechar a janela de exibição:
Constante | Valor | Botão selecionado |
vbOK | 1 | OK |
vbCancel | 2 | Cancelar |
vbAbort | 3 | Interromper |
vbRetry | 4 | Repetir |
vbIgnorar | 5 | Ignorar |
vbSim | 6 | Sim |
vbNão | 7 | Não |
O programa seguinte demonstra como utilizar o resultado da função msgBox. É apresentada quatro vezes uma janela com os botões Sim, Não e Cancelar. A resposta é a seguinte:
- Clique em Sim
- clique em Não
- clique em Cancelar
- feche a janela sem utilizar um botão. O programa mostra que isto é equivalente a utilizar o botão Cancelar.
Programa | ||||
![]() | ||||
Resultados | ||||
|
3.4. Tipos de dados utilizáveis no VBScript
O VBScript reconhece apenas um tipo de dados: o variante. O valor de um variante pode ser um número (4, 10,2), uma cadeia de caracteres ("olá"), um valor booleano (verdadeiro/falso), uma data (#01/01/2002#), o endereço de um objeto ou uma coleção de todos estes tipos de dados colocados numa estrutura chamada matriz.
Vamos examinar o seguinte programa e os seus resultados:
Programa | Resultados |
![]() |
Comentários:
- Várias linguagens de programação (C, C++, Pascal, Java, C#, etc.) exigem que uma variável seja declarada antes de ser utilizada. Esta declaração envolve especificar o nome da variável e o tipo de dados que ela pode conter (inteiro, ponto flutuante, cadeia de caracteres, data, booleano, etc.). A declaração de variáveis permite várias coisas:
- determinar o espaço de memória necessário para a variável, uma vez que diferentes tipos de dados requerem diferentes quantidades de memória
- verificar a consistência do programa. Por exemplo, se i for um inteiro e c for uma cadeia de caracteres, multiplicar i por c não faz sentido. Se os tipos das variáveis i e c tiverem sido declarados pelo programador, o programa responsável por analisar o código antes da execução pode sinalizar tal inconsistência.
Tal como a maioria das linguagens de script de tipo de dados único (Perl, Python, JavaScript, etc.), o VBScript permite que as variáveis sejam utilizadas sem declaração. Foi isso que se fez no exemplo acima.
- Observe a sintaxe dos diferentes tipos de dados
- 10,2 na linha 10 (ponto decimal, não uma vírgula). Repare que 10,2 é apresentado no ecrã.
- 1,4e-2 na linha 13 (notação científica). O número 0,014 é exibido
- [#01/10/2002#] (linha 26) para representar a data 10 de janeiro de 2002. O VBScript utiliza, portanto, o formato #mm/dd/aaaa# para representar a data dd do mês mm do ano aaaa
- os booleanos true e false nas linhas 31 e 34. Estes dois valores são representados, respetivamente, pelos inteiros -1 e 0, conforme mostrado na saída das linhas 32 e 35. Quando um booleano é concatenado com uma cadeia de caracteres, estes valores tornam-se as cadeias «True» e «False», respetivamente, conforme mostrado nas linhas 33 e 36. Note-se que o operador de concatenação & pode ser utilizado para concatenar mais do que apenas cadeias de caracteres.
- Uma vez que uma variável v não tem um tipo atribuído, pode sucessivamente conter valores de tipos diferentes ao longo do tempo.
3.5. L : Subtipos do tipo Variant
Eis o que a documentação oficial diz sobre os diferentes tipos de dados que uma variante pode conter:
Para além da simples distinção entre números e cadeias de caracteres, um Variant consegue distinguir entre diferentes tipos de informação numérica. Por exemplo, algumas informações numéricas representam uma data ou uma hora. Quando esta informação é utilizada em conjunto com outros dados de data ou hora, o resultado é sempre expresso como uma data ou uma hora. Existem também outros tipos de informação numérica, que vão desde valores booleanos até grandes números de ponto flutuante. Estas diferentes categorias de informação que podem estar contidas num Variant são subtipos. Na maioria dos casos, basta colocar os dados num Variant, e este comporta-se da forma mais adequada com base nesses dados.
A tabela seguinte lista os diferentes subtipos que podem estar contidos num Variant.
Subtipo | Descrição |
Vazio | A Variável não está inicializada. O seu valor é zero para variáveis numéricas e uma cadeia nula ("") para variáveis de cadeia. |
Nulo | A variante contém intencionalmente dados incorretos. |
Booleano | |
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 entre -2.147.483.648 e 2.147.483.647. |
Single | Contém um número de ponto flutuante de precisão simples que varia de -3,402823E38 a -1,401298E-45 para valores negativos; de 1,401298E-45 a 3,402823E38 para valores positivos. |
Duplo | Contém um número de ponto flutuante de dupla precisão que varia 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. |
Cadeia | Contém uma cadeia de comprimento variável limitada a aproximadamente 2 mil milhões de caracteres. |
Objeto | Contém um objeto. |
Erro | Contém um número de erro. |
3.6. C : Determinar o tipo exato dos dados contidos numa variante
Uma variável do tipo variant pode conter dados de vários tipos. Por vezes, precisamos de saber a natureza exata desses dados. Se escrevermos product = number1 \* number2 num programa, assumimos que number1 e number2 são ambos valores numéricos. Por vezes, não temos a certeza, porque esses valores podem provir de uma entrada do teclado, de um ficheiro ou de alguma outra fonte externa. Temos, então, de verificar a natureza dos dados armazenados em number1 e number2. A função typename(var) permite-nos determinar o tipo de dados contidos na variável var. Aqui estão alguns exemplos:
Programa | Resultados |
![]() |
Outra função possível é vartype(var), que devolve um número que representa 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 | Moeda |
vbDate | 7 | Data |
vbString | 8 | String |
vbObject | 9 | Objeto de automação |
vbError | 10 | Erro |
vbBoolean | 11 | Booleano |
vbVariant | 12 | Variant (utilizado apenas com matrizes Variant) |
vbDataObject | 13 | Objeto não de automação |
vbByte | 17 | Byte |
vbArray | 8192 | Matriz |
Nota: Estas constantes são definidas pelo VBScript. Consequentemente, os nomes podem ser utilizados em qualquer parte do seu código em vez dos valores reais.
A informação acima provém da documentação do VBScript. Por vezes, esta informação está incorreta, provavelmente devido à cópia e colagem da documentação do VB. A função vartype do VBScript executa apenas parte do que está descrito acima.
O programa anterior, reescrito para vartype, produz os seguintes resultados:
Programa | Resultados |
![]() |
3.7. D Declarar variáveis utilizadas pelo script
Mencionámos que não é obrigatório declarar as variáveis utilizadas pelo script. Neste caso, se escrevermos:
1) somme=4
...
2) somme=smme+10
Se houver um erro ortográfico — como «smme» em vez de «somme» — na linha 2, o VBScript não irá reportar um erro. Irá assumir que «smme» é uma nova variável. Irá criá-la e, no contexto da linha 2, utilizá-la inicializando-a com o valor 0.
Este tipo de erros pode ser muito difícil de detetar. Por isso, é aconselhável impor a declaração de variáveis utilizando a diretiva option explicit colocada no início do script. Assim, todas as variáveis devem ser declaradas com uma instrução dim antes da sua primeira utilização:
option explicit
...
dim somme
1) somme=4
...
2) somme=smme+10
Neste exemplo, o VBScript indicará que existe uma variável smme não declarada no ponto 2), conforme mostrado no exemplo seguinte:
Programa | Resultados |
![]() |
Embora as variáveis não sejam, na sua maioria, declaradas nos breves exemplos deste documento, será necessário declará-las assim que escrevermos os nossos primeiros scripts significativos. A diretiva Option Explicit será então utilizada de forma sistemática.
3.8. Funções de conversão do
O VBScript converte dados de tipo variant em cadeias de caracteres, números, valores booleanos, etc., dependendo do contexto. Na maioria das vezes, isto funciona bem, mas por vezes leva a resultados inesperados, como veremos mais adiante. Por isso, poderá querer «forçar» o tipo de dados do variant. O VBScript possui funções de conversão que transformam uma expressão em vários tipos de dados. Aqui estão algumas delas:
Cint (expressão) | converte a expressão num inteiro curto |
Clng (expressão) | converte a expressão num inteiro longo |
Cdbl (expressão) | converte a expressão num número de precisão dupla |
Csng (expressão) | converte a expressão num número de ponto flutuante de precisão simples (single) |
Ccur (expressão) | converte a expressão em moeda |
Aqui estão alguns exemplos:
3.9. Dados digitados no teclado
O objeto wscript permite que um script recupere dados introduzidos através do teclado. O método wscript.stdin.readLine lê uma linha de texto introduzida através do teclado e confirmada premindo a tecla «Enter». Esta linha lida pode ser atribuída a uma variável.
Programa | Resultados |
![]() | |
Comentários:
- Na coluna de resultados e na linha [Digite o seu nome: st], st é o texto introduzido pelo utilizador.
Se o texto digitado no teclado representar um número, este continua a ser tratado principalmente como uma sequência de caracteres, conforme ilustrado no exemplo abaixo:
Programa | Resultados |
![]() |
Se este número for utilizado numa operação aritmética, o VBScript converterá automaticamente a cadeia de caracteres num número, mas nem sempre. Vejamos o seguinte exemplo:
Programa | Resultados |
![]() |
Nos resultados, vemos que a linha 8 do script não foi executada como esperado, porque (infelizmente) no VBScript o operador + tem dois significados: adição de dois números ou concatenação de duas cadeias de caracteres (as duas cadeias são unidas). Vimos anteriormente que os números digitados no teclado eram lidos como cadeias de caracteres e que o VBScript os convertia em números conforme necessário. Fê-lo corretamente para as operações -, *, /, que só podem envolver números, mas não para o operador +, que também pode envolver cadeias de caracteres. Aqui, assumiu que queríamos concatenar cadeias de caracteres.
Uma solução simples para este problema consiste em converter as cadeias de caracteres em números assim que forem lidas, tal como se pode ver na seguinte melhoria ao programa anterior:
Programa | Resultados |
![]() |
3.10. S Introdução de dados com a função inputBox
Pode preferir introduzir dados através de uma interface gráfica em vez de utilizar o teclado. Nesse caso, utilize a função inputBox. Esta função aceita vários parâmetros, mas apenas os dois primeiros são normalmente utilizados:
response = inputBox(message, title)
- message: a pergunta que faz ao utilizador
- title (opcional): o título que atribui à janela de entrada
- resposta: o texto digitado pelo utilizador. Se o utilizador fechou a janela sem responder, a resposta é uma cadeia de caracteres vazia.
Aqui está um exemplo em que solicitamos o nome e a idade de uma pessoa. Para o nome, introduzimos a informação e clicamos em OK. Para a idade, também introduzimos a informação, mas clicamos em Cancelar.
Programa | ||||
![]() | ||||
Resultados | ||||
|
3.11. U ando objetos estruturados
É possível criar objetos com métodos e propriedades utilizando VBScript. Para simplificar, apresentaremos aqui um objeto com propriedades, mas sem métodos. Considere uma pessoa. Ela tem muitas propriedades que a caracterizam: altura, peso, cor da pele, cor dos olhos, cor do cabelo, etc. Vamos concentrar-nos apenas em duas: o nome e a idade. Antes de poder utilizar objetos, deve criar o modelo que lhe permitirá construí-los. No VBScript, isto é feito utilizando uma classe. A classe Pessoa poderia ser definida da seguinte forma:
class personne
Dim nom,age
End class
É a instrução [Dim nome, idade] que define as duas propriedades da classe Pessoa. Para criar cópias (chamadas instâncias) da classe Pessoa, escrevemos:
Porque não escrever
Porque uma variável não pode conter um objeto. Só pode conter o endereço do objeto. Quando escreve set pessoa1 = nova pessoa, ocorre a seguinte sequência de eventos:
- É criado um objeto Pessoa. Isto significa que é-lhe atribuída memória.
- O endereço deste objeto person é atribuído à variável person1
Temos então a seguinte disposição de memória para as variáveis person1 e person2:
![]() |
A título de figura de estilo, poderíamos dizer que a pessoa1 é um objeto pessoa. Podemos aceitar esta figura de estilo se nos lembrarmos de que a pessoa1 é, na verdade, o endereço de um objeto pessoa e não o próprio objeto pessoa.
Dissemos que um objeto Pessoa tem duas propriedades: nome e idade. Como acedemos a estas propriedades? Utilizando a notação objeto.propriedade, tal como explicado anteriormente. Assim
pessoa1.nome refere-se ao nome da pessoa 1 e pessoa1.idade refere-se à sua idade. Aqui está um pequeno programa para ilustrar isto:
Programa | Resultados |
![]() |
O programa anterior poderia ser modificado da seguinte forma:
Programa | Resultados |
![]() |
Aqui utilizámos a estrutura with ... end with, que nos permite "extrair" nomes de objetos em expressões. A estrutura with p1 ... end with* nas linhas 9–12 e 15–18 permite-nos usar a sintaxe .name em vez de p1.name* e .age* em vez de p1.age*. Isto simplifica a escrita de instruções em que o mesmo nome de objeto é usado 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
- set 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 variável=expressão, a variável recebe um valor. Se v1 e v2 forem duas variáveis, escrever v1=v2 atribui o valor de v1 a v2. Isto resulta na duplicação de um valor em dois locais diferentes. Se o valor de v2 for posteriormente modificado, o valor de v1 permanece inalterado.
![]() |
- Na instrução `set variable=expression`, a `variable` recebe o endereço de um objeto. Se `v1` e `v2` forem duas variáveis e `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 posteriormente v1 e v2, não são os «valores» de v1 e v2 que estão a ser manipulados, mas sim os objetos «apontados» por v1 e v2 — neste caso, o mesmo objeto. Dizemos que v1 e v2 são duas referências ao mesmo objeto, e manipulá-lo através de v1 ou v2 não faz diferença. Por outras palavras, modificar o objeto referenciado por v2 modifica aquele referenciado por v1.
![]() |
Eis um exemplo:
Programa | Resultados |
![]() |
3.13. E es de avaliação de expressões
Os principais operadores utilizados para avaliar expressões são os seguintes:
Tipo de operadores | Operadores | Exemplo |
Aritméticos | +,-,*,/ | |
Comparação | <, <= >, >= =,<> | a<>b é verdadeiro se a não for igual a b a=b é verdadeiro se a for igual a b a e b podem ser ambos números ou ambos cadeias de caracteres. Neste último caso, string1<string2 se string1 vier antes de string2 por ordem alfabética. Na comparação de cadeias de caracteres, as letras maiúsculas vêm antes das minúsculas por ordem alfabética. |
Lógica | e, ou, não, xor | Todos os operandos aqui são booleanos. bool1 ou bool2 é verdadeiro se bool1 ou bool2 for verdadeiro bool1 e bool2 é verdadeiro se tanto bool1 como bool2 forem verdadeiros não 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 utilizar o operador + para concatenar duas cadeias de caracteres, uma vez que isso pode ser confundido com a soma de dois números. Por conseguinte, deve utilizar apenas o operador &. |
3.14. C : Controlo da execução do programa
3.14.1. E xecutar ações condicionalmente
A instrução VBScript utilizada para executar ações com base no facto de uma condição ser verdadeira ou falsa é a seguinte:
A expressão é avaliada primeiro. Esta expressão deve ter um valor booleano. Se for avaliada como verdadeira, as ações no bloco then são executadas; caso contrário, as ações no bloco else são executadas, se existirem. |
Aqui está um programa que demonstra diferentes variações da instrução if-then-else:
Programa | Resultados |
![]() |
Comentários:
- No VBScript, pode escrever instrução1:instrução2:... : instruçãon em vez de escrever uma instrução por linha. Esta funcionalidade é utilizada na linha 10, por exemplo.
3.14.2. E xecutar ações repetidamente
Loop com um número conhecido de iterações |
Pode sair de um ciclo for a qualquer momento utilizando a instrução exit for. |
Loop com um número desconhecido de iterações |
Pode sair de um ciclo do-while a qualquer momento utilizando a instrução exit do. |
O programa abaixo ilustra estes pontos:
Programa |
![]() |
Resultados |
|
Nota: Durante a fase de desenvolvimento de um programa, não é invulgar que um programa entre em «loop», ou seja, que nunca pare. Geralmente, o programa executa um loop cuja condição de saída não pode ser verificada, como no exemplo seguinte:
' infinite loop
i=0
Do While 1=1
i=i+1
wscript.echo i
Loop
' another of the same kind
i=0
Do While true
i=i+1
wscript.echo i
Loop
Se executar o programa anterior, o primeiro ciclo nunca irá parar por si próprio. Pode forçá-lo a parar premindo CTRL-C no teclado (mantenha premidas as teclas CTRL e C ao mesmo tempo).
3.14.3. Terminar a execução do programa
A instrução wscript.quit n encerra o programa, devolvendo um código de erro igual a n. No DOS, este código de erro pode ser verificado utilizando a instrução if ERRORLEVEL n, que resulta em verdadeiro se o código de erro devolvido pelo último programa executado for >=n. Considere o seguinte programa e os seus resultados:
![]() |
Imediatamente após a execução do programa, são emitidos os seguintes três comandos DOS:
O comando DOS 1 verifica se o código de erro devolvido pelo programa é >=5. Se for esse o caso, exibe (echo) 5; caso contrário, nada.
O comando DOS 3 verifica se o código de erro devolvido pelo programa é >=4. Se for esse o caso, exibe 4; caso contrário, nada.
O comando DOS 5 verifica se o código de erro devolvido pelo programa é >=3. Se for esse o caso, exibe 3; caso contrário, nada.
A partir dos resultados apresentados, podemos deduzir que o código de erro devolvido pelo programa foi 4.
3.15. L s matrizes de dados numa variante
Uma variante T pode conter uma lista de valores. Dizemos então que se trata de uma matriz. Uma matriz T tem várias propriedades:
- Acedemos ao elemento i da matriz T utilizando a sintaxe T(i), em que i é um número inteiro chamado índice, compreendido entre 0 e n-1, se T tiver n elementos.
- O índice do último elemento da matriz T pode ser determinado utilizando a expressão ubound(T). O número de elementos na matriz T é, então, ubound(T)+1. Este número é frequentemente referido como o tamanho da matriz.
- Uma variante T pode ser inicializada com uma matriz vazia utilizando a sintaxe T=array() ou com uma sequência de elementos utilizando a sintaxe T=array(element0, element1, ...., elementn)
- Pode adicionar elementos a uma matriz T que já tenha sido criada. Para o fazer, utilize a instrução redim preserve T(N), em que N é o novo índice do último elemento da matriz T. Esta operação é denominada redimensionamento (redim). A palavra-chave preserve indica que, durante este redimensionamento, o conteúdo atual da matriz deve ser preservado. Na ausência desta palavra-chave, T é redimensionada e os seus elementos são apagados.
- Um elemento T(i) da matriz T é do tipo variante e pode, portanto, conter qualquer valor, incluindo outra matriz. Neste caso, a notação T(i)(j) refere-se ao j-ésimo elemento da matriz T(i).
Estas várias propriedades das matrizes são ilustradas pelo seguinte programa:
Programa | Resultados |
![]() |
Comentários
- Aqui utilizámos uma função chamada join, que é explicada em mais pormenor abaixo.
3.16. L e de variáveis de matriz
No VBScript, existe outra forma de utilizar uma matriz: através de uma variável de matriz. Ao contrário das variáveis escalares, essa variável deve ser declarada utilizando uma instrução dim. São possíveis várias declarações:
- dim array(n) declara uma matriz estática de n+1 elementos numerados de 0 a n. Este tipo de matriz não pode ser redimensionado
- dim array() declara uma matriz dinâmica vazia. Deve ser redimensionada para utilização com a instrução redim, da mesma forma que para uma variante que contenha uma matriz
- dim array(n,m) declara uma matriz bidimensional com (n+1)*(m+1) elementos. O elemento (i,j) da matriz é denotado como array(i,j). Note a diferença em relação a uma variante, onde o mesmo elemento teria sido denotado como array(i)(j).
Por que existem dois tipos de matrizes que, no fundo, são muito semelhantes? A documentação do VBScript não aborda esta questão e não indica se um é mais eficiente do que o outro. Daqui em diante, utilizaremos matrizes dentro de variantes quase exclusivamente nos nossos exemplos. No entanto, vale a pena referir que o VBScript deriva da linguagem Visual Basic, que por sua vez contém tipos de dados (inteiro, duplo, booleano, etc.). Neste caso, se precisarmos de utilizar uma matriz de números reais, por exemplo, a variável de matriz será mais eficiente do que a variável de variante. Declararíamos então algo como dim array(1000) as double para declarar uma matriz de números reais, ou simplesmente dim array() as double se a matriz for dinâmica.
Aqui está um exemplo que ilustra a utilização de variáveis de matriz:
Programa | Resultados |
![]() |
3.17. L : as funções split e join
As funções split e join permitem converter uma cadeia de caracteres numa matriz e vice-versa:
- Se T for uma matriz e car for uma cadeia de caracteres, join(T,car) é uma cadeia de caracteres formada pela concatenação de todos os elementos da matriz T, cada um separado do seguinte pela cadeia de caracteres car. Assim, join(array(1,2,3),"abcd") produzirá a cadeia de caracteres "1abcd2abcd3"
- Se C for uma cadeia de caracteres constituída por uma sequência de campos separados pela cadeia de caracteres car, a função split(C,car) devolve uma matriz cujos elementos são as partes individuais da cadeia de caracteres C. Assim, split("1abcd2abcd3", "abcd") devolverá a matriz (1,2,3)
Eis um exemplo:
Programa | Resultados |
| |
3.18. Dicionários
Podemos aceder a um elemento de uma matriz T quando conhecemos o seu índice i. Este fica então acessível utilizando a notação T(i). Existem matrizes cujos elementos são acedidos não por um índice, mas por uma cadeia de caracteres. Um exemplo típico deste tipo de matriz é um dicionário. Ao procurar o significado de uma palavra no «Larousse» ou no «Le petit Robert», acedemos a ela através da palavra. Poderíamos representar este dicionário como uma matriz de duas colunas:
palavra1 | descrição1 |
palavra2 | descrição2 |
palavra3 | descrição3 |
.... |
Poderíamos então escrever coisas como:
dicionário("palavra1") = "descrição1"
dicionário("palavra2") = "descrição2"
...
Isto é semelhante ao funcionamento de uma matriz, exceto que os índices da matriz não são números inteiros, mas sim cadeias de caracteres. Este tipo de matriz é chamado de dicionário (ou matriz associativa, tabela hash), e os índices de cadeias de caracteres são chamados de chaves do dicionário. Os dicionários são utilizados com extrema frequência no mundo da informática. Todos nós temos um cartão de segurança social com um número. Este número identifica-nos de forma única e dá acesso a informações sobre nós. No modelo dicionário("chave")="informação", "chave" seria o número de segurança social e "informação" seria toda a informação armazenada sobre nós nos computadores da segurança social.
No Windows, existe um objeto ActiveX chamado "Scripting.Dictionary" que permite criar e gerir dicionários. Um objeto ActiveX é um componente de software que expõe uma interface utilizável por programas escritos em várias linguagens, desde que estejam em conformidade com o padrão de objetos ActiveX. O objeto Scripting.Dictionary pode, portanto, ser utilizado por linguagens de programação do Windows, tais como JavaScript, Perl, Python, C, C++, VB, VBA e outras — não apenas VBScript.
1 | Um objeto Scripting.Dictionary é criado utilizando a seguinte instrução set dico=wscript.CreateObject("Scripting.Dictionary") ou simplesmente set dico=CreateObject("Scripting.Dictionary") CreateObject é um método do objeto WScript utilizado para 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 «resolvido» para um objeto, o contentor WSH tentará resolvê-lo para o objeto wscript. |
2 | Assim que o dicionário for criado, podemos adicionar-lhe elementos utilizando o método add: dico.add "key",value criará uma nova entrada no dicionário associada à chave "key". O valor associado é um Variant que contém quaisquer dados. |
3 | Para recuperar o valor associado a uma determinada chave, usamos o método item do dicionário: var = dic.item("key") ou set var = dic.item("chave") se o valor associado à chave for um objeto. |
4 | Todas as chaves do dicionário podem ser recuperadas numa matriz variável utilizando o método `keys`: keys = dic.keys keys é uma matriz cujos elementos podem ser iterados. |
5 | Todos os valores do dicionário podem ser recuperados numa matriz variável utilizando o método `items`: values = dic.items items é uma matriz cujos elementos podem ser iterados. |
6 | A existência de uma chave pode ser verificada utilizando o método `exists`: dico.exists("key") é verdadeiro se a chave "key" existir no dicionário |
7 | Pode remover uma entrada do dicionário (chave+valor) utilizando o método remove: dico.remove("key") remove a entrada do dicionário associada à chave "key". dico.removeall remove todas as chaves, ou seja, esvazia o dicionário. |
O programa a seguir utiliza estas várias opções:
Programa
' creating and using a dictionary
Set dico=CreateObject("Scripting.Dictionary")
' dico filling
dico.add "clé1","valeur1"
dico.add "clé2","valeur2"
dico.add "clé3","valeur3"
' number of elements
wscript.echo "Le dictionnaire a " & dico.count & " éléments"
' kEY LIST
wscript.echo "liste des clés"
cles=dico.keys
For i=0 To ubound(cles)
wscript.echo cles(i)
Next
' list of values
wscript.echo "liste des valeurs"
valeurs=dico.items
For i=0 To ubound(valeurs)
wscript.echo valeurs(i)
Next
' list of keys and values
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
' item search
' key1
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
' key4
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
' remove key 1
dico.remove("clé1")
' list of keys and values
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
' we do away with everything
dico.removeall
' list of keys and values
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
' end
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. Ordenar uma matriz ou um dicionário
É comum querer ordenar uma matriz ou um dicionário por ordem crescente ou decrescente, com base nos seus valores ou, no caso de um dicionário, nas suas chaves. Embora a maioria das linguagens disponha de funções de ordenação, não parece haver nenhuma no VBScript. Esta é uma lacuna.
3.20. Argumentos do programa
É possível chamar um programa VBScript passando-lhe parâmetros, como em:
Isto permite ao utilizador passar informações para o programa. Como é que o programa recupera estas informações? Vejamos o seguinte programa:
Programa | Resultados |
![]() |
Comentários
- WScript.Arguments é a coleção de argumentos passados para o script
- Uma coleção C é um objeto que possui
- uma propriedade count, que é o número de elementos na coleção
- um método C(i) que devolve o i-ésimo elemento da coleção
3.21. Uma primeira aplicação: IMPOSTOS
Propomos escrever um programa para calcular o imposto de um contribuinte. Consideramos o caso simplificado de um contribuinte que tem apenas o seu salário para declarar:
- O número de quotas para o trabalhador é calculado da seguinte forma: nbParts = nbEnfants / 2 + 1 se o trabalhador for solteiro, ou nbEnfants / 2 + 2 se o trabalhador for casado, sendo nbEnfants o número de filhos.
- Calculamos o seu rendimento tributável R = 0,72 * S, em que S é o seu salário anual
- Calculamos o seu coeficiente familiar Q = R / N
Calculamos o 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 tem 3 campos. Para calcular o imposto I, procuramos a primeira linha em que QF <= campo1. Por exemplo, se QF = 30000, encontraremos a linha
O Imposto I é então igual a 0,15*R - 2072,5*nbParts. Se QF for tal que a condição QF<=field1 nunca seja satisfeita, então são utilizados os coeficientes da última linha. Aqui:
o que dá o imposto I = 0,65*R - 49062*nbParts.
O programa é o seguinte:
Programa
' calculating a taxpayer's tax liability
' the program must be called with three parameters: married children salary
' married: character Y if married, N if unmarried
' children: number of children
' salary: annual salary without cents
' no verification of data validity is performed, but we do
' check that there are three of them
' mandatory variable declaration
Option Explicit
' we check that there are 3 arguments
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"
' stop with error code 1
wscript.quit 1
End If
' retrieve arguments without checking their validity
Dim marie, enfants, salaire
If wscript.arguments(0) = "O" Or wscript.arguments(0)="o" Then
marie=true
Else
marie=false
End If
' children is an integer
enfants=cint(wscript.arguments(1))
' salary is a long integer
salaire=clng(wscript.arguments(2))
' we define the data needed to calculate the tax in 3 tables
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)
' the number of shares is calculated
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
' we calculate the family quotient and taxable income
Dim revenu, qf
revenu=0.72*salaire
qf=revenu/nbParts
' tax calculation
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))
' the result is displayed
wscript.echo "impôt=" & impot
' leave without error
wscript.quit 0
Resultados
|
Comentários:
- O programa utiliza o que foi abordado anteriormente (declarações de variáveis, argumentos, conversões de tipos, testes, loops, matriz numa variante)
- Não verifica a validade dos dados, o que seria invulgar num programa real
- Apenas o ciclo while apresenta um desafio. Procura determinar o índice i da matriz limits para o qual limits(i) > qf, e isto para i < ubound(limits) (ou seja, aqui i < 13), porque o último elemento da matriz limits não é significativo. Foi adicionado apenas para que o teste [Do While i<ubound(limits) And qf>limits(i)] pudesse ser realizado para i=13. O teste passa então a ser 13<13 e qf>limits(13) e, por conseguinte (em VBScript), limits(13) deve existir. Ao sair do ciclo while, o último valor calculado de i é utilizado para calcular o imposto: [tax = Int(income * coeffr(i) - nbParts * coeffn(i))].









































