Os dados podem ser estruturados, e a forma mais simples de os estruturar são as matrizes, tabelas ou arrays. Estas são colecções de dados que se assemelham a uma lista (se com uma só dimensão), uma tabela (se com duas), um espaço (se com três), etc... No WSH/VBS as matrizes podem ter até sessenta dimensões.
Os elementos são acedidos através do seu índice. O índice do primeiro elemento é zero. Por exemplo, na matriz bidimensional
| Sam | Peckinpah |
| Orson | Welles |
| Oliver | Stone |
| George | Lucas |
| Stephen | Spielberg |
| Martin | Scorcese |
"Sam" é referido com os índices (0,0), e "Peckinpah" como (0,1); "Stone" como (2,1), etc...
As matrizes têm de ser declaradas obrigatoriamente com o seu nome e número de elementos. A matriz acima, que vamos chamar Realizadores, será declarada assim:
dim Realizadores(6,1)
ou seja, seis "linhas" e duas "colunas", sendo que a segunda tem um só valor por cada entrada de linha; mas teremos de nos lembra que, como o primeiro elemento é de índice zero, o índice do último elemento desta tabela é 5.
Vejamos um pequeno script que usa dados arrumados numa matriz:
' Programa tabelas.vbs 21:42 11-05-2008
' Demonstração inicial do uso de uma matriz
' Com uso do vbCancel
' Criar a tabela e as restantes variáveis
' A tabela terá 3 "linhas" (primeiro índice)
' e duas "colunas" (segundo índice)
dim Tabela(3,1)
dim vbCancel ' exigida para usar vbCancel
Entrada = -1
Maximo1 = 0
' Preencher a tabela
Tabela(0,0)= "Andrade Corvo"
Tabela(0,1)= 9865015
Tabela(1,0)= "Madalena Singh"
Tabela(1,1)= 8648049
Tabela(2,0)= "Anfrósio Quelibate"
Tabela(2,1)= 7597539
' Achar o máximo de "linhas" da tabela
Maximo1 = clng(ubound(Tabela,1))
' Pedir uma entrada entre 1
' e o máximo de linhas da tabela
do
Entrada= inputbox("Qual a entrada " & _
"a mostrar? " & _
"(Até" & " " & Maximo1 & ")")
' Se mandar cancelar, sair do script
if Entrada=vbCancel then wscript.quit()
' Converter para fazer
' a comparação na linha seguinte
Entrada= clng(Entrada)
loop until ((Entrada > 0) and (Entrada <= Maximo1))
' Transformar o número de ordem em índice
Entrada = Entrada -1
' Abaixo, mostrar o índice de novo como
' número de ordem
msgbox Entrada+1 & " - " & _
Tabela(Entrada,0) & " " & _
Tabela(Entrada,1)
' FIM
Note que ubound é a instrução que devolve o número de elementos de uma dada dimensão da matriz. Também existe um lbound(), e só Zeus sabe porquê.
Se usa tabelas muito grandes, pode ser-lhe necessário adaptar-lhe o tamanho aos dados, ou apagar uma antes de usar outra.
Para mudar o tamanho de uma tabela usa-se a instrução redim:
redim preserve Realizadores(1,1)
onde a opção preserve diz para se reterem os valores existentes na matriz. A instrução acima reduziria a matriz a:
| Sam | Peckinpah |
| Orson | Welles |
Sem a opção preserve, os valores seriam apagados. Para poder usar a instrução redim, a matriz terá de ter sido declarada inicialmente como matriz dinâmica, isto é, sem indicação de dimensões:
dim Realizadores() redim Realizadores(5,2)
Se, de qualquer forma, reduzir a extensão das dimensões para menos do que os valores nela contidos, os dados são descartados sem aviso.
Para apagar uma matriz, usa-se a instrução erase.
No código abaixo, note que criamos e preenchemos a tabela de uma assentada com a instrução array().
' tabelas2.vbs 21:34 11-05-2008
' Demonstra a criação de uma matriz ad-hoc
' Redimensionamento e saída num só botão
' Subrotina -------------
sub MostraTudo
' Mostra o conteúdo da tabela Tabela,
' que deve ser global
' vbNewLine produz uma nova linha
' O conteúdo de Saida é apagado
' entre chamadas da subrotina
dim Saida, I
Saida= Saida & "E o conteúdo é:" & vbNewLine
for I=0 to ubound(Tabela)
Saida= Saida & vbNewLine & Tabela(I)
next
msgbox Saida
end sub
' PROGRAMA PRINCIPAL ------------------------------
' criar uma tabela
Tabela= array("João", "José", "Joaquim", "Joaquina")
' Mostrar tudo
MostraTudo
' Redimensionar e voltar a mostrar
redim preserve Tabela(1)
MostraTudo
' FIM ----------------------------------------------
Para percorrer sequencialmente matrizes e colecções (havemos de falar destas), existe o ciclo for each..next. Como demonstração:
' cores.vbs - 12:18 13-05-2008
' Demo do ciclo for each..next
' Matriz linear criada ad-hoc
ArcoIris= array("vermelho","alaranjado","amarelo",_
"verde","azul","anil","violeta")
' Variável para conter os elementos um a um
dim Cor
' Ciclo
for each Cor in ArcoIris
' Afixar se a primeira letra é v
if mid(Cor,1,1) = "v" then msgbox Cor, _
vbInformation, "Cores"
next
' FIM
Sugestão: uma forma de manter uma "cábula" para as instruções de uma linguagem é o ZuluPad.
Início: 20:39 11-05-2008
Última modificação: 2008-05-13 12:38