Está en la página 1de 9

Capítulo 4 Vectores y Matrices (arrays)

4.1 Introducción.

Una matriz (array) es una colección o conjunto de datos numéricos o de cadena que tienen el
mismo nombre de variable. Un array puede ser de una dimensión (vector) o de dos
dimensiones (matriz). En raras ocasiones se necesita usar un array de 3 dimensiones o más.

Las variables de tipo Array tienen un uso extraordinario en la solución de algoritmos, que si no
existiera este tipo de datos, probablemente habrían problemas que no pudieran resolverse con
programación.

Los vectores también se les conoce como listas porque tienen una dimensión. Un array
unidimensional es una lista de un número finito de datos (elementos) del mismo tipo que se
identifican por un nombre común y un número de orden. Las variables que representan los
arrays se denominan variables con subíndice. Cada elemento puede contener un dato
numérico o de cadena y se puede manipular de igual forma que cualquier otra variable.

La dimensión de un vector es el número de elementos que componen el vector. En el caso de


un vector de nombre dato y que conste de n elementos se representa de la siguiente manera.

En algebra: dato0, dato1, dato2 ,…, daton,

En programación: dato(0), dato(1), dato(2), …, dato(n)

Donde dato es el nombre del vector y 0, 1, 2,…,n es el subíndice o índice de cada elemento
del vector. Todos los elementos son del mismo tipo (numérico o de cadena) y el vector tiene
un nombre único, con elementos ordenados de acuerdo al índice.

4.2 Dimensión de un vector.

La dimensión de un vector es el número de elementos que contiene el vector. La declaración


de un vector es la operación consistente en la asignación de nombre, número máximo de
elementos del vector y tipo de datos que almacenará. La declaración se realiza con la
sentencia Dim. La sintaxis es la siguiente:

Dim variable[(dimensión)] [As tipo] [, variable[(dimensión)] [As tipo]]…

Donde:

• Variable es un identificador para darle el nombre de la matriz.

• Dimensión es el número máximo de elementos del vector, se puede usar la forma [valor
inferior To valor superior]. Si la dimensión queda en blanco, entonces se trata de array
dinámico

• As tipo define el tipo de la variable (Byte, Integer, Long, Single, Double o String)

Por ejemplo la siguiente línea de código: Dim dato(3) As Integer, siendo los elementos del
vector dato(0), dato(1), dato(2), dato(3).

Consideraciones importantes al declarar un vector.


48
• El nombre del vector puede ser cualquier identificador válido, para una variable
numérica o de cadena.

• Los elementos del vector pueden ser tratados de igual forma que otras variables.

• El valor mínimo del subíndice del vector es 0, a menos que se use la sentencia Option
Base en la cabecera del proyecto, o bien usando la palabra clave To para dimensionar
el vector (valor inferior To valor superior).

• Para el valor del subíndice se puede usar una constante, una variable o una expresión
válida, tanto al declarar la variable, como al momento de hacer uso de algún elemento
del vector.

• En el subíndice del vector puede usarse números fraccionarios y números enteros


negativos, sin embargo es preferible usar enteros positivos. Si se usa números
fraccionarios se redondeará al entero más próximo.

• En el momento de declarar una variable de tipo array, los elementos de los vectores
tienen el valor de cero en el caso de vectores numéricos y cadena nula en el caso de
vectores de cadena.

• No es posible declarar los vectores con el caracter %, $, &.

Ejemplos

Dim dia(4) as Integer

Establece un vector llamado dia con 5 elementos de números enteros y como no se le han
asignado valores, el valor inicial del vector en la memoria es:

Elemento Valor inicial


dia(0) 0
dia(1) 0
dia(2) 0
dia(3) 0
dia(4) 0

Se pueden asignar valores a los elementos de un vector de diferentes formas en el cuerpo del
programa, por ejemplo:

dia(0) = 100
dia(1) = 200
For i = 2 To 4
dia(i) = 100 + i * 100
Next i

Entonces los nuevos valores en la memoria serán:


49
Elemento Valor inicial
dia(0) 100
dia(1) 200
dia(2) 300
dia(3) 400
dia(4) 500

Si se intenta utilizar un elemento de la variable dia con un subíndice menor que cero o superior
a 4, se producirá un error en el momento de la ejecución de la línea que contenga a ese
elemento: “Subíndice fuera del intervalo”

Se sugiere la lector que utilice la tecla f8, para ejecutar paso a paso el procedimiento y colocar
el cursor en la variable i y en la variable dia(2) para observar el valor del elemento que se está
asignando cada vez que se presiona f8.

4.3 Sentencia Option Base

VBA comienza la numeración de las variables tipo array con el subíndice 0, como ya se ha
mencionado. Sin embargo utilizando la sentencia Option Base, es posible modificar el valor
inicial del subíndice para que comience con el número 1. Esta sentencia se coloca como
segunda línea de programación en el editor de VBA.

Ejemplo 4.1

Procedimiento para introducir por medio del teclado calificaciones y calcular el promedio de
ellas.

Option Explicit
Option Base 1
Public Sub Calcula_Promedio()
Dim Calificacion(6) As Integer, i As Integer
Dim Suma As Integer, Promedio As Single
For i = 1 To 6
Calificacion(i) = InputBox("Calificación " & i & "=")
Suma = Suma + Calificacion(i)
Next i
Promedio = Suma / 6
MsgBox "El Promedio de las seis calificaciones es " & Promedio
End Sub
Código 4.1 del ejemplo 4.1

Se declara la variable Calificacion para un subíndice máximo de 6, en el bucle For i, se solicita


que se introduzca con la sentencia InputBox, por medio del teclado la calificación, guardándose
en la variable Calificacion(1), Calificacion(2),…,Calificacion(6) y se realiza dentro del bucle la

50
suma de las calificaciones para que fuera del bucle se calcule el promedio e imprima en una
caja de mensaje.

Ejemplo 4.2

Ejemplo utilizando vectores de cadena.

Option Explicit
Option Base 1
Sub Dia_de_la_Semana()
Dim Dia(7) As String
Dia(1) = "Lunes" ‘la asignación de una cadena debe estar entre comillas dobles
Dia(2) = "Martes"
Dia(3) = "Miércoles"
Dia(4) = "Jueves"
Dia(5) = "Viernes"
Dia(6) = "Sábado"
Dia(7) = "Domingo"
MsgBox “Dia = “ & Dia(7) ‘Despliega en la caja de mensaje Dia = Domingo
End Sub
Código 4.2 del ejemplo 4.2

Ejemplo 4.3

Segunda manera de realizar los mismo, pero con menos código de programación y que
conviene tomarlo en cuenta para elaborar procedimientos más laboriosos. Capturar la
información en una hoja de cálculo, para el siguiente procedimiento se obtiene la lista
personalizada de los días de la semana en el rango A1:A7

Sub Dia_de_la_Semana2()
Dim Dia (1 To 7) As String ‘Usando To, no se requiere Option Base 1
Dim i As Byte
For i = 1 To 7
Dia(i) = Cells(i, 1)
Next i
MsgBox “Dia = “ & Dia(6) ‘Despliega en la caja de mensaje Dia = Sábado
End Sub
Código 4.3 del ejemplo 4.3

51
Ejemplo 4.4

Tercera manera de realizar lo anterior, con la función Array de VBA. La variable Dia deberá
declararse sin la dimensión y de tipo Variant.

Option Base 1
Sub Dia_de_la_Semana3()
Dim Dia As Variant
Dia = Array("Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", Domingo")
MsgBox “Dia = “ & Dia(5) ‘Despliega en la caja de mensaje Dia = Viernes
End Sub
Código 4.4 del ejemplo 4.4

Ejemplo 4.5

La versatilidad del manejo de un array en VBA es extraordinaria, se usará una cuarta forma
de hacer lo mismo para este ejercicio, usando el objeto WorksheetFunction y la función
transponer. Suponiendo que los días de la semana están en el rango A1:A7

Sub Dia_de_la_Semana4()
Dim Dia As Variant ‘se declara la variable de tipo variante
‘se utiliza la función integrada de Excel, Transponer
Dia = WorksheetFunction.Transpose(Range("A1:A7"))
MsgBox "Dia = " & Dia(4) ‘Despliega en la caja de mensaje Dia = Jueves
End Sub
Código 4.5 del ejemplo 4.5

4.3 Funciones LBound y UBound

Las funciones LBound y UBound se utilizan para manipular el valor inferior y superior del
subíndice del array, cuando el número de elementos es variable.

Ejemplo 4.6

Suponiendo que en la columna B de la hoja1 de la figura 4.1, se tienen datos numéricos que
varía la cantidad de elementos de los mismos y que se requiere calcular el valor máximo de
los datos, el procedimiento podría ser el siguiente.

Sub Calcula_Maximo()
Dim Clientes As Variant, i%, Estados%, Maxi%
Dim Rango As String
‘cuenta el número de celdas no vacías de la columna B
Estados = WorksheetFunction.CountA(Columns("B"))
Rango = "B2:B" & Estados ‘se utiliza un rango variable

52
'Guarda los datos en la variable clientes
Clientes = WorksheetFunction.Transpose(Range(Rango))
For i = LBound(Clientes) To UBound(Clientes)
If Clientes(i) > Maxi Then Maxi = Clientes(i)
Next i
MsgBox "El valor máximo es " & Maxi
End Sub
Código 4.6 del ejemplo 4.6

Figura 4.1 Datos y resultados obtenidos del ejemplo 4.6

4.4 Métodos de ordenación.

Ejemplo 4.7 Método de ordenación de la burbuja.

Consiste en revisar cada dato de la lista que va a ser ordenada de menor a mayor, comparando
el dato posterior con el dato anterior e intercambiando de posición si es necesario. Esto se
realiza por medio de pasadas hasta que la lista queda ordenada.

En la pasada j = 1 se compara el dato 2 con el dato 1, si el dato 2 es menor que el dato 1, se


intercambia de posición, luego se compara el dato 3 con el dato 2 y así sucesivamente se
compara el dato n con el dato n - 1, intercambiando de posición si es necesario.

Ordenar los siguientes 5 datos.

Dato(1) = 25
Dato(2) = 20
Dato(3) = 15
Dato(4) = 10
Dato(5) = 5

Utilizar la variable i para las comparaciones y la variable j para el número de pasadas:

53
Pasada j = 1
i=1 i=2 i=3 i=4
Dato(1) = 25 20 20 20 20
Dato(2) = 20 25 15 15 15
Dato(3) = 15 15 25 10 10
Dato(4) = 10 10 10 25 5
Dato(5) = 5 5 5 5 25

Al final de la pasada j = 1 el mayor de los números estará en la posición n = 5. Por esta razón
en la pasada j = 2, disminuir el número de comparaciones a i = 3.

Pasada j = 2
i=1 i=2 i=3
Dato(1) = 20 15 15 15
Dato(2) = 15 20 10 10
Dato(3) = 10 10 20 5
Dato(4) = 5 5 5 20
Dato(5) = 25 25 25 25

Al final de la pasada j = 2, el número 20 estará en la posición n = 4. Por esta razón en la


pasada j = 3, disminuir el número de comparaciones a i = 2.

Pasada j = 3
i=1 i=2
Dato(1) = 15 10 10
Dato(2) = 10 15 5
Dato(3) = 5 5 15
Dato(4) = 20 20 20
Dato(5) = 25 25 25

Al final de la pasada j = 3, el número 15 estará en la posición n = 3. Por esta razón en la


pasada j = 4, disminuir el número de comparaciones a i = 1.

Pasada j = 4
i=1
Dato(1) = 10 5
Dato(2) = 5 10
Dato(3) = 15 15
Dato(4) = 20 20
Dato(5) = 25 25

54
Sub ORDENACION_POR_BURBUJA()
Dim Dato(16) As Integer, i%, j%, Cambio%, n%
n = 16
For i = 1 To n
Dato(i) = Cells(i, 1)
Next i
For j = 1 To n - 1 'hasta n - 1 pasadas
For i = 1 To n - j 'hasta n - j comparaciones
If Dato(i + 1) < Dato(i) Then
Cambio = Dato(i): Dato(i) = Dato(i + 1): Dato(i + 1) = Cambio
End If
Next i
Next j
For i = 1 To n
Cells(i, 2) = Dato(i)
Next i
End Sub
Código 4.7 Ordenación por el método de la burbuja

4.5 Matrices dinámicas.

En muchas ocasiones no es posible saber el tamaño de la dimensión de una matriz, en estos


casos se puede utilizar una matriz dinámica, que es aquella que no tiene un tamaño
establecido y se declara la matriz pero con los paréntesis vacíos.

Dim Matriz() As Double

Posteriormente cuando el programa tenga que dimensionarse, se recurre a la sentencia


Redim para establecer el tamaño. Se puede utilizar una variable para asignar el número de
elementos en una matriz. Generalmente el valor de la variable no se conoce hasta que se
ejecuta el procedimiento. Por ejemplo si la variable Total adquiere el valor de 20, se puede
definir el tamaño de la matriz mediante la siguiente declaración:

ReDim Matriz(Total) ‘El tamaño de la matriz será de 21 elementos

Se puede usar ReDim cuantas veces sea necesario, cambiando el tamaño de la matriz cada
vez. Al cambiar las dimensiones de la matriz, los valores existentes son destruidos. Para
conservarlos se utiliza la sentencia ReDim Preserve.

ReDim Preserve Matriz(Total)

Ejemplo 4.8

Programa que lee 10 textos que se encuentran en la hoja de cálculo como se muestra en la
figura 4.2 y se desea determinar la suma de caracteres de las 10 carreras. Considerando que
55
este ejemplo no tiene un sentido práctico, pero la idea es que el lector adquiera los
conocimientos de programación y que los pueda aplicar a sus necesidades.

Sub Matriz_Dinamica()
Dim Carrera() As String, Lista As Variant
Dim Total%, i%, Suma%
Total = InputBox("Número de carreras ")
ReDim Carrera(1 To Total)
For i = 1 To Total 'Lee los datos
Carrera(i) = Cells(i + 1, 1)
Next i
For Each Lista In Carrera 'Suma los caracteres
Suma = Suma + Len(Lista)
Next Lista
MsgBox Suma
End Sub
Código 4.8 del ejemplo 4.8

Figura 4.2 Datos del ejemplo 4.8

56

También podría gustarte