28
1 VBA - Procedimientos VBA - Procedimientos Subprogramas (Procedimientos): Procedimientos Sub Procedimientos Function

1 VBA - Procedimientos Subprogramas (Procedimientos): Procedimientos Sub Procedimientos Function

Embed Size (px)

Citation preview

Page 1: 1 VBA - Procedimientos Subprogramas (Procedimientos): Procedimientos Sub Procedimientos Function

1

VBA - ProcedimientosVBA - Procedimientos

Subprogramas (Procedimientos): Procedimientos Sub Procedimientos Function

Page 2: 1 VBA - Procedimientos Subprogramas (Procedimientos): Procedimientos Sub Procedimientos Function

Clase 102

Para simplificar las tareas de programación se dividen los programas en componentes lógicos más pequeños.

Estos componentes lógicos se denominan procedimientosprocedimientos o subrutinassubrutinas.

Los procedimientos resultan muy útiles para condensar las tareas repetitivas o compartidas, como cálculos utilizados frecuentemente, manipulación de texto y controles, operaciones con bases de datos, etc.

SubprogramasSubprogramas

Page 3: 1 VBA - Procedimientos Subprogramas (Procedimientos): Procedimientos Sub Procedimientos Function

Clase 103

Ya se han utilizado algunos tipos de subprogramas: Funciones de la librería estándar de VB: Val(), Str(),

Sqr(), Atn(), Abs(), etc. Otras funciones: MsgBox(), InputBox(), etc. Métodos propios de algunos controles: Clear, AddItem,

Scale, Cls, Line, Circle, etc. Procedimientos asociados a eventos:

Private Sub Command1_Click()

End Sub

SubprogramasSubprogramas

Page 4: 1 VBA - Procedimientos Subprogramas (Procedimientos): Procedimientos Sub Procedimientos Function

Clase 104

Un procedimiento siempre se define a nivel de módulo (estándar o de formulario). Por lo tanto, un procedimiento no se puede anidar dentro de otro procedimiento.

Todo el código ejecutable de un programa en VB debe estar contenido en uno o varios procedimientos.

En VB se utilizan varios tipos de procedimientos: Procedimientos SubSub que no devuelven un valor. Procedimientos FunctionFunction que devuelven un valor.

Crear procedimientosCrear procedimientos

Page 5: 1 VBA - Procedimientos Subprogramas (Procedimientos): Procedimientos Sub Procedimientos Function

Clase 105

Los procedimientos Sub no devuelven un valor. Sintaxis:

AlcanceAlcance SubSub NombreProcNombreProc((parámetrosparámetros))

CuerpoProcedimientoCuerpoProcedimiento

End SubEnd Sub AlcanceAlcance: Opcional. Es el alcance del procedimiento. Puede

ser PrivatePrivate o PublicPublic. Si no se especifica se asume PublicPublic.

NombreProcNombreProc: Requerido. Es el nombre del procedimiento.

Procedimientos SubProcedimientos Sub

Page 6: 1 VBA - Procedimientos Subprogramas (Procedimientos): Procedimientos Sub Procedimientos Function

Clase 106

parámetrosparámetros: Opcional. Son los parámetros del procedimiento. (Véase más adelante).

CuerpoProcedimientoCuerpoProcedimiento: Opcional. Son las instrucciones que conforman al procedimiento.

Cada vez que se llama al procedimiento se ejecutan las instrucciones que hay entre SubSub y End SubEnd Sub.

El cuerpo del procedimiento puede tener instrucciones Exit Exit SubSub, la cual permite salir de inmediato del procedimiento. La ejecución del programa continúa con la instrucción que sigue

a la instrucción que llamó el procedimiento Sub.

Procedimientos SubProcedimientos Sub

Page 7: 1 VBA - Procedimientos Subprogramas (Procedimientos): Procedimientos Sub Procedimientos Function

Clase 107

Existen dos tipos de procedimientos SubSub: Procedimientos Generales y Procedimientos de Eventos.

Un procedimiento de evento es un procedimiento que hace referencia a un evento de un objeto. Siempre el nombre de un procedimiento de evento se compone por el nombre del objeto, seguido de un subrayado, seguido del nombre del evento:

nombreObjeto_nombreEventonombreObjeto_nombreEvento Ejemplo: Command1_Click(), Form_Load(), Form_Resize() Un procedimiento general indica a la aplicación cómo

realizar una tarea específica.

Procedimientos SubProcedimientos Sub

Page 8: 1 VBA - Procedimientos Subprogramas (Procedimientos): Procedimientos Sub Procedimientos Function

Clase 108

Son procedimientos que devuelven un valor. Sintaxis:

AlcanceAlcance FunctionFunction NombreProc(parámetros) As TipoNombreProc(parámetros) As Tipo

CuerpoProcedimientoCuerpoProcedimiento

End FunctionEnd Function AlcanceAlcance: Opcional. Es el alcance del procedimiento. Puede

ser PrivatePrivate o PublicPublic. Si no se especifica se asume PublicPublic.

NombreProcNombreProc: Requerido. Es el nombre del procedimiento.

Procedimientos FunctionProcedimientos Function

Page 9: 1 VBA - Procedimientos Subprogramas (Procedimientos): Procedimientos Sub Procedimientos Function

Clase 109

parámetrosparámetros: Opcional. Son los parámetros del procedimiento. (Véase más adelante).

CuerpoProcedimientoCuerpoProcedimiento: Opcional. Son las instrucciones que conforman al procedimiento. Puede tener instrucciones Exit FunctionExit Function.

TipoTipo: Es el tipo de dato que retorna el procedimiento. El valor que retorna un procedimiento FunctionFunction se le

debedebe asignar al nombre del procedimiento, en caso contrario se retorna el valor por defecto.

Procedimientos FunctionProcedimientos Function

Page 10: 1 VBA - Procedimientos Subprogramas (Procedimientos): Procedimientos Sub Procedimientos Function

Clase 1010

Los argumentos pueden ser constantes, variables o expresiones pasadas a un procedimiento.

Ejemplo: en la expresión: X = Sqr(15)X = Sqr(15), el valor 1515 corresponde al argumento pasado a la función SqrSqr de la librería estándar de VB.

El parámetro es el nombre de variable por el cual un argumento de procedimiento se conoce dentro del procedimiento. Esta variable recibe el argumento que se pasa dentro del procedimiento. Su alcance es local, es decir, el alcance termina cuando el procedimiento finaliza.

Argumentos vs ParámetrosArgumentos vs Parámetros

Page 11: 1 VBA - Procedimientos Subprogramas (Procedimientos): Procedimientos Sub Procedimientos Function

Clase 1011

Los parámetros de un procedimiento corresponde a una lista de variables (separadas por comas) que representan los argumentos que se pasan a un procedimiento cuando se le llama.

La declaración de argumentos (parámetros) de un procedimiento tiene la siguiente sintaxis:

[OptionalOptional] [ByValByVal | ByRefByRef] [ParamArrayParamArray] nombre_variablenombre_variable[( )] [AsAs tipotipo]

[= valor_predeterminadovalor_predeterminado] En la sintaxis, los corchetes ([]) significan que la expresión

es opcionalopcional y la barra vertical (|) significa exclusión lógica.

Declaración de ArgumentosDeclaración de Argumentos

Page 12: 1 VBA - Procedimientos Subprogramas (Procedimientos): Procedimientos Sub Procedimientos Function

Clase 1012

La palabra clave OptionalOptional indica que no se requiere el argumento. Si se usa, todos los parámetros subsiguientes también deben ser opcionales y declararse mediante la palabra clave OptionalOptional.

OptionalOptional no se puede utilizar en la declaración de un argumento si se usa la palabra clave ParamArrayParamArray.

ByValByVal indica que el argumento se pasa por valor, es decir, se pasa su valor (una copia de la variable) en vez de su dirección. Como resultado, el valor actual de la variable no puede ser cambiado por el procedimiento al cual se pasa.

Declaración de ArgumentosDeclaración de Argumentos

Page 13: 1 VBA - Procedimientos Subprogramas (Procedimientos): Procedimientos Sub Procedimientos Function

Clase 1013

ByRefByRef indica que el argumento se pasa por referencia, es decir, se pasa su dirección en vez de su valor. Como resultado, el valor real de la variable puede ser cambiado por el procedimiento al cual se pasa.

ByRefByRef es el modo predeterminado en Visual Basic. La palabra clave ParamArrayParamArray permite proporcionar un

número arbitrario de argumentos. Sólo se puede utilizar en el último parámetro para indicar que el argumento final es una array OptionalOptional de elementos tipo VariantVariant.

No se puede utilizar con ByValByVal, ByRefByRef u OptionalOptional.

Declaración de ArgumentosDeclaración de Argumentos

Page 14: 1 VBA - Procedimientos Subprogramas (Procedimientos): Procedimientos Sub Procedimientos Function

Clase 1014

nombre_variablenombre_variable es el nombre del parámetro. Los paréntesis al final del nombre de la variable significan

que el parámetro recibe un array. No se debe especificar tamaño ni número de dimensiones del array, sólo se colocan los paréntesis vacíos.

tipotipo es el tipo de dato del parámetro. Si no se especifica se asume VariantVariant.

valor_predeterminadovalor_predeterminado es una expresión constante correspondiente al valor por defecto para parámetros opcionales. Sólo es válido para parámetros OptionalOptional.

Declaración de ArgumentosDeclaración de Argumentos

Page 15: 1 VBA - Procedimientos Subprogramas (Procedimientos): Procedimientos Sub Procedimientos Function

Clase 1015

Los procedimientos se pueden llamar de varias formas:1. Utilizando el nombre y lista de argumentos

2. Utilizando la instrucción CallCall

3. En una expresión (sólo procedimientos FunctionFunction)

Utilizando el nombre y lista de argumentos:Utilizando el nombre y lista de argumentos:

nombre_procedimiento arg1,arg2,…,argNnombre_procedimiento arg1,arg2,…,argN En este caso, no se debeno se debe utilizar paréntesis después del nombre

del procedimiento. Si el procedimiento retorna un valor, este se pierde. Útil para procedimientos SubSub. Ejemplo: Sqr 15Sqr 15

Llamar procedimientosLlamar procedimientos

Page 16: 1 VBA - Procedimientos Subprogramas (Procedimientos): Procedimientos Sub Procedimientos Function

Clase 1016

Utilizando la instrucción Call:Utilizando la instrucción Call:

CallCall nombre_procedimiento(arg1,arg2,…,argN) nombre_procedimiento(arg1,arg2,…,argN) En este caso, se debese debe utilizar paréntesis después del nombre del

procedimiento. Si el procedimiento retorna un valor, este se pierde. Útil para procedimientos SubSub. Ejemplo: CallCall Sqr(15)Sqr(15)

Llamar procedimientosLlamar procedimientos

Page 17: 1 VBA - Procedimientos Subprogramas (Procedimientos): Procedimientos Sub Procedimientos Function

Clase 1017

En una expresión:En una expresión:

nombre_procedimiento(arg1,arg2,…,argN)nombre_procedimiento(arg1,arg2,…,argN) En este caso, se debese debe utilizar paréntesis después del nombre del

procedimiento. Sólo es válido para procedimientos FunctionFunction. Ejemplos:

X = Sqr(15)X = Sqr(15)

Y = Abs(10 * X – Atn(2))Y = Abs(10 * X – Atn(2))

Llamar procedimientosLlamar procedimientos

Page 18: 1 VBA - Procedimientos Subprogramas (Procedimientos): Procedimientos Sub Procedimientos Function

Clase 1018

Ejemplo 1Ejemplo 1 Realizar un procedimiento genérico que

permita leer una matriz por el teclado de elementos reales.

Realizar un procedimiento genérico que permita mostrar una matriz de elementos reales en una caja de texto.

Page 19: 1 VBA - Procedimientos Subprogramas (Procedimientos): Procedimientos Sub Procedimientos Function

Clase 1019

Ejemplo 1: AnálisisEjemplo 1: Análisis Un procedimiento genérico para leer una

matriz necesita: Un parámetro que recibe la matriz de tipo real

simple: A() As Single Un parámetro por referencia, de tipo entero,

para el número de filas: N As Integer Un parámetro por referencia, de tipo entero,

para el número de columnas: M As Integer

Page 20: 1 VBA - Procedimientos Subprogramas (Procedimientos): Procedimientos Sub Procedimientos Function

Clase 1020

Ejemplo 1: AnálisisEjemplo 1: Análisis Un procedimiento genérico para mostrar

una matriz en una caja de texto necesita: Un parámetro que recibe la matriz de tipo real

simple: A() As Single Un parámetro por valor, de tipo entero, para el

número de filas: ByVal N As Integer Un parámetro por valor, de tipo entero, para el

número de columnas: ByVal M As Integer Un parámetro con la referencia de la caja de

texto: txt As TextBox

Page 21: 1 VBA - Procedimientos Subprogramas (Procedimientos): Procedimientos Sub Procedimientos Function

Clase 1021

Ejemplo 1: ImplementaciónEjemplo 1: Implementación Procedimiento genérico para leer una matriz:

Public SubPublic Sub LeerMatriz(A() LeerMatriz(A() As SingleAs Single, N , N As IntegerAs Integer, _, _ M M As IntegerAs Integer))

Dim Dim I I As IntegerAs IntegerN = Val(InputBox("Número de Filas:"))N = Val(InputBox("Número de Filas:"))M = Val(InputBox("Número de Columnas:"))M = Val(InputBox("Número de Columnas:"))ReDimReDim A(1 A(1 ToTo N, 1 N, 1 ToTo M) M)ForFor I = 1 I = 1 ToTo N N ForFor J = 1 J = 1 ToTo M M

A(I, J) = Val(InputBox("Ingrese elemento(" & _A(I, J) = Val(InputBox("Ingrese elemento(" & _ I & ", " & J & "):"))I & ", " & J & "):"))

NextNext J JNextNext I I

End SubEnd Sub

Page 22: 1 VBA - Procedimientos Subprogramas (Procedimientos): Procedimientos Sub Procedimientos Function

Clase 1022

Ejemplo 1: ImplementaciónEjemplo 1: Implementación Procedimiento genérico para mostrar una matriz:

Public SubPublic Sub MostrarMatriz(A() MostrarMatriz(A() As SingleAs Single, , ByValByVal N N As IntegerAs Integer, _, _

ByValByVal M M As IntegerAs Integer, txt, txt As TextBox As TextBox))

Dim Dim I I As IntegerAs Integer

txt.Text = ""txt.Text = ""

ForFor I = 1 I = 1 ToTo N N

ForFor J = 1 J = 1 ToTo M M

txt.Text = txt.Text & A(I, J) & vbTabtxt.Text = txt.Text & A(I, J) & vbTab

NextNext J J

txt.Text = txt.Text & vbCrLftxt.Text = txt.Text & vbCrLf

NextNext I I

End SubEnd Sub

Page 23: 1 VBA - Procedimientos Subprogramas (Procedimientos): Procedimientos Sub Procedimientos Function

Clase 1023

Ejemplo 2Ejemplo 2 Realizar un procedimiento que permita

multiplicar dos matrices:

Una matriz AA de orden mmxxnn y una matriz BB de orden ppxxqq.

Nota: Las matrices se pueden multiplicar si y sólo si nn == pp. El orden de la matriz resultante es mmxxqq.

Page 24: 1 VBA - Procedimientos Subprogramas (Procedimientos): Procedimientos Sub Procedimientos Function

Clase 1024

Ejemplo 2: AnálisisEjemplo 2: Análisis Un procedimiento para multiplicar dos matrices

necesita: Dos parámetros que reciben las matrices de tipo real

simple: A() As Single, B() As Single Cuatro parámetros por valor, de tipo entero, para el

orden de cada matriz: N1 As Integer, M1 As Integer, N2 As Integer, M2 As Integer

Un parámetro que devuelve la matriz resultante: C() As Single

El procedimiento devolverá True si se realizó la multiplicación, en caso contrario devolverá False.

Page 25: 1 VBA - Procedimientos Subprogramas (Procedimientos): Procedimientos Sub Procedimientos Function

Clase 1025

Ejemplo 2: ImplementaciónEjemplo 2: Implementación Procedimiento para multiplicar dos matrices:

Public FunctionPublic Function MultMat(A() MultMat(A() As SingleAs Single, B() , B() As SingleAs Single, _, _ ByValByVal N1 N1 As IntegerAs Integer, , ByValByVal M1 M1 As IntegerAs Integer, _, _ ByValByVal N2 N2 As IntegerAs Integer, , ByVal ByVal M2M2 As Integer As Integer, _, _ C() C() As SingleAs Single) ) As BooleanAs Boolean

Dim Dim I I As IntegerAs Integer, J, J As Integer As Integer, K, K As Integer As Integer, Sum, Sum As Single As SingleIf If M1 <> N2M1 <> N2 Then Then MultMat = MultMat = FalseFalse: : Exit FunctionExit FunctionReDimReDim C(1 C(1 ToTo N1, 1 N1, 1 ToTo M2) M2)ForFor I = 1 I = 1 ToTo N1 N1 ForFor J = 1 J = 1 ToTo M2 M2 Sum = 0Sum = 0 ForFor K = 1 K = 1 ToTo M1 M1

Sum = Sum + A(I, K) * B(K, J)Sum = Sum + A(I, K) * B(K, J) NextNext K K C(I, J) = SumC(I, J) = Sum

NextNext J JNextNext I IMultMat = MultMat = TrueTrue

End SubEnd Sub

Page 26: 1 VBA - Procedimientos Subprogramas (Procedimientos): Procedimientos Sub Procedimientos Function

Clase 1026

Ejemplo 3Ejemplo 3 Realizar un programa en VB que permita

multiplicar dos matrices y mostrar el resultado.

Page 27: 1 VBA - Procedimientos Subprogramas (Procedimientos): Procedimientos Sub Procedimientos Function

Clase 1027

Ejemplo 3: AnálisisEjemplo 3: Análisis Un programa que permita multiplicar dos

matrices necesita: Leer las dos matrices Realizar la multiplicación Mostrar el resultado si la multiplicación fue posible, en

caso contrario, mostrar un mensaje descriptivo. El programa puede hacer uso de los

procedimientos definidos anteriormente, implementándolos en un módulo estándar.

Page 28: 1 VBA - Procedimientos Subprogramas (Procedimientos): Procedimientos Sub Procedimientos Function

Clase 1028

Ejemplo 3: ImplementaciónEjemplo 3: Implementación'En el evento Click de un botón de Comando.DimDim M1() M1() As SingleAs Single, M2() , M2() As SingleAs Single, M3() , M3() As SingleAs SingleDim Dim N N As IntegerAs Integer, M , M As IntegerAs Integer, P , P As IntegerAs Integer, Q, Q As Integer As IntegerCall Call LeerMatriz(M1, N, M)LeerMatriz(M1, N, M)Call Call LeerMatriz(M2, P, Q)LeerMatriz(M2, P, Q)If If (MultMat(M1, M2, N, M, P, Q, M3))(MultMat(M1, M2, N, M, P, Q, M3)) Then Then MostrarMatriz M3,MostrarMatriz M3, UBound UBound(M3, 1),(M3, 1), UBound UBound(M3, 2), Text1(M3, 2), Text1ElseElse MsgBox "No se puede multiplicar las matrices: " & _MsgBox "No se puede multiplicar las matrices: " & _ "El número de columnas de la primera matriz es " & _"El número de columnas de la primera matriz es " & _ "diferente al número de filas de la segunda " & _"diferente al número de filas de la segunda " & _ "matriz.", vbExclamation, "Error""matriz.", vbExclamation, "Error"End IfEnd If