290 likes | 583 Views
VBA - Procedimientos. Subprogramas (Procedimientos): Procedimientos Sub Procedimientos Function. Subprogramas. 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 procedimientos o subrutinas .
E N D
VBA - Procedimientos Subprogramas (Procedimientos): Procedimientos Sub Procedimientos Function
Subprogramas • 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 procedimientos o subrutinas. • 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. Clase 10
Subprogramas • 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 Clase 10
Crear procedimientos • 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 Sub que no devuelven un valor. • Procedimientos Function que devuelven un valor. Clase 10
Procedimientos Sub • Los procedimientos Sub no devuelven un valor. • Sintaxis: AlcanceSubNombreProc(parámetros) CuerpoProcedimiento End Sub • Alcance: Opcional. Es el alcance del procedimiento. Puede ser Private o Public. Si no se especifica se asume Public. • NombreProc: Requerido. Es el nombre del procedimiento. Clase 10
Procedimientos Sub • parámetros: Opcional. Son los parámetros del procedimiento. (Véase más adelante). • CuerpoProcedimiento: Opcional. Son las instrucciones que conforman al procedimiento. • Cada vez que se llama al procedimiento se ejecutan las instrucciones que hay entre Sub y End Sub. • El cuerpo del procedimiento puede tener instrucciones Exit Sub, 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. Clase 10
Procedimientos Sub • Existen dos tipos de procedimientos Sub: 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_nombreEvento • Ejemplo: Command1_Click(), Form_Load(), Form_Resize() • Un procedimiento general indica a la aplicación cómo realizar una tarea específica. Clase 10
Procedimientos Function • Son procedimientos que devuelven un valor. • Sintaxis: AlcanceFunctionNombreProc(parámetros) As Tipo CuerpoProcedimiento End Function • Alcance: Opcional. Es el alcance del procedimiento. Puede ser Private o Public. Si no se especifica se asume Public. • NombreProc: Requerido. Es el nombre del procedimiento. Clase 10
Procedimientos Function • parámetros: Opcional. Son los parámetros del procedimiento. (Véase más adelante). • CuerpoProcedimiento: Opcional. Son las instrucciones que conforman al procedimiento. Puede tener instrucciones Exit Function. • Tipo: Es el tipo de dato que retorna el procedimiento. • El valor que retorna un procedimiento Function se le debe asignar al nombre del procedimiento, en caso contrario se retorna el valor por defecto. Clase 10
Argumentos vs Parámetros • Los argumentos pueden ser constantes, variables o expresiones pasadas a un procedimiento. • Ejemplo: en la expresión: X = Sqr(15), el valor 15 corresponde al argumento pasado a la función Sqr 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. Clase 10
Declaración de Argumentos • 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: [Optional] [ByVal | ByRef] [ParamArray] nombre_variable[( )] [Astipo] [= valor_predeterminado] • En la sintaxis, los corchetes ([]) significan que la expresión es opcional y la barra vertical (|) significa exclusión lógica. Clase 10
Declaración de Argumentos • La palabra clave Optional 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 Optional. • Optional no se puede utilizar en la declaración de un argumento si se usa la palabra clave ParamArray. • ByValindica 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. Clase 10
Declaración de Argumentos • ByRef 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. • ByRef es el modo predeterminado en Visual Basic. • La palabra clave ParamArray 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 Optional de elementos tipo Variant. • No se puede utilizar con ByVal, ByRef u Optional. Clase 10
Declaración de Argumentos • nombre_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. • tipo es el tipo de dato del parámetro. Si no se especifica se asume Variant. • valor_predeterminado es una expresión constante correspondiente al valor por defecto para parámetros opcionales. Sólo es válido para parámetros Optional. Clase 10
Llamar procedimientos • Los procedimientos se pueden llamar de varias formas: • Utilizando el nombre y lista de argumentos • Utilizando la instrucción Call • En una expresión (sólo procedimientos Function) Utilizando el nombre y lista de argumentos: nombre_procedimiento arg1,arg2,…,argN • En este caso, no se debe utilizar paréntesis después del nombre del procedimiento. • Si el procedimiento retorna un valor, este se pierde. • Útil para procedimientos Sub. • Ejemplo: Sqr 15 Clase 10
Llamar procedimientos Utilizando la instrucción Call: Call nombre_procedimiento(arg1,arg2,…,argN) • En este caso, se debe utilizar paréntesis después del nombre del procedimiento. • Si el procedimiento retorna un valor, este se pierde. • Útil para procedimientos Sub. • Ejemplo: CallSqr(15) Clase 10
Llamar procedimientos En una expresión: nombre_procedimiento(arg1,arg2,…,argN) • En este caso, se debe utilizar paréntesis después del nombre del procedimiento. • Sólo es válido para procedimientos Function. • Ejemplos: X = Sqr(15) Y = Abs(10 * X – Atn(2)) Clase 10
Ejemplo 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. Clase 10
Ejemplo 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 Clase 10
Ejemplo 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 Clase 10
Ejemplo 1: Implementación • Procedimiento genérico para leer una matriz: Public Sub LeerMatriz(A() As Single, N As Integer, _ M As Integer) Dim I As Integer N = Val(InputBox("Número de Filas:")) M = Val(InputBox("Número de Columnas:")) ReDim A(1 To N, 1 To M) For I = 1 To N For J = 1 To M A(I, J) = Val(InputBox("Ingrese elemento(" & _ I & ", " & J & "):")) Next J Next I End Sub Clase 10
Ejemplo 1: Implementación • Procedimiento genérico para mostrar una matriz: Public Sub MostrarMatriz(A() As Single, ByVal N As Integer, _ ByVal M As Integer, txt As TextBox) Dim I As Integer txt.Text = "" For I = 1 To N For J = 1 To M txt.Text = txt.Text & A(I, J) & vbTab Next J txt.Text = txt.Text & vbCrLf Next I End Sub Clase 10
Ejemplo 2 • Realizar un procedimiento que permita multiplicar dos matrices: Una matriz A de orden mxn y una matriz B de orden pxq. • Nota: Las matrices se pueden multiplicar si y sólo si n=p. El orden de la matriz resultante es mxq. Clase 10
Ejemplo 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. Clase 10
Ejemplo 2: Implementación • Procedimiento para multiplicar dos matrices: Public Function MultMat(A() As Single, B() As Single, _ ByVal N1 As Integer, ByVal M1 As Integer, _ ByVal N2 As Integer, ByVal M2 As Integer, _ C() As Single) As Boolean Dim I As Integer, J As Integer, K As Integer, Sum As Single If M1 <> N2 Then MultMat = False: Exit Function ReDim C(1 To N1, 1 To M2) For I = 1 To N1 For J = 1 To M2 Sum = 0 For K = 1 To M1 Sum = Sum + A(I, K) * B(K, J) Next K C(I, J) = Sum Next J Next I MultMat = True End Sub
Ejemplo 3 • Realizar un programa en VB que permita multiplicar dos matrices y mostrar el resultado. Clase 10
Ejemplo 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. Clase 10
Ejemplo 3: Implementación 'En el evento Click de un botón de Comando. Dim M1() As Single, M2() As Single, M3() As Single Dim N As Integer, M As Integer, P As Integer, Q As Integer Call LeerMatriz(M1, N, M) Call LeerMatriz(M2, P, Q) If (MultMat(M1, M2, N, M, P, Q, M3)) Then MostrarMatriz M3, UBound(M3, 1), UBound(M3, 2), Text1 Else MsgBox "No se puede multiplicar las matrices: " & _ "El número de columnas de la primera matriz es " & _ "diferente al número de filas de la segunda " & _ "matriz.", vbExclamation, "Error" End If