1 VBA - Procedimientos Subprogramas (Procedimientos): Procedimientos Sub Procedimientos Function.
-
Upload
genoveva-colon -
Category
Documents
-
view
235 -
download
0
Transcript of 1 VBA - Procedimientos Subprogramas (Procedimientos): Procedimientos Sub Procedimientos Function.
1
VBA - ProcedimientosVBA - 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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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.
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
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
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
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
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.
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.
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
Clase 1026
Ejemplo 3Ejemplo 3 Realizar un programa en VB que permita
multiplicar dos matrices y mostrar el resultado.
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.
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