lunes, 16 de noviembre de 2009

Pasar matrices a una función

Pasar matrices a una función en programación de macros para Excel es de lo que nos vamos a ocupar en este Post. También veremos el caso en el que la función devuelve una matriz. Disponemos de un procedimiento (Sub) que llama a una función (Function), la cual devuelve o bien un valor, o bien una matriz.
Primer caso
La función recibe una matriz y devuelve un único valor.
Código:
Sub principal()
Dim A(2)
A(1) = 1
A(2) = 2
MsgBox sumatorio(A)
End Sub

Private Function sumatorio(B)
Dim s
s = B(1) + B(2)
sumatorio = s
End Function
Segundo caso
La función no recibe nada y devuelve una matriz.
Es importante definir la función Genera escribiendo el tipo y unos paréntesis detras del tipo de variable:
Function Genera() As Byte()
Estos últimos paréntesis son imprescindibles.
Código:
Sub Ejecuta()
Dim Z() As Byte
Z = Genera()
MsgBox (Z(1) & ", " & Z(2))
End Sub

Private Function Genera() As Byte()
Dim A(2) As Byte
A(1) = 1: A(2) = 2
Genera = A
End Function
Otro ejemplo que se ajustaría a este segundo caso se da cuando se pide a la matriz que genere ciertos números aleatorios. Por ejemplo, la función podría generar números aleatorios sin repetición en cierto rango de valores enteros.
Tercer caso
La función recibe una matriz y devuelve otra matriz.
Código:
Sub Transforma()
Dim Z() As Byte
Dim p, q
p = 4: q = 5
Z = Dobla(p, q)
MsgBox (Z(1) & ", " & Z(2))
End Sub

Private Function Dobla(x, y) As Byte()
Dim A(2) As Byte
A(1) = x * 2
A(2) = y * 2
Dobla = A
End Function

2 comentarios:

  1. No entendí nada :(

    Yo tengo una matriz en una planilla, y en otra planilla tengo 2 listados... ¿qué fórmula tengo que aplicar para que a partir de la info en el listado 1 y en el listado 2, me dé el valor correspondiente en la matriz?

    ¡Gracias!

    ResponderEliminar
  2. hola..estaba viendo el ejemplo y si me funciona en excel....ahora tengo una duda...por que este ejemplo no funciona...ya que al ejecutarlo me aparece el error #!valor

    Function NumeroFilas(B)
    NumeroFilas = UBound(B, 1)
    End Function

    agradeceria una respuesta...intente de varias formas y siempre tengo el mismo error

    ResponderEliminar