Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
Capítulo Funciones personalizadas En este capítulo trataremos: Creación de funciones personalizadas con VBA Uso de controles ActiveX SENATI-Computación e Informática 229 ersonalizas Uso de módulos para Funciones Los módulos permiten dividir un programa muy grande en partes mucho más pequeñas y manejables. La división de un programa en unidades más pequeñas o funciones presenta –entre otras– las ventajas siguientes: Ventajas 1. Modularización Cada función tiene una misión muy concreta, de modo que nunca tiene un número de líneas excesivo y siempre se mantiene dentro de un tamaño manejable. Una misma función puede ser invocada muchas veces en un mismo programa, e incluso puede ser reutilizada por otros programas. Cada función puede ser desarrollada y comprobada por separado. 2. Ahorro de memoria y tiempo de desarrollo En la medida en que una misma función es utilizada muchas veces, el número total de líneas de código del programa disminuye, y también lo hace la probabilidad de introducir errores en el programa. 3. Independencia de datos y ocultamiento de información. Una de las fuentes más comunes de errores en los programas de computador son los efectos colaterales o perturbaciones que se pueden producir entre distintas partes del programa. Es muy frecuente que al hacer una modificación para añadir una funcionalidad o corregir un error, se introduzcan nuevos errores en partes del programa que antes funcionaban correctamente. Características Una función es capaz de mantener una gran independencia con el resto del programa, manteniendo sus propios datos y definiendo muy claramente la interfaz o comunicación con la función que la ha llamado y con las funciones a las que llama, y no teniendo ninguna posibilidad de acceso a la información que no le compete. La principal característica de una función es que ésta puede ser utilizada en una expresión porque tiene un valor de retorno. La sintaxis correspondiente a una función es la siguiente: Function nombre ([parámetros]) [As tipo] [sentencias] [nombre = expresion] [Exit Function] SENATI-Computación e Informática 231 Microsoft Office Excel 2007 [sentencias] [nombre = expresion] End Function A continuación se describe en un cuadro los elementos de la función NOMBRES FUNCION nombre Define el nombre de la función Parámetros Son los argumentos que son pasados cuando se llama a la función. As Tipo Define el tipo de dato que devuelve la función, pueden ser: Boolean Lógico, devuelve dos valores True o False. Numéricos Byte, Integer, Single, Double String Aceptar caracteres alfanuméricos de Desde 1 a 65.400 aproximadamente Variant Cualquier valor numérico, String. Sentencias Es el código del programa en VBA. expresión Valor de retorno de la función Exit Function Permite salir de una función antes de que ésta finalice. End Function Marca el final del código de la función. Uso de argumentos en las funciones Los argumentos son los parámetros que se pasan a la función. Argumentos opcionales Se puede especificar argumentos opcionales. Cuando un argumento es opcional y en la llamada es omitido, el valor que se le pasa es un Variant con valor Empty. A los argumentos opcionales se les puede dar en la definición de la función un valor por defecto para el caso en que sean omitidos en la llamada, como por ejemplo: Function AREAT(base As integer, altura As integer, Optional n As Integer) AREAT=base * altura / 2 End Sub 232 SENATI-Computación e Informática ersonalizadas Argumentos arreglos Para utilizar argumentos Array utilice la palabra ParamArray en la definición del procedimiento, como por ejemplo: Public Function maximo(ParamArray numeros()) For Each x in numerous Sentencias maximo = x Next x End Function Ejecutar una función Para ejecutar una función utilice la siguiente sintaxis: = nombre([argumentos]) Donde argumentos son una lista de constantes, variables o expresiones separadas por comas que son pasadas a la función. En principio, el número de argumentos debe ser igual al número de parámetros de la función. Los tipos de los argumentos deben coincidir con los tipos de sus correspondientes parámetros, de lo contrario puede haber fallos importantes en la ejecución del programa. En cada llamada a una función hay que incluir los paréntesis, aunque ésta no tenga argumentos. El siguiente ejemplo corresponde a una función que devuelve como resultado la raíz cuadrada de un número N: Function Raiz (N As Double) As Double If N < 0 Then Exit Function Else Raiz = Sqr(N) End If End Function La llamada a esta función se hace de la forma siguiente: = Raiz(4) SENATI-Computación e Informática 233 Microsoft Office Excel 2007 Recursividad Se dice que una función (Function) es recursiva si se llaman a sí mismos. A continuación se presenta una ejemplo de una función que calcula el factorial de un número programada de forma recursiva. „Cálculo de Factorial Function Fact (N As Integer) As Long If N = 0 Then Fact = 1 Else Fact = N * Factorial (N - 1) End Function En este ejemplo, si la variable N que se le pasa a la función vale 0, significará que se ha llegado al final del proceso, y por tanto se le asigna el valor 1 al valor del factorial (recordar que 0! = 1). Si es distinto de 0, la función se llama a ella misma, pero variando el argumento a (N-1), hasta llegar al punto en el que N- 1=0, finalizándose el proceso. Para invocar a la función utilice =FACT(6) Paso a Paso: Crear la función área del triangulo 1. Realizar una función que permita calcular el área del triángulo. 2. AREAT = ( B x H ) / 2 3. Hacer clic en la ficha , botón 4. Hacer clic en el menú , botón Function AREAT(base As integer, altura As integer, Optional n As Integer) AREAT=base * altura / 2 End Sub 5. Cerrar el Editor de VBA 6. Estando en Excel, Diseñar la siguiente hoja 7. En la celda B5 escribir la función: =AreaT (B3,B5) 234 SENATI-Computación e Informática ersonalizadas Controles Active X Veamos veremos una serie de controles que le pueden brindar interactividad a nuestras aplicaciones Excel Los Controles ActiveX son objetos gráficos que se colocan en un formulario (userforms) o en una determinada posición de la hoja de trabajo, con el objetivo de mostrar, seleccionar o introducir (capturar) datos, para la realización de una acción determinada (ej. ejecución de una macro) o para facilitar la lectura de un formulario. Estos objetos pueden consistir por ejemplo en cuadros de texto, cuadros de lista (ComboBox), botones de opciones, casillas de verificación, botones de comandos, barras de desplazamiento u otros elementos. A continuación se describe los Controles 1. Cuadro de Texto Un Cuadro de Texto nos permite capturar información, la cual puede ser numérica, alfabética o alfanumérica. 2. Botón de Comando Este tipo de control es unode los más conocidos. Entre otras cosas, este control nos permite por ejemplo la ejecución de una macro, o marcar el inicio de la realización de una determinada actividad previamente asignada o programada. 3. Casilla de Verificación Una casilla de verificación es utilizada normalmente para capturar información previamente estructurada. Normalmente se presentan en grupos y es posible seleccionar más de una opción. 4. Botón de Opción Un botón de opción en general presenta las misma características que un grupo de casillas de verificación, sólo que en este caso no es posible seleccionar más de una opción. 5. Cuadro Combinado Su utilización es recomendable cuando la lista de opciones es bastante extensa. Inclusive puede ser configurado para que mostrar un cierto número de opciones solamente, debiendo desplazarse el usuario con la barra de desplazamiento que se generará automáticamente para buscar las otras opciones no visualizadas. 6. Cuadro de Lista Un cuadro de lista contiene una lista de los elementos que pueden ser seleccionados. En términos generales es prácticamente lo mismo que un cuadro SENATI-Computación e Informática 235 Microsoft Office Excel 2007 combinado, sólo que no posee el menú desplegable, sino que es necesario desplazarse a través de él con el cursor. 7. Botón o Control de Número Este control puede ser usado para aumentar o disminuir el valor de un determinado parámetro o celda vinculada. Cuenta con dos flechas, una hacia arriba y otra hacia abajo, o una hacia la derecha y otra hacia la izquierda. Al presionar alguna de ellas aumentará o disminuirá el valor según corresponda. 8. Botón de Alternar Este botón puede ser utilizado para que el usuario seleccione o no una determinada característica, ya que este control tiene la ventaja de que una vez seleccionado permanece seleccionado, devolviendo el valor de Verdadero o Falso según corresponda. Este botón además puede ser vinculado a una determinada celda, en la cual devolverá el valor lógico anteriormente mencionado (verdadero o falso). Paso a Paso: Uso de control ActiveX - 1 1. Diseñar una aplicación que muestre en un control ListBox1 los números pares y en un ListBox2 los números impares 2. Hacer clic en la ficha , botón 3. Hacer clic en el menú , botón y diseñar el formulario mostrado a continuación. 236 SENATI-Computación e Informática ersonalizadas 4. Hacer clic en el menú , botón y escriba el siguiente programa General Declaraciones Dim SumaImpar As Integer Dim SumaPar As Integer Dim cont As Integer Private Sub CommandButton1_Click() Randomize SW = 1 cont = 1 SumaImpar = 0 SumaPar = 0 ListBox1.Clear ListBox2.Clear For cont = 1 To 10 If SW = 1 Then ListBox1.AddItem cont SumaImpar = SumaImpar + cont SW = 0 Else ListBox2.AddItem cont SumaPar = SumaPar + cont SW = 1 End If Next TextBox1.Text = SumaImpar TextBox2.Text = SumaPar End Sub Paso a Paso: Uso de control ActiveX - 2 1. Diseñar una aplicación que permita ingresar los siguientes datos a controles TextBox: Nombres, Apellidos, Dirección, teléfono y suledo. El ingreso de datos debe ser consistenciado. Luego estos datos deben ser pasados a una grilla (Control FlexGrid). Calcular el total del sueldo. SENATI-Computación e Informática 237 Microsoft Office Excel 2007 2. Hacer clic en la ficha , botón 3. Hacer clic en el menú , botón y diseñar el formulario mostrado a continuación. Hacer clic en el menú Herramientas, Controles adicionales para agregar el control FlexGrid a la caja de controles. 4. Hacer clic en el menú , botón . Edite el siguiente código Public Sub IngNum(KeyAscii As MSForms.ReturnInteger) If (KeyAscii = 8) Then Exit Sub If Not (KeyAscii >= Asc("0") And KeyAscii <= Asc("9")) Then KeyAscii = 0 End Sub Public Sub IngNumTelf(KeyAscii As MSForms.ReturnInteger) If (KeyAscii = 8) Then Exit Sub If (KeyAscii = Asc("-")) Then Exit Sub If Not (KeyAscii >= Asc("0") And KeyAscii <= Asc("9")) Then KeyAscii = 0 End Sub Public Function IngFechas(Fecha As Variant) As Boolean IngFechas = IsDate(Fecha) End Function 238 SENATI-Computación e Informática ersonalizadas Public Sub IngCar(KeyAscii As MSForms.ReturnInteger) If (KeyAscii = 8) Then Exit Sub If (KeyAscii = 32) Then Exit Sub If (KeyAscii = Asc(".")) Then Exit Sub If (KeyAscii >= Asc("0") And KeyAscii <= Asc("9")) Then KeyAscii = 0 Select Case KeyAscii Case Is >= Asc("A") And KeyAscii <= Asc("Z"): Exit Sub Case Is >= Asc("a") And KeyAscii <= Asc("z"): Exit Sub Case Is = Asc("á"): Exit Sub Case Is = Asc("é"): Exit Sub Case Is = Asc("í"): Exit Sub Case Is = Asc("ó"): Exit Sub Case Is = Asc("ú"): Exit Sub Case Else: KeyAscii = 0 End Select End Sub 5. Hacer clic en el menú , botón y escriba el siguiente programa General Declaraciones Dim FILA As Integer Private Sub CommandButton1_Click() TextBox1.Text = "" TextBox2.Text = "" TextBox3.Text = "" TextBox4.Text = "" TextBox5.Text = "" End Sub Private Sub CommandButton2_Click() FILA = FILA + 1 MSFlexGrid1.Rows = MSFlexGrid1.Row + FILA MSFlexGrid1.TextMatrix(FILA, 1) = TextBox1.Text MSFlexGrid1.TextMatrix(FILA, 2) = TextBox2.Text SENATI-Computación e Informática 239 Microsoft Office Excel 2007 MSFlexGrid1.TextMatrix(FILA, 3) = TextBox3.Text MSFlexGrid1.TextMatrix(FILA, 4) = TextBox4.Text MSFlexGrid1.TextMatrix(FILA, 5) = TextBox5.Text Label7.Caption = Val(Label7.Caption) + Val(TextBox5.Text) Call CommandButton1_Click TextBox1.SetFocus End Sub Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) Call IngCar(KeyAscii) End Sub Private Sub TextBox2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) Call IngCar(KeyAscii) End Sub Private Sub TextBox3_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) Call IngCar(KeyAscii) End Sub Private Sub TextBox4_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) Call IngNumTelf(KeyAscii) End Sub Private Sub TextBox5_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) Call IngNum(KeyAscii) End Sub Private Sub UserForm_Activate() FILA = 0 MSFlexGrid1.Cols = 6 MSFlexGrid1.TextMatrix(0, 1) = Label1.Caption MSFlexGrid1.TextMatrix(0, 2) = Label2.Caption MSFlexGrid1.TextMatrix(0, 3) = Label3.Caption MSFlexGrid1.TextMatrix(0, 4) = Label4.Caption MSFlexGrid1.TextMatrix(0, 5) = Label5.Caption 240 SENATI-Computación e Informática ersonalizadas MSFlexGrid1.ColWidth(0) = 10 MSFlexGrid1.ColWidth(1) = 2000 MSFlexGrid1.ColWidth(2) = 2000 MSFlexGrid1.ColWidth(3) = 2000 MSFlexGrid1.ColWidth(4) = 800 MSFlexGrid1.ColWidth(5) = 1000 WindowState = 2 End Sub Paso a Paso: Uso de control ActiveX - 3 1. Diseñar una aplicación que permita mostrar el cuadro de desembolsos de un préstamo, dado a un determinado número de periodos y tasa de interés, aplicando el cálculo de la amortización con el método Alemán. Así mismo se debe dar consistenciaal ingreso de datos numéricos. 2. Fórmulas a utilizar. Préstamo = Préstamo período anterior – Amortización Saldo = Saldo anterior – Amortización Interés = Saldo del período * Tasa de interés Cuota = Amortización + Interés 3. Hacer clic en la ficha , botón 4. Hacer clic en el menú , botón y diseñar el formulario mostrado a continuación. Hacer clic en el menú Herramientas, Controles adicionales para agregar el control FlexGrid a la caja de controles. SENATI-Computación e Informática 241 Microsoft Office Excel 2007 5. Hacer clic en el menú , botón y escriba el siguiente programa General Declaraciones „Permite dar consistencia al ingreso de datos numéricos Public Sub IngNumero(ByVal KeyAscii As MSForms.ReturnInteger) If (KeyAscii >= 48 And KeyAscii <= 56) Then Exit Sub Else KeyAscii = 0 End If End Sub Si el carácter ingresado no es número, se impide el ingreso del caracter Ascii 48 =0 Ascii 57 = 9 Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) Call IngNumero(KeyAscii) End Sub Private Sub CommandButton1_Click() Dim xcapital As Single Invoca al procedimiento IngNumero Dim xinteres As Single Dim xperiodos As Single Dim xamortiza As Single Dim xpa As Single xcapital = Val(TextBox1.Text) xinteres = Val(TextBox2.Text) xperiodos = Val(TextBox3.Text) xamortiza = xcapital / xperiodos Declarar las variables a utilizarse Asigna datos a las variables Asigna como No.de filas del control FlexGrid, el número de periodos MSFlexGrid1.Rows = Val(TextBox3.Text) + 1 For f = 1 To Val(TextBox3.Text) MSFlexGrid1.TextMatrix(f, 1) = f MSFlexGrid1.TextMatrix(f, 2) = xamortiza If f = 1 Then MSFlexGrid1.TextMatrix(f, 3) = xcapital Else Crea un ciclo repetitivo de 1 hasta el No. de periodos MSFlexGrid1.TextMatrix(f, 3) = xpa - xamortiza End If 242 SENATI-Computación e Informática ersonalizadas xpa = Val(MSFlexGrid1.TextMatrix(f, 3)) MSFlexGrid1.TextMatrix(f, 4) = xpa * (xinteres / 100) Next xi = Val(MSFlexGrid1.TextMatrix(f, 4)) MSFlexGrid1.TextMatrix(f, 5) = xamortiza + xi End Sub Private Sub TextBox2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) Call IngNumero(KeyAscii) End Sub Invoca al procedimiento IngNumero Private Sub TextBox3_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) Call IngNumero(KeyAscii) End Sub Private Sub UserForm_Activate() MSFlexGrid1.Cols = 6 MSFlexGrid1.TextMatrix(0, 1) = "No." Invoca al procedimiento IngNumero Asigna la cantidad de filas para el FlexGrid. MSFlexGrid1.TextMatrix(0, 2) = "Amortización" MSFlexGrid1.TextMatrix(0, 3) = "Saldo" MSFlexGrid1.TextMatrix(0, 4) = "Interés" MSFlexGrid1.TextMatrix(0, 5) = "Cuota" End Sub Paso a Paso: Uso de control ActiveX - 4 1. Diseñar una aplicación que permita asignara puntajes al azar a 10 participantes a un concurso de belleza, se evalúan por 4 criterios: Belleza, inteligencia, cuerpo, desenvolvimiento. Los puntajes están entre 1 y 10 por cada criterio. Al final mostrar el número de la participante ganadora y su puntaje 2. Hacer clic en la ficha , botón SENATI-Computación e Informática 243 Microsoft Office Excel 2007 3. Hacer clic en el menú , botón y diseñar el formulario mostrado a continuación. Control ListBox1 4. Hacer clic en el menú , botón y escriba el siguiente programa General Declaraciones Dim numpart As Integer Dim numcrit As Integer Dim PtjeMax As Integer Dim PtjeMin As Integer Dim Puntaje(12, 4) As Integer Dim total(12) As Integer Private Sub CommandButton1_Click() ListBox1.Clear Randomize ScaleMode = 3 'Generación de los puntajes aleatorios For candidata = 1 To 12 244 SENATI-Computación e Informática ersonalizadas For criterio = 1 To 4 Puntaje(candidata, criterio) = Int((10 - 5 + 1) * Rnd + 5) Next Next 'Determinar el puntaje total por participante For contpart = 1 To 12 total(contpart) = 0 For contcrit = 1 To 4 total(contpart) = total(contpart) + Puntaje(contpart, contcrit) Next Next For contpart = 1 To 12 registro = registro + "Concursante No. " & Right(("0" + Trim(Str(contpart))), 2) + " " For contcrit = 1 To 4 registro = registro + Right(("0" + Trim(Str(Puntaje(contpart, contcrit)))), 2) + " " Next ListBox1.AddItem registro + Str(total(contpart)) registro = "" Next 'Determinar mayor puntaje total mayor = 0 numero = 0 For contpart = 1 To 12 If total(contpart) > mayor Then mayor = total(contpart) numero = contpart End If Next TextBox1.Text = numero TextBox2.Text = mayor End Sub SENATI-Computación e Informática 245 Microsoft Office Excel 2007 Cuestionarios 1. Qué es una función. 2. Qué es un Control Active X. __ 3. Considera útil la creación de funciones personalizadas. 4. Crear una función que permite determinar si un año es bisiesto. 5. Crear una función que permita determinar la edad de una persona. 246 SENATI-Computación e Informática
Compartir