Vista previa del material en texto
Capítulo Programación con VBA En este capítulo trataremos: Programación con Visual Basic SENATI-Computación e Informática 159 Microsoft Office Excel 2007 Introducción al Visual Basic Microsoft VBA (Visual Basic for Applications) es el lenguaje de macros de Microsoft Visual Basic y viene integrado en aplicaciones de Microsoft Office, como Word, Excel y Access, Powerpoint y Visio. VBA permite acceder a las funcionalidades de un lenguaje orientado a eventos con acceso a la API de Windows. La utilidad de VBA es automatizar tareas cotidianas, el programa generado sólo se puede compilar con el documento, hoja o base de datos en que fue creado Visual Basic es una herramienta de diseño de aplicaciones para Windows, en la que estas se desarrollan en una gran parte a partir del diseño de una interface gráfica. En una aplicación Visual Basic, el programa está formado por una parte de código puro, y otras partes asociadas a los objetos que forman la interface gráfica. Objetos Procedimientos Código Es por tanto un término medio entre la programación tradicional, formada por una sucesión lineal de código estructurado, y la programación orientada a objetos. Combina ambas tendencias. Ya que no podemos decir que Visual Basic pertenezca por completo a uno de esos dos tipos de programación, debemos inventar una palabra que la defina: PROGRAMACION VISUAL. Pasos para la creación de un programa en VBA La creación de un programa bajo Visual Basic lleva los siguientes pasos: Análisis, planteamiento lógico de la solución del problema, diagrama de flujo, diseño del formulario, programa. 160 SENATI-Computación e Informática ción con VBA Análisis En esta etapa se construye un modelo del problema extraído del mundo real especificando los elementos que alimentan el proceso (especificaciones de entrada), los elementos que se espera produzca el proceso (especificaciones de salida) y se define lo mejor posible al problema en sí mismo. Para poder definir bien un problema es conveniente responder a las siguientes preguntas 1. ¿Qué es lo que me pide que realice el problema? 2. ¿Qué datos se requieren ingresar, analice el tipo de dato que necesita (numérico, texto, fecha, hora, …) y su valor inicial? 3. ¿Qué resultado desea hallar, cálculos, reportes, consultas, analice el tipo de dato? 4. ¿Qué método puedo utilizar para encontrar este resultado? Requerimientos del análisis del problema: Análisis del problema Definición del problema Definir datos de entrada Definir datos de salida Planteamiento lógico de la solución del problema. El planteamiento lógico de basa en la idea que uno tiene para resolver el problema, basado en un modelo matemático o secuencia de procesos (leer datos, registrar datos, consultar datos, reportar datos, … etc.). Diagrama de flujo Es una herramienta que permite plantear una solución lógica a un problema de computadoras. Diseño del formulario Es la interfaz de comunicación hombre máquina, tanto para salida de datos como para entrada. Programa El programa está distribuido en: Las propiedades de los controles, los procedimientos (Eventos Click, keypress, etc.) SENATI-Computación e Informática 161 Microsoft Office Excel 2007 Fundamentos de programación VBA Los algoritmos se estructuran de diversas formas, en algunos casos simplemente su desarrollo es consecutivo, a este tipo de algoritmos se denomina de estructura secuencial, en otros casos durante el desarrollo secuencial se generan preguntas a este tipo de algoritmos se denomina de estructura condicional y en otros casos generan bucles es decir repetición de ciertas líneas de programas, a estos algoritmos se denominan de estructura repetitiva. Estructura básica para cualquier algoritmo a desarrollar: Declaración de variables Captura de datos Proceso de datos Salida de información Estructura Secuencial. Este tipo de algoritmos se caracteriza por que entre sus instrucciones no existen estructuras condicionales ni repetitivas, se desarrollan línea a línea hasta culminar con su ejecución, gráficamente se observaría de la siguiente manera: 162 SENATI-Computación e Informática ción con VBA Ejemplo Diseñar un programa que permita hallar el área de un triangulo rectángulo si se sabe: Área_triángulo = (B * H) / 2 Donde B es base del triangulo y H es la altura. 1. Análisis i. ¿Qué te piden que realices? Hallar el área de un triangulo. ii. ¿Qué datos necesito conocer? Según la fórmula que se muestra debería de conocer la base y la altura. 2. Planteamiento Lógico. El problema se resuelve con una fórmula matemática AR = B*H 3. Definición de variables de entrada Las variables que se usaran para la captura de la base y la altura son: B y H. 4. Definición de variables de salida La variable en donde se muestra el área del triangulo rectángulo es: AR 5. Programa Sub AreaTriangulo() Dim a B as integer Dim H as integer Dim AR as single B= val (Textbox1.text) H = val (Textbox¨2.text) AR = (B*H) / 2 Textbox2.text = AR End Sub Estructura Condicional. Este tipo de algoritmos se caracteriza por que entre sus instrucciones muestran estructuras condicionales. a. Condiciones Simples. Sentencia SI – ENTONCES Se ejecuta un conjunto de instruciones si se cumple la condición V Condición Instrucciones SENATI-Computación e Informática 163 Microsoft Office Excel 2007 b. Condiciones doble. Sentencia SI – ENTONCES – SINO Se ejecuta un conjunto de instruciones si se cumple la condición, caso contrario se ejecuta otro conjunto de instrucciones. F V Condición Instrucciones_B Instrucciones_A Ejemplo Realizar un algoritmo que permita ingresar 2 números, luego determinar si el primer número ingresado fue el mayor (mostrar un mensaje). 1. Análisis. i. ¿Qué te piden que realices? Evaluar 2 números para determinar si el primer número ingresado fue el mayor. ii. ¿Qué datos necesito conocer? Los 2 números. 2. Planteamiento Lógico. La forma directa de poder saber si un número es mayor a otro es creando una condición relacional. A > B 3. Definición de variables de entrada. Se requerirán dos variables, N1 y N2 que representen a los números que se evalúan. 4. Definición de variables de salida. Para este problema no existirán variables de salida debido a que se desea mostrar solo mensajes. 5. Programa Private Sub CommandButton1_Click() N1 = val(text1.text) N2 = val(text2.text) If n1>n2 then 164 SENATI-Computación e Informática ción con VBA Else End If End Sub Textbox1.text = “El primer número es el mayor” Textbox1.text = “El segundo número es el mayor” 6. Diagrama de Flujo INICIO Declaración de variablesN1, N2: entero N1, N2 F V A>B El primer número no es mayor El primer número es mayor FIN Sentencia selección-caso Esta es una estructura de decisión múltiple, evaluará una expresión condicional que podrá tomar uno de los “n” valores distintos que para algunos casos puede tratarse de rangos o valores individuales, según cumpla con uno de estos. SENATI-Computación e Informática 165 Microsoft Office Excel 2007 Ejemplo Un movil recorre un tramo de la carretera con Movimiento Rectilíneo Uniforme (MRU), determinar y mostrar cual es el espacio recorrido: Espacio = Velocidad * Tiempo Adicionalmente mostrar un mensaje que indique el consumo de gasolina según la tabla: Espacio Recorrido Gasolina 0 y 30 1 galón 31 y 60 2 galones 61 y 200 3 o más galones 1. Análisis. ii. ¿Qué te piden que realices? Calcular el espacio recorrido y en base a ello mostrar cuanta gasolina se consume. iii. ¿Qué datos necesito conocer? La velocidad y el tiempo (según formula). 2. Planteamiento Lógico. El desarrollo es simple, solamente deberá ingresar la velocidad y el tiempo para calcular el espacio recorrido, en base a ello deberá observar la tabla para que desarrolle la estructura correspondiente y muestre el mensaje solicitado. Ejemplo: Si el espacio recorrido es de 25 kilómetros El mensaje es 1 galón. 3. Definición de variables de entrada. Se requerirán dos variables, V y T que representen a la velocidad y el tiempo respectivamente. 4. Definición de variables de salida. La variable de salida estará representada por E. 5. Programa. Private Sub CommandButton1_Click() v = val(text1.text) t = val(text2.text) e = v*t Select case e case 0 to 30 166 SENATI-Computación e Informática ción con VBA text3.text =”Debe usar un galón” case 31 to 60 text3.text =”Debe usar dos galones” case 61 to 200 text3.text =”Debe usar tres galones” End select End Sub 6. Diagrama de flujo. INICIO Declaración de variables V, T, E: entero V, T E = V * T E 31 y 60 0 y 30 60 y 200 Debe usar 1 galón Debe usar 2 galones Debe usar 3 o más galones E FIN Estructura Repetitiva. Conjunto de instrucciones que se repiten un número determinado de veces mientras se cumple una determinada condición o en todo caso se le ha dado un límite de veces a ejecutar. Inicio de Bucle Instrucción 1 Instrucción N Fin de Bucle SENATI-Computación e Informática 167 Microsoft Office Excel 2007 Contador. Los procesos repetitivos por lo general lo utilizan, ya que necesitan contar los sucesos o acciones internas del bucle. Una Inicio de Bucle C = C + 1 de las formas de controlar un bucle es mediante un contador. Un contador es una variable cuyo valor crece o decrece en una cantidad constante por cada vuelta (interacción) que da el bucle. Inicio de Bucle Fin de Bucle Acumulador. Es denominado también totalizador, es una variable cuya misión es almacenar cantidades o valores resultantes de sumas sucesivas. Realiza la misma función que un contador con la diferencia de que el incremento o decremento de cada suma es variable en lugar de constante como en el caso del contador. N AC = AC + N Fin de Bucle Ejemplo Desarrollar un algoritmo que permita calcular y mostrar la suma de los n primeros números naturales, deberá ingresar el límite de números a sumar. S = 1 + 2 + 3 + 4 + 5 +... + n 1. Análisis. i. ¿Qué te piden que realices? Calcular la suma de n números naturales. ii. ¿Qué datos necesito conocer? La cantidad de números a sumar. 2. Planteamiento Lógico. Este problema se puede haciendo uso de acumuladores y contadores. 3. Definición de variables de entrada. Se requerirán una variable que represente a la cantidad de números a sumar(N). 4. Definición de variables de salida. Tilizaremos la variable AC. 5. Programa General Declaraciones Dim i As Byte Dim AC As Integer 168 SENATI-Computación e Informática ción con VBA Private Sub CmdProcesar_Click() List1.Clear AC = 0 For i = 1 To Val(Text1.Text) List1.AddItem Str(i) AC = AC + i Next i Text2 = AC End Sub Private Sub CmdLimpiar_Click() Text1 = 0 Text2 = 0 Text1.SetFocus End Sub Private Sub CmdSalir_Click() If MsgBox("Desea salir?", vbInformation + vbYesNo, "SALIDA") = vbYes Then End End If End Sub 6. Diagrama de flujo INICIO Declaración de variables I, N, AC: entero N AC = 0 Para I=1 Hasta N AC = AC + I AC FIN SENATI-Computación e Informática 169 Microsoft Office Excel 2007 La ventana del editor de Visual Basic Para trabajar en el Entorno de Visual Basic, hacer lo siguiente. Hacer clic en la ficha , botón Se presenta la ventana de programación Visual Basic Barra de menú Barra de herramienta Ventana de proyecto Formulario Cuadro de herramientas A continuación se describen los principales elementos de la ventana de Microsoft Visual Basic. a. Barra de Menús Presenta los comandos que se usan para trabajar con Visual Basic. Además de los menús estándar Archivo, Edición, Ver, Insertar, Formato, Depuración, Ejecutar, Herramientas, Complementos, Ventana y Ayuda. b. Barra de Herramientas Permite un acceso directo (solo un clic) a muchas de las operaciones más frecuentes utilizadas durante el desarrollo de aplicaciones. c. Cuadro de Herramientas Contiene todos los objetos y controles que se pueden añadir a los formularios para crear aplicaciones. 170 SENATI-Computación e Informática ción con VBA d. Diseñador de Formularios Funciona como una ventana en la que se puede personalizar el diseño de la interfaz de usuario (ventana) de una aplicación. e. Explorador de Proyectos Lista de los archivos (formularios, módulos, etc.) del proyecto actual. Un Proyecto es una colección de archivos que utiliza para construir una aplicación. f. Ventana de Propiedades Lista los valores de las propiedades del formulario o control seleccionado que pueden ser modificados durante el diseño del formulario o control. g. Ventana de Código Funciona como un editor para escribir el código (sentencias) de la aplicación. Cuando se ingresa el nombre de una función en la ventana de código, Visual Basic automáticamente proporciona el formato o sintaxis de la función. Terminología de Visual Basic Conforme trabaje con VBA necesitará estar familiarizado con los siguientes términos: Término Definición Tiempo de diseño Es el momento en el que se construye la aplicación. Tiempo de ejecución Es el momento en el cual ejecutamos aplicación. Formulario ES el contenedor de los controles donde se diseña la aplicación, también conocida como interfaz de usuario. Controles Representación gráfica de objetos tales como botones, cuadros de lista, cuadros de edición, etc. Objetos Un término general usado para describir todoslos formularios y controles que forman parte de la aplicación. Propiedades Los valores de un objeto, tales como tamaño, título, color, etc. Métodos Las acciones que un objeto puede realizar sobre sí mismo. Eventos Son acciones reconocidas por un formulario o control. Los eventos ocurren a medida que el usuario interactúa SENATI-Computación e Informática 171 Microsoft Office Excel 2007 con los objetos de la aplicación. Programación controlada por eventos La programación controlada por eventos es la esencia de las interfaces gráficas de usuario; el usuario acciona y el código responde. Programación por eventos En las aplicaciones manejadas por eventos, la ejecución no sigue una ruta predefinida. En vez de esto, se ejecutan diferentes secciones de código en respuesta a eventos. La secuencia de eventos determina la secuencia en que el código se ejecuta. Es por esto que la ruta que sigue el código de la aplicación es diferente cada vez que se ejecuta el programa. Convenciones para los nombres de los objetos Los objetos deben llevar nombres con un prefijo coherente que facilite la identificación del tipo de objeto. A continuación se ofrece una lista de convenciones recomendadas para algunos de los objetos permitidos poro Visual Basic. Tipo de Control Prefijo Detalles Etiqueta lbl lblAPELLIDOS Cuadro de texto txt txtAPELLIDO Casilla de verificación chk chkIMPRESORA Botones de opción opt optCPU Cuadro combinado, cuadro lista desplegable cbo cboCUDADES Cuadro de lista lst lstPAISES Botón de comando cmd cmdSALIR Formulario frm frmENTRADA Marco fra fraTIPOS Línea lin linVERTICAL Imagen (Picture) pic picLOGOTIPO Cuadro de número spn spnPÁGINAS 172 SENATI-Computación e Informática ción con VBA Formularios El formulario es el principal medio de comunicación entre el usuario y la aplicación. Los usuarios interactúan con los controles sobre el formulario para ingresarle datos y obtener resultados, para mostrar las propiedades de un objeto pulsar F4. Propiedades BackColor Color de fondo del formulario. Caption Texto en la barra de título del formulario. Enabled True/False. Determina si está habilitado para responder a las acciones del usuario. Left y Top Ubicación del formulario. Name Nombre del formulario. Eventos Activate Ocurre cuando el formulario se convierte en la ventana activa. Click Ocurre cuando hace clic sobre el formulario. Deactivate Ocurre cuando el formulario deja de ser la ventana activa. Añadir controles al formulario Para añadir controles a un formulario lo hacemos de la siguiente manera: 1. Haga clic sobre el control en el Cuadro de Herramientas. 2. Ubique el puntero del Mouse (una cruz) sobre el formulario en la esquina superior izquierda donde desea colocar el control. 3. Realice un clic sostenido mientras arrastra el puntero a la esquina superior derecha donde colocará el control. 4. Suelte el botón del Mouse. Estos cuatro pasos se repiten con cada control que desea añadir al formulario. La Ventana de Código La Ventana de Código se usa para escribir, mostrar y editar el código de su aplicación. Puede abrir una ventana de código por cada módulo de su aplicación, de modo que puede fácilmente copiar y pegar entre ellos. El editor de texto es solo un editor ASCII. SENATI-Computación e Informática 173 Microsoft Office Excel 2007 La Ventana de Código contiene: Lista de objetos Lista de eventos La barra de división a. El Cuadro Lista de Objetos Muestra el nombre del objeto seleccionado. Haga clic en la flecha a la derecha del cuadro Objeto para mostrar una lista de todos los objetos asociados con el formulario. b. El Cuadro Lista de Eventos Muestra todos los eventos reconocidos para el formulario o control mostrado en el cuadro Objeto. Cuando seleccionamos un evento, en la ventana de código se muestra el procedimiento de evento asociado con ese evento. Ejemplo: c. La Barra de División Permite dividir la ventana de código en dos partes. Editando Código Use las características de edición de Visual Basic para que su código sea más fácil de leer. Sangría Use la sangría para diferenciar partes de su código, tales como estructuras repetitivas y condicionales. Veamos el siguiente ejemplo: Private Sub cmdIngresar_Click() If Len(Trim(txtUsuario))=0 Then txtUsuario.SetFocus ElseIf Len(Trim(txtContraseña))=0 Then txtContraseña.SetFocus ElseIf txtContraseña = “AGPS” Then Para aplicar sangría a una sección de sentencias de un código use la tecla Tab. 174 SENATI-Computación e Informática ción con VBA Else End If MsgBox “La clave ingresada es correcta” Unload Me MsgBox “La clave ingresada no es válida” txtContraseña.SelStart=0 txtContraseña.SelLength= Len(Trim(txtContraseña)) txtContraseña.SetFocus End Sub Comentarios El añadir documentación y comentarios a su código permite comprender mejor lo que hace el código. El texto que continúe al símbolo de comentario será ignorado en la ejecución de la aplicación. Veamos el siguiente ejemplo: Private Sub cmdLimpiar_Click() 'Este procedimiento limpia la ventana de identificación txtUsuario.Text = "" 'Limpia el cuadro de texto txtUsuario.SetFocus ' Mueve el enfoque a txtUsuario End Sub Un comentario se inicia con el carácter apóstrofe ( „ ) Creación y uso de procedimientos En las aplicaciones tradicionales o procedurales, es la aplicación quien controla que porciones de código se ejecuta, y la secuencia en que este se ejecuta. La ejecución de la aplicación se inicia con la primera línea de código, y sigue una ruta predefinida a través de la aplicación, llamando procedimientos según sea necesario. Procedimientos Existen dos tipos de procedimientos con los que se trabaja en Visual Basic: los procedimientos de evento y los procedimientos generales. Procedimientos de Evento Visual Basic invoca automáticamente procedimientos de evento en respuesta a acciones del teclado, del ratón o del sistema. Cada control tiene un conjunto fijo de procedimientos de evento. Los procedimientos de evento para cada control son mostrados en un cuadro de lista despegable en la ventana de código. SENATI-Computación e Informática 175 Microsoft Office Excel 2007 El código que se escriba en el procedimiento de evento Click es ejecutado cuando el usuario haga clic en un botón de comando. Procedimientos Generales Son procedimientos Sub o Function que son creados para que lleven a cabo tareas específicas. Para crearlos hacer clic en el menú Insertar, Procedimiento. Si se tiene código duplicado en varios procedimientos de evento, se puede colocar el código en un procedimiento general y luego invocar al procedimiento general desde los procedimientos de evento. Procedimientos Sub Los procedimientos Sub no retornan valores. Por ejemplo: Public Sub Seleccionar(Cuadro As TextBox) Cuadro.SelStart = 0 Cuadro.SelLength = Len(Cuadro.Text)End Sub Los procedimientos Sub son invocados especificando sólo el nombre del procedimiento, o empleando la instrucción Call con el nombre del procedimiento. Por ejemplo: Call Seleccionar(Text1) Si se emplea la instrucción Call, se debe encerrar la lista de argumentos entre paréntesis. Si se omite Call, también se deben omitir los paréntesis alrededor de la lista de argumentos. 176 SENATI-Computación e Informática ción con VBA : Procedimientos Function Los procedimientos Function devuelven valores. En el siguiente ejemplo, el procedimiento Function recibe un número y devuelve ese número al cuadrado. Public Function Cuadrado(N As Integer) As Integer Cuadrado = N * N End Function Si se desea guardar el valor devuelto, se debe usar paréntesis cuando se invoque a la función, como se muestra a continuación: Resultado = Cuadrado (5) Si se omiten los paréntesis, se puede ignorar el valor devuelto y no guardarlo en una variable. Esto puede ser útil si se quiere ejecutar una función y no se desea el valor devuelto. Por ejemplo: Ámbito de las variables. Denominamos ámbito de una variable a las partes del programa donde esa variable está declarada. Para entenderlo mejor, veamos someramente la forma de un programa desarrollado en VB. A estas partes las habíamos llamado Procedimientos. Podemos tener procedimientos que no estén relacionados con ningún evento ocurrido al formulario o a sus controles. (Los Procedimientos que iremos insertando a lo largo de la aplicación). Aquí puede insertar proc. y funciones del módulo. Si se declara una variable dentro de un procedimiento o Función, esa variable tiene como ámbito el Procedimiento o Función donde se declaró. En un Formulario, una variable puede declararse de dos formas: Privada o Pública. Variable Privada tiene como ámbito sólo el proc. y función donde fue declarada Variable Pública tiene como ámbito todos los proc. y funciones del formulario y sus controles. Variable a nivel de formulario debe declararse en la sección de declaraciones, que está la ventana de código Objeto = General, Proc. = Declaraciones. Tiene como ámbito todo el formulario En un Módulo una variable puede declararse como Privada, con lo que no saldrá de ese Módulo, o Pública, pudiendo en este caso usarse en todo el programa No es recomendable declarar variables con el mismo nombre. SENATI-Computación e Informática 177 Microsoft Office Excel 2007 Formas de declaración de variables en un proyecto VB. Sentencia Dim Es la forma más común de declarar una variable como Privada. Puede emplearse en un Procedimiento, Función, Formulario o Módulo. La sintaxis es de la siguiente forma: Dim nombrevariable As Integer Sentencia PRIVATE Su ámbito depende donde la declaro. Cada vez que entremos al formulario, procedimiento o módulo, esa variable tomará el valor cero (si es numérica) o nulo (si es string). Es la forma de declarar una variable como Privada. Puede emplearse solamente en la sección de declaraciones de un Formulario o Módulo. La sintaxis es de la siguiente forma: Private nombrevariable As Tipovariable La sentencia Private no puede usarse en un procedimiento o función. La variable NO puede utilizarse fuera del Formulario o Módulo donde se declaró. Sentencia PUBLIC Puede emplearse solamente en la sección de declaraciones de un Formulario o Módulo. La sintaxis es de la siguiente forma: Public nombrevariable As Tipovariable Para nombrarla, si estamos en el Formulario donde se declaró basta con citarla por su nombre. Si no estamos en ese Formulario, Si se declara de esta forma en la sección de declaraciones de un Formulario, esa variable puede usarse en toda el programa. habrá que citarla por el nombre del Formulario, seguido del nombre de la variable, separado por un punto: NombreFormulario.Nombrevariable Sentencia GLOBAL Una variable declarada como Global es reconocida en cualquiera de los formularios y módulos del proyecto. La sintaxis es: Global nombrevariable As tipovariable Sentencia STATIC La sentencia Global sólo puede usarse en el apartado de declaraciones de un Módulo. Variable estática permite retener el valor de la variable cuando se vuelve a invocar el proc. o función. Esta declaración como estática se realiza mediante la instrucción Static Static nombrevariable As tipovariable Sólo ̀ puede declararlo dentro de un procedimiento o función. 178 SENATI-Computación e Informática ción con VBA Pese a que Visual Basic no obliga a declarar variables, es muy útil hacerlo. De esta forma se tiene control sobre el programa. La experiencia se lo irá demostrando. Resumen de declaración de variables Procedimiento La variable no puede usarse fuera de esta Procedimiento Dim Variable As Tipovariable Procedimiento, como permanente La variable no puede usarse fuera de este procedimiento, y dentro de él conserva el valor aunque se salga y se vuelva a entrar Static Variable As Tipovariable Formulario En su sección de declaraciones, como Privada Solamente se puede usar en ese Formulario Dim Variable As Tipovariable Private Variable As Tipovariable Formulario En su sección de declaraciones, como Pública Puede usarse en toda la aplicación Public Variable As Tipovariable Módulo Como Privada Solamente puede usarse en ese Módulo Dim Variable As Tipovariable Private Variable As Tipovariable Módulo Como Pública Puede usarse en toda la aplicación Public Variable As Tipovariable Global Variable As Tipovariable Forma de conocer el tipo de una variable. Función TypeName Podemos conocer el tipo con el que se ha declarado una variable. Esto se hace mediante la Función TypeName, que devuelve una cadena con el tipo de una variable. MiTipo = TypeName(NombreVariable) NombreVariable puede ser cualquier variable con excepción de las de tipos definidos por el usuario. SENATI-Computación e Informática 179 Microsoft Office Excel 2007 La cadena de caracteres devuelta por TypeName puede ser una de las siguientes: Cadena devuelta La variable contiene Byte Un byte Entero Un entero. Largo Un entero largo. Simple Un número de punto flotante de precisión simple. Doble Un número de punto flotante de precisión doble. Moneda Un valor de moneda. Fecha Una fecha. Cadena Una cadena. Boolean Un valor Boolean. Error Un valor de error. Empty No inicializado. Null No hay datos válidos. Objeto Un objeto que no respalda Automatización OLE. Desconocido Un objeto de Automatización OLE cuyo tipo es desconocido. Nada Una variable de objeto que no se refiere a un objeto. Si NombreVariable es una matriz, la cadena devuelta puede ser cualquiera de las cadenas posibles con un paréntesis vacío adherido. Por ejemplo, si NombreVariable es una matriz de enteros, TypeName devolverá "Integer()". Objetos propiedades, métodos y eventos Control Etiqueta (Label) Se utiliza para mostrar texto que el usuario no puede modificar. Generalmente para identificar otros controles en el formulario o para mostrarinstrucciones al usuario. Propiedades Name Nombre del control. AutoSize True/False. Determina si el tamaño del control se ajusta automáticamente al texto que contiene. Caption Texto que muestra el control. Font Establece la fuente, estilo y tamaño para el texto del control. 180 SENATI-Computación e Informática ción con VBA Control Cuadro de Texto (Textbox) Se utiliza para que el usuario le proporcione datos a la aplicación o para que la aplicación le devuelva la información al usuario. El texto que se muestra en el control puede ser cambiado por el usuario. Propiedades Enabled True/False. Establece un valor que determina si el control puede responder a eventos generados por el usuario. Font Establece la fuentes, estilo y tamaño para el texto del control. Locked True/False. Determina si es posible modificar el texto en el control. MaxLength Establece la longitud máxima permitida para el texto en el control. MultiLine Establece si el control puede aceptar múltiples líneas de texto. Name Nombre del control. PasswordChar Carácter utilizado para ocultar el texto que realmente contiene el control. Text Texto que realmente contiene y muestra el control. Visible Establece si el control será visible para el usuario. Eventos Change Ocurre cuando cambia el texto que contiene el control. KeyDown Ocurre cuando el usuario presiona una tecla mientras el control tiene el enfoque. Control Botón de Comando (Commandbutton) Permite que la aplicación inicie, interrumpa o termine un proceso. Propiedades Caption Establece el texto que muestra el botón. Font Establece la fuente, estilo y tamaño para el texto del control. Name Nombre del botón. Visible True/False. Establece si el botón será visible para el usuario. Eventos Click Ocurre cuando se hace clic sobre el botón. SENATI-Computación e Informática 181 Microsoft Office Excel 2007 Estableciendo Propiedades Al diseñar la interface de usuario de una aplicación Visual Basic, se deben establecer la propiedades para los controles (objetos) creados. Estableciendo Propiedades en Tiempo de Diseño Algunas propiedades pueden ser establecidas en tiempo de diseño. Para establecer estas propiedades se emplea la ventana de propiedades. Si selecciona varios objetos a la vez y accede a la ventana de propiedades, sólo se mostrarán las propiedades que son comunes para todos los controles seleccionados. Cualquier cambio que se haga a una propiedad será aplicada a todos los controles. Para acceder a la ventana de propiedades, oprima en botón secundario del ratón sobre un objeto, y luego haga clic en Propiedades. También se puede obtener el mismo resultado seleccionado el objeto y luego presionando F4 Estableciendo Propiedades en Tiempo de Ejecución En tiempo de ejecución, se puede escribir código para establecer u obtener el valor de una propiedad. txtData.Font.Bold = True La siguiente línea de código establece a negrita la fuente de un cuadro de texto llamado txtData. Este código establece la propiedad Text del cuadro de texto txtData txtData.Text = "Hola mundo" Establece el valor del texto Si se omite el nombre de la propiedad, se establece la propiedad predeterminada del control. La propiedad predeterminada de un cuadro de texto es la propiedad Text. La propiedad predeterminada de una etiqueta es la propiedad Caption. Las siguientes líneas de código establecen las propiedades predeterminadas text y caption de un cuadro de texto y de una etiqueta. txtData = “Pedro” lblData = "Nombre” Se establece la propiedad Text del cuadro de texto Se establece la propiedad Caption de la etiqueta 182 SENATI-Computación e Informática ción con VBA Obteniendo Propiedades en Tiempo de Ejecución Puede emplear el siguiente código para obtener el valor de una propiedad en tiempo de ejecución. Dim sNombre as String sNombre = txtName.Text Asigna a la variable sNombre el valor del cuadro de texto txtName Definición de variables, tipos de datos y constantes Una variable es un lugar de memoria en la memoria del computado. Es un nombre que en el programa le asignamos a un dato. Ese dato podrá cambiar. Piense por ejemplo, en un programa consistente en la toma de datos de los Variable alumnos de un centro escolar. Existirán varias variables para poder introducir los datos de los Valor de la variable alumnos. Estas variables pueden tener nombre tales como: Nombre, Apellido_Paterno, Apellido_Materno, Direccion, Telefono, La variable Nombre tomará valores distintos según vayamos introduciendo los datos de los distintos alumnos. Es posible, que a lo largo de la ejecución del programa, esta variable Nombre contenga los datos: Option Explicit Obliga a declarar previamente las variables que se vayan a usar. Esta declaración debe ponerla al comienzo de la sección de declaraciones de cada formulario y módulo que contenga su aplicación. Tipos de Variables Las variables pueden ser de los siguientes tipos: (El número indicado en segundo lugar indica el número de Bytes que ocupa en memoria.) VARIABLE ESPACIO QUE OCUPA DETALLES Booleana 2 Bytes Admite los valores 0 y 1, o True (verdadero) y False (falso) Byte 1 Bytes Números enteros, en el rango de 0 a 255 SENATI-Computación e Informática 183 Microsoft Office Excel 2007 Integer 2 Bytes Números enteros en el rango de -32768 a 32767 Long 4 Bytes Números enteros en el rango de -2147483648 a 2147483647 Single 4 Bytes Punto flotante, simple precisión Doble 8 Bytes Punto flotante, doble precisión. Currency Entero, con punto decimal fijo (Típico de monedas) String * Cadenas alfanuméricas de longitud variable o fija. Una variable tipo String ocupa el mismo número de bytes que caracteres tenga la cadena. Date 8 Bytes Fechas Objet 4 Bytes Referencia a objetos Variant * Otros tipos de datos. Una variable tipo Variant ocupa 16 bytes si se trata de un número y 22 bytes + longitud de la cadena si se trata de un dato tipo cadena de caracteres. Los bytes necesarios para almacenar esa variable dependerán de los datos que se hayan definido. NOTA. Observe en la lista anterior que un dato Booleano ocupa 2 Bytes, mientras que un dato tipo Byte ocupa un byte. En muchas ocasiones declaramos variables tipo Boolean con la intención de que ocupen menos espacio. Declaración de variables Para declarar una variable se utiliza la sentencia Dim. Sintaxis: Dim nombre_variable As Tipo_variable Tipos de variables A continuación se describen los tipos de variable. 184 SENATI-Computación e Informática ción con VBA a. Variables Alfanuméricas Es toda información que va a contener texto o la unión de textos y números; información que no representa cálculos matemáticos. Ejemplo: Nombre de una persona Dim nombres As String Apellido Paterno de una persona Dim apel_pat As String Dirección de una persona Dim direccion As String Definiendo la cantidad de caracteres que aceptará la variableDim nombres1 As String Dim nombres2 As String *15 nombres1 puede tener cualquier número de caracteres. nombres2 puede tener un máximo de 15 caracteres. En el caso del DNI, código postal, No. De calle, piso del edificio, etc. Es recomendable declararlo como cadena. Para ahorrar memoria. b. Variable Numéricas ¿Qué variables debemos declarar entonces como numéricas ? La respuesta es bien sencilla: Aquellas que van a contener datos con lo que vamos a realizar operaciones matemáticas. Ejemplo: Edad de una persona Dim nombres As Byte Nota de un curso Dim nota1 As Byte Sueldo Básico Dim basico As Single Bonificaciones Dim boni1 As Single Las variables booleanas (True/False) pueden en muchos casos sustituirse por una variable del tipo Byte. Si ese datos True / False se va a introducir en una base de datos o en fichero en el disco, puede ser más prudente poner 0 en vez de False y 1 en vez de True. Una variable byte ocupa muy poco, simplemente 1 byte como su nombre indica. Pero no puede contener números mayores de 255 ni números negativos. Cada vez que declare una variable numérica piense en los valores que puede tener, sobre todo cuando esa variable va a ser el resultado de una operación matemática. Recuerde el escaso margen de una variable tipo Integer ( de -32768 a 32767) Si la aplicación va a tratar moneda, piense en la forma de expresar los números decimales y el número de ellos permitidos, así como el redondeo. SENATI-Computación e Informática 185 Microsoft Office Excel 2007 La variable correcta para este caso es Currency, pero Currency le añade automáticamente el tipo de moneda de cada país lo que con frecuencia es un engorro. Los datos del tipo de moneda los toma del sistema operativo del ordenador, por lo que no se extrañe si le expresa el número en dólares. Cambie el país en su Sistema Operativo Windows. c. Variable Date Otro tipo de variable es Date. Este tipo de variable representa una fecha. Ejemplo: Fecha de nacimiento de una persona Dim fnac As Date d. Variable Boolean Este tipo de variable representa dos valores TRUE (verdadero) o FLASE (falso). Ejemplo: Sexo Dim sexo As Boolean Error típico de un programador novel Creo que esta costumbre viene del lenguaje C. Pero no vale en VB. Se trata de declarar varias variables juntas en una misma línea: Dim Variable1, Variable2, Variable3, Variable4 As String Esta declaración está MAL hecha. Visual Basic interpretará que Variable1, Variable2 y Variable3 son del tipo Variant, y solamente Variable4 la supone como tipo String La forma correcta de hacerlo, si queremos declarar esas variables un una sola línea, es la siguiente : Dim Variable1 As String, Variable2 As String, Variable3 As String, Variable4 As String. Constantes Una constante es un nombre significativo que sustituye a un número o una cadena que no varía. Hay dos orígenes para las constantes: Constantes intrínsecas o definidas por el sistema proporcionadas por Visual Basic. Las constantes simbólicas o definidas por el usuario se declaran mediante la instrucción Const. 186 SENATI-Computación e Informática ción con VBA La sintaxis para declarar una constante es la siguiente: [Public|Private] Const nombre_constante [As tipo] = expresión El argumento nombre_constante es un nombre simbólico válido (las reglas son las mismas que para crear nombres de variable) y expresión está compuesta por constantes y operadores de cadena o numéricos; sin embargo, no puede utilizar llamadas a funciones en expresión. Una instrucción Const puede representar una cantidad matemática o de fecha y hora: Const conPi = 3.14159265358979 Public Const conMaxPlanetas As Integer = 9 Const conFechaSalida = #1/1/95# Se puede utilizar también la instrucción Const para definir constantes de cadena: Public Const conVersion = “ 07.10.A” Const conNombreClave = “Enigma” Puede colocar más de una declaración de constante en una única línea si las separa con comas: Public Const conPi=3.14, conMaxPlanetas=9, conPobMundial=6E+09 Operadores a. Aritméticos ^ Exponenciación * Multiplicación / División \ División entera Mod Residuo entero (Ejm: A Mod B) + Suma - Resta & Concatenación de cadenas b. Comparación = Igual <> Distinto < Menor que SENATI-Computación e Informática 187 Microsoft Office Excel 2007 <= Menor o igual >= Mayor o igual Like Compara dos cadenas * Cero o más caracteres (Ejm: cad Like “ma*”) ? Cualquier carácter # Cualquier dígito (0-9) c. Lógicos And “Y” lógico Or “O” lógico Xor “O” Exclusivo Not Negación Construcciones: If – then, Select Case Las estructuras condicionales le permiten controlar el flujo de ejecución del programa. A continuación se describen las estructuras de control Condicional simple. If .. then Use la estructura If...Then para ejecutar una o más instrucciones basadas en una condición. Puede utilizar la sintaxis de una línea o un bloque de varias líneas: If condición Then Sentencias If condición Then Sentencias End If Donde: Condición. Es una expresión lógica, que devuelve un valor lógico: Verdadero o falso. Ejemplo: If cualquierFecha < Now Then CualquierFecha = Now o If then en una sola línea, sólo puede ejecutar una línea de código If cualquierFecha < Now Then CualquierFecha = Now De este otro modo se pueden ejecutar varias líneas de código End If 188 SENATI-Computación e Informática ción con VBA Condicional doble If...Then...Else Utilice un bloque If...The...Else para definir varios bloques de sentencias, uno de los cuales se ejecutará: If condición1 Then [bloque de sentencias 1] [ElseIf condición2 Then Se evalúa esta condición si es verdadera se ejecuta el bloque de sentencias 1 [Else [bloque de sentencias 2]] ... Si es falsa la condición1, evalúa la condición2, si es verdadera ejecuta el bloque de sentencias 2 End If [bloque de sentencias n]] Si no se cumple ninguna condición se ejecuta el bloque de sentencias n Por ejemplo, la aplicación podría realizar distintas acciones dependiendo del control en que se haya hecho clic de una matriz de controles de menú: Private Sub mnuCut_Click (Index As Integer) If Index = 0 Then „ Comando Cortar CopyActiveControl „ Llama a procedimientos generales ClearActiveControl ElseIf Index = 1 Then „ Comando Copiar CopyActiveControl ElseIf Index = 2 Then „ Comando Borrar ClearActiveControl Else „ Comando Pegar PasteActiveControl End If End Sub o If ClaveUsuario=”DSI” Then „ Permite al usuario entrar al sistema ... ... Else „ Mostrar un mensaje advirtiendo error en la clave ... ... End If SENATI-Computación e Informática 189 Microsoft Office Excel 2007 o Private Sub DeterminaCondición ( ) If Val (txtPromedio) >=13 Then txtCondición = “Aprobado” ElseIf Val (txtPromedio) >= 10 Then txtCondición = “Asistente” Else txtCondición = “Desaprobado” End If End Sub Observe que siempre puede agregar más cláusulas ElseIf a la estructura If...Then. Sinembargo, esta sintaxis puede resultar tediosa de escribir cuando cada ElseIf compara la misma expresión con un valor distinto. Para estas situaciones, puede utilizar la estructura de decisión Select Case. Condicional múltiple Select Case Visual Basic proporciona la estructura Select Case para ejecutar selectivamente un bloque de sentencias entre varios bloques. La estructura Select Case funciona con una única expresión de prueba que se evalúa una vez solamente, al principio de la estructura. Visual Basic compara el resultado de esta expresión con los valores de cada Case de la estructura. Si hay una coincidencia, ejecuta el bloque de sentencias asociado a ese Case: Selec Case expresión_prueba [Case lista_expresiones1 [bloque de sentencias 1]] [Case lista_expresiones2 [bloque de sentencias 2]] . . . [Case Else [bloque de sentencias n]] End Select Cada lista_expresiones es una lista de uno a más valores. Si hay más de un valor en una lista, se separan los valores con comas. Cada bloque de sentencias contiene cero o más instrucciones. Si más de un Case coincide con la expresión de prueba, sólo se ejecutará el bloque de instrucciones asociado con la primera coincidencia. Visual Basic ejecuta las instrucciones de la cláusula (opcional) Case Else si ningún valor de la lista de expresiones coincide con la expresión de prueba. Por ejemplo, suponga que agrega otro comando al menú Edición en el ejemplo If...Then...Else. Podría agregar otra cláusula ElseIf o podría escribir la función con Select Case: 190 SENATI-Computación e Informática ción con VBA Private Sub mnuCut_Click (Index As Integer) Select Case Index Case 0 „ Comando Cortar CopyActiveControl „Llama a procedimientos generales ClearActiveControl Case 1 „ Comando copiar. CopyActiveControl Case 2 „ Comando borrar. ClearActiveControl Case 3 „ Comando Pegar. PasteActiveControl Case Else frmFind.Show „ Muestra el cuadro de diálogo Buscar. End Select End Sub o Select Case TipoUsuario Case “Supervisor” „ Proporciona al usuario privilegios de Supervisor ... ... Case “Usuario” „ Proporciona al usuario privilegios de Usuario ... ... Case Else „ Proporciona al usuario privilegio de invitado ... ... End Select Observe que la estructura Select Case evalúa una expresión cada vez que al principio de la estructura. Por el contrario, la estructura If...Then...Else puede evaluar una expresión diferente en cada sentencia ElseIf. Sólo puede sustituir una esructura If...Then...Else con una estructura Select Case si la intrucción If y cada instrucción ElseIf evalúa la misma expresión. SENATI-Computación e Informática 191 Microsoft Office Excel 2007 Otros Ejemplos If Ventas > 100000 Then strDscto = Format (0.10, “Fixed”) ElseIf Ventas > 50000 Then strDscto = Format (0.05, “Fixed”) Else strDscto = Format (0.02, “Fixed”) End If Select Case Cantidad Case 1 sngDscto = 0.0 Case 2, 3 sngDscto = 0.05 Case 4 To 6 sngDscto = 0.10 Case Else sngDscto = 0.20 End Select intRpta = MsgBox (“Guarda cambios antes de salir” , vbYesNo) Select Case intRpta Case vbYes GuardarCambios Unload Me Case vbNo Unload Me End Select Bucles For … Next, While .. Do Las estructuras de repetición o bucle le permiten ejecutar una o más líneas de código repetidamente. Las estructuras de repetición que acepta Visual Basic son: Do...Loop For...Next For Each...Next 192 SENATI-Computación e Informática ción con VBA Do...Loop Utilice el bucle Do para ejecutar un bloque de sentencias un número indefinido de veces. Hay algunas variantes en la sentencia Do...Loop, pero cada una evalúa una condición numérica para determinar si continúa la ejecución. Como ocurre con If...Then, la condición debe ser un valor o una expresión que dé como resultado False (cero) o True (distinto de cero). Do While condición Sentencias Loop Cuando se ejecuta este bucle Do, primero evalúa condición. Si condición es False (cero), se salta todas las sentencias. Si es True (distinto de cero) Visual Basic ejecuta las sentencias, vuelve a la instrucción Do While y prueba la condición de nuevo. Por tanto, el bucle se puede ejecutar cualquier número de veces, siempre y cuando condición sea distinta de cero o True. Nunca se ejecutan las sentencias si condición es False inicialmente. Por ejemplo, este procedimiento cuenta las veces que se repite una cadena destino dentro de otra cadena repitiendo el bucle tantas veces como se encuentre la cadena de destino: Function ContarCadenas (cadenalarga, destino) Dim posición, contador posición = 1 Do While InStr (posición, cadenalarga, destino) posición = InStr (posición, cadenalarga, destino)+1 contador = contador + 1 Loop ContarCadenas = contador End Function Si la cadena destino no está en la otra cadena, InStr devuelve 0 y no se ejecuta el bucle. Otra variante de la instrucción Do...Loop Do Sentencias Loop While condición Se ejecuta las sentencias primero y prueba la condición después de cada ejecución. Esta variación garantiza al menos una ejecución de sentencias: Hay otras dos variantes análogas a las dos anteriores, excepto en que repiten el bucle siempre y cuando condición sea False en vez de True. Hace el bucle cero o más veces Hace el bucle al menos una vez Do Until condición Do Sentencias Sentencias Loop Loop Until condición SENATI-Computación e Informática 193 Microsoft Office Excel 2007 For...Next Utiliza una variable llamada contador que incrementa o reduce su valor en cada repetición del bucle. La sintaxis es la siguiente: For contador = iniciar To finalizar [Step incremento] Los argumentos contador, iniciar, finalizar e incremento son todos numéricos. Sentencias Next [contador] El argumento incremento puede ser positivo o negativo. Si incremento es positivo, iniciar debe ser menor o igual que finalizar o no se ejecutarán las sentencias del bucle. Si incremento es negativo, iniciar debe ser mayor o igual que finalizar para que se ejecute el cuerpo del bucle. Si no se establece Step, el valor predeterminado de incremento es 1. Al ejecutar el bucle For, Visual Basic: 1. Establece contador al mismo valor que iniciar. 2. Comprueba si contador es mayor que finalizar. Si lo es, Visual Basic sale del bucle. (Si incremento es negativo, Visual Basic comprueba si contador es menor que finalizar.) 3. Ejecuta las sentencias. 4. Incrementa contador en 1 o en incremento, si se especificó. 5. Repite los pasos 2 a 4. Este código imprime los nombres de todas las fuentes de pantalla disponibles: Private Sub Form-Click ( ) Dim I As Integer For i = 0 To Screen.FontCount Print Screen.Fonts (i) Next End Sub For Each...Next El bucle For Each...Next es similar al bucle For...Next, pero repite un grupo de sentencia por cada elemento de una colección de objetos o de una matriz en vez de repetir las sentencias un número especificado de veces. Esto resulta especialmente útil si no se sabe cuántos elementos hay en la colección. He aquí la sintaxis del bucle For Each...Next: 194 SENATI-Computación e Informática ción con VBAFor Each elemento In grupo Sentencias Next elemento El siguiente ejemplo habilita todos los Cuadro de Texto del formulario: Private Sub ModoEdición ( ) Dim control For Each control In form1.Controls If TypeOf control Is TextBox Then Control.Enabled = True End If Next control End Sub Tenga en cuenta las restricciones siguientes cuando utilice For Each...Next: Para las colecciones, elemento sólo puede ser una variable Variant, una variable Object genérica o un objeto mostrado en el Examinador de objetos. Para las matrices, elemento sólo puede ser una variable Variant. No puede utilizar For Each...Next con una matriz de tipos definidos por el usuario porque un Variant no puede contener un tipo definido por el usuario. Salida de una Estructura de Control La instrucción Exit le permite salir directamente de un bucle For o de un bucle Do. La sintaxis de la sentencia Exit es sencilla: Exit For puede aparecer tantas veces como sea necesario dentro de un bucle For y Exit Do puede aparecer tantas veces como sea necesario dentro de un bucle Do: For contador = iniciar To finalizar [Step incremento] [bloque sentencias] [Exit For] [bloque sentencias] Next [contador] Do [{While / Until} condición] [bloque de sentencias] [Exit Do] [bloque de sentencias] Loop Do [bloque de sentencias] [Exit Do] [bloque de sentencias] Loop [{While / Until} condición] Exit For y Exit Do Son muy útiles ya que, algunas veces, resulta apropiado salir inmediatamente de un bucle sin realizar más iteraciones o sentencias dentro del bucle. Cuando utilice la instrucción Exit para salir de un bucle, el valor de la variable contador difiere, dependiendo de cómo haya salido del bucle: Cuando termina un bucle, la variable contador contiene el valor del límite superior más el paso. Cuando sale de un bucle prematuramente, la variable contador conserva su valor según las reglas usuales del alcance. Cuando sale antes del final de una colección, la variable contador contiene Nothing si se trata de un tipo de dato Object y Empty si es un tipo de dato Variant. SENATI-Computación e Informática 195 Microsoft Office Excel 2007 Trabajar con rangos de celda Utilizando la notación A1 Puede hacer referencia a una celda o rango de celdas del estilo de referencia A1 utilizando el método Range. La siguiente subrutina cambia el formato de las celdas A1:D5 a negrita. Sub FormatoRango() Workbooks("Libro1").Sheets("Hoja1").Range("A1:D5").Font.Bold = True End Sub La siguiente tabla muestra algunas referencias de estilo A1 utilizando el método Range. Referencia Significado Range("A1") Celda A1 Range("A1:B5") Celdas de la A1 a la B5 Range("C5:D9,G9:H16") Selección de varias áreas Range("A:A") Columna A Range("1:1") Fila 1 Range("A:C") Columnas de la A a la C Range("1:5") Filas de la 1 a la 5 Range("1:1,3:3,8:8") Filas 1, 3 y 8 Range("A:A,C:C,F:F") Columnas A, C y F Hacer referencia a celdas utilizando números de índice Esta propiedad devuelve un objeto Range que representa una sola celda. En el siguiente ejemplo, Cells(6,1) devuelve la celda A6 de la hoja Hoja1. Entonces, la propiedad Value se establece en 10. Sub IngreseValor() Worksheets("Hoja1").Cells(6, 1).Value = 10 End Sub 196 SENATI-Computación e Informática ción con VBA La propiedad Cells funciona bien para ejecutar bucles en un rango de celdas, ya que puede sustituir las variables por los números de índice, como se muestra en el siguiente ejemplo. Sub CicloHojas() Dim Contador As Integer For Contador = 1 To 20 Worksheets("Hoja1").Cells(Contador,3).Value = Contador Next Contador End Sub Hacer referencia a filas y columnas Estas propiedades devuelven un objeto Range que representa un rango de celdas. En el siguiente ejemplo, Rows(1) devuelve la fila uno de la hoja Hoja1. A continuación, la propiedad Bold del objeto Font del rango se establece en True. Sub FilasNegrita() Worksheets("Hoja1").Rows(1).Font.Bold = True End Sub La siguiente tabla muestra algunas referencias de fila y columna, utilizando las propiedades Rows y Columns. Referencia Significado Rows(1) Fila uno Rows Todas las filas de la hoja de cálculo Columns(1) Columna uno Columns("A") Columna uno Columns Todas las columnas de la hoja de cálculo Para trabajar con varias filas o columnas al mismo tiempo, cree una variable de objeto y utilice el método Union, combinando varias llamadas a la propiedad Rows o Columns. SENATI-Computación e Informática 197 Microsoft Office Excel 2007 El siguiente ejemplo cambia a negrita el formato de las filas uno, tres y cinco de la hoja de cálculo uno del libro activo. Sub FilasNegritaVarios() Worksheets("Hoja1").Activate Dim myUnion As Range Set myUnion = Union(Rows(1), Rows(3), Rows(5)) myUnion.Font.Bold = True End Sub Hacer referencia a celdas utilizando una notación abreviada Puede utilizar el estilo de referencia A1 o un rango con nombre entre paréntesis como método abreviado para la propiedad Range. No es necesario escribir la palabra "Range" o utilizar comillas, como se muestra en los siguientes ejemplos. Sub BorrarRango() Worksheets("Hoja1").[A1:B5].ClearContents End Sub Sub AsinarValor() [MyRange].Value = 30 End Sub Hacer referencia a rangos con nombre Es más sencillo identificar los rangos por nombre que por la notación A1. Para asignar un nombre a un rango seleccionado, haga clic en el cuadro de nombre situado a la izquierda de la barra de fórmulas, escriba un nombre y, a continuación, presione la tecla ENTRAR. Hacer referencia a un rango con nombre El siguiente ejemplo hace referencia al rango denominado "MiRango" en el libro "Libro1.xls". Sub FormatoRango () Range("Libro1.xls!MiRango").Font.Italic = True End Sub 198 SENATI-Computación e Informática ción con VBA El siguiente ejemplo hace referencia al rango de hojas de cálculo específico denominado "Hoja1!Ventas" en el libro "Libro1.xls". Sub FormatSales() Range("[Libro1.xls]Hoja1!Ventas").BorderAround Weight:=xlthin End Sub Para seleccionar un rango con nombre utilice el método GoTo, que activa el libro y la hoja de cálculo y, a continuación, selecciona el rango. Sub LimpiaRango() Application.Goto Reference:="Libro1.xls!MiRango" Selection.ClearContents End Sub El siguiente ejemplo muestra cómo se escribiría el mismo procedimiento para el libro activo. Sub LimpiarRango() Application.Goto Reference:="MiRango" Selection.ClearContents End Sub Ejecutar un bucle en las celdas de un rango con nombre El siguiente ejemplo ejecuta un bucle en cada una de las celdas de un rango con nombre utilizando un bucle For Each...Next. Si el valor de cualquiera de las celdas del rango supera el valor de limit, el color de la celda cambia a amarillo. Sub AplicarColor() Const Limit As Integer = 25 For Each c In Range("MiRango") If c.Value > Limit Then c.Interior.ColorIndex = 27 End If Next c End Sub SENATI-Computación e Informática 199 Microsoft Office Excel 2007 Hacer referencia a celdas en relación con otras celdasUna manera de trabajar con una celda relacionada con otra es utilizar la propiedad Offset. El siguiente ejemplo asigna un formato de doble subrayado al contenido de la celda situada una fila más abajo y a tres columnas de la hoja de cálculo activa. Sub SubrayadoDoble() ActiveCell.Offset(1, 3).Font.Underline = xlDouble End Sub Nota. Puede grabar macros que utilicen la propiedad Offset en lugar en referencias absolutas. En el menú Herramientas elija Macro, haga clic en Grabar nueva macro, haga clic en Aceptar y, a continuación, en el botón Referencia relativa en la barra de herramientas de grabación de macros. Para ejecutar un bucle en un rango de celdas, utilice en el rango una variable con la propiedad Cells. El siguiente ejemplo rellena las primeras 20 celdas de la tercera columna con valores entre 5 y 100, en incrementos de 5. La variable contador se utiliza como índice de fila para la propiedad Cells. Sub HojasValores() Dim contador As Integer For contador = 1 To 20 Worksheets("Hoja1").Cells(contador, 3).Value = contador * 5 Next contador End Sub Hacer referencia a celdas usando un objeto Range Si establece una variable de objeto para un objeto Range, puede manipular fácilmente el rango utilizando el nombre de la variable. El siguiente procedimiento crea la variable de objeto myRange y, a continuación, asigna la variable al rango A1:D5 de la hoja Hoja1 del libro activo. Las instrucciones posteriores modifican las propiedades del rango, sustituyendo el nombre de la variable por el objeto del rango. Sub Aleatorio() Dim MiRango As Range Set MiRango = Worksheets("Hoja1").Range("A1:D5") MiRango.Formula = "=RAND()" MiRango.Font.Bold = True End Sub 200 SENATI-Computación e Informática ción con VBA Hacer referencia a todas las celdas de la hoja de cálculo Al aplicar la propiedad Cells a una hoja de cálculo sin especificar un número de índice, el método devuelve un objeto Range que representa todas las celdas de la hoja de cálculo. El siguiente procedimiento Sub borra el contenido de todas las celdas de la hoja Hoja1 del libro activo. Sub ClearSheet() Worksheets("Hoja1").Cells.ClearContents End Sub Hacer referencia a varios rangos Utilizando el método apropiado puede hacer referencia fácilmente a varios rangos. Utilice los métodos Range y Union para hacer referencia a cualquier grupo de rangos; utilice la propiedad Areas para hacer referencia al grupo de rangos seleccionados en una hoja de cálculo. Usar la propiedad Range Puede hacer referencia a varios rangos con la propiedad Range, pero debe poner comas entre dos o más referencias. El siguiente ejemplo borra el contenido de los tres rangos de la hoja Hoja1. Sub ClearRanges() Worksheets("Hoja1").Range("C5:D9,G9:H16,B14:D18"). _ ClearContents End Sub Los rangos con nombre permiten que la propiedad Range funcione más fácilmente con varios rangos. El siguiente ejemplo funciona cuando los tres rangos con nombre están en la misma hoja. Sub BorrarNombres() Range("MiRango, TLista, TValores").ClearContents End Sub Usar el método Union Puede combinar varios rangos en un objeto Range utilizando el método Union. El siguiente ejemplo crea un objeto Range denominado myMultipleRange, los define como A1:B2 y C3:D4 y, a continuación, asigna el formato de negrita a los rangos combinados. SENATI-Computación e Informática 201 Microsoft Office Excel 2007 Sub MultiplesRangos() Dim r1, r2, MiMultiplesRangos As Range Set r1 = Sheets("Hoja1").Range("A1:B2") Set r2 = Sheets("Hojat1").Range("C3:D4") Set MiMultiplesRangos = Union(r1, r2) MiMultiplesRangos.Font.Bold = True End Sub Usar la propiedad Areas Puede utilizar la propiedad Areas para hacer referencia al rango o conjunto de rangos seleccionados en una selección de varias áreas. El siguiente procedimiento cuenta las áreas de la selección. Si existe más de un área, se muestra un mensaje de advertencia. Sub BusquedaMultiple() If Selection.Areas.Count > 1 Then MsgBox "Existe más de una area de selección…" End If End Sub Bucles en un rango de celdas Al utilizar Visual Basic, con frecuencia necesitará ejecutar el mismo bloque de instrucciones en cada una de las celdas de un rango. Para ello, combine una instrucción de repetición y uno o más métodos para identificar cada celda, una a una, y ejecutar la operación. Una manera de ejecutar un bucle en un rango es utilizar el bucle For...Next con la propiedad Cells. Al utilizar la propiedad Cells, puede sustituir el contador del bucle, u otras variables o expresiones, por el número de índice de las celdas. En el siguiente ejemplo se sustituye la variable contador por el índice de fila. El procedimiento ejecuta un bucle en el rango C1:C20, estableciendo en 0 (cero) cualquier número cuyo valor absoluto sea menor que 0,01. Sub EstableceCero1() For Contador = 1 To 20 Set curCell = Worksheets("Hoja1").Cells(Contador, 3) If Abs(curCell.Value) < 0.01 Then curCell.Value = 0 Next Contador End Sub 202 SENATI-Computación e Informática ción con VBA Otra manera sencilla de ejecutar un bucle en un rango es utilizar el bucle For Each...Next en el conjunto de celdas devuelto por el método Range. Visual Basic establece automáticamente una variable de objeto para la siguiente celda cada vez que se ejecuta el bucle. El siguiente procedimiento realiza un bucle en el rango A1:D20, estableciendo en 0 (cero) cualquier número cuyo valor absoluto sea menor que 0.01. Sub EstableceCero2() For Each c In Worksheets("Hoja1").Range("A1:D10").Cells If Abs(c.Value) < 0.01 Then c.Value = 0 Next End Sub Si no conoce los límites del rango en que desea ejecutar el bucle, puede utilizar la propiedad CurrentRegion para devolver el rango que rodea la celda activa. Por ejemplo, el siguiente procedimiento, cuando se ejecuta desde una hoja de cálculo, ejecuta un bucle en el rango que rodea la celda activa, estableciendo en 0 (cero) todos los números cuyo valor absoluto sea menor que 0.01. Sub EstableceCero3() For Each c In ActiveCell.CurrentRegion.Cells If Abs(c.Value) < 0.01 Then c.Value = 0 Next End Sub Seleccionar y activar celdas Al trabajar con Microsoft Excel, normalmente selecciona una o varias celdas y, a continuación, realiza una acción, como darles formato o escribir valores. En Visual Basic normalmente no es necesario seleccionar las celdas antes de modificarlas. Por ejemplo, si desea escribir una fórmula en la celda D6 utilizando Visual Basic, no es necesario seleccionar el rango D6. Sólo necesita devolver el objeto Range y, a continuación, establecer la propiedad Formula en la fórmula que desee, como se muestra en el siguiente ejemplo. Sub IngreseFormula() Worksheets("Hoja1").Range("D6").Formula = "=SUM(D2:D5)" End Sub Para obtener ejemplos sobre cómo utilizar métodos para controlar las celdas sin seleccionarlas, consulte Cómo hacer referencia a celdas y rangos. SENATI-Computación e Informática 203 Microsoft Office Excel 2007 Usar el método Select y la propiedad Selection El método Select activa las hojas y los objetos de las hojas; la propiedad Selection devuelve un objeto que representa la selección actual de la hoja activa del libro activo.Antes de utilizar la propiedad Selection, debe activar un libro, activar o seleccionar un hoja y, a continuación, seleccionar un rango, u otro objeto, con el método Select. La grabadora de macros suele crear una macro que utiliza el método Select y la propiedad Selection. El siguiente procedimiento Sub se creó utilizando la grabadora de macros, y muestra cómo trabajan juntas Select y Selection. Sub Macro1() Sheets("Hoja1").Select Range("A1").Select ActiveCell.FormulaR1C1 = "Nombres" Range("B1").Select ActiveCell.FormulaR1C1 = "Direccion" Range("A1:B1").Select Selection.Font.Bold = True End Sub El siguiente ejemplo realiza la misma tarea, sin activar ni seleccionar la hoja de cálculo ni las celdas. Sub Etiquetas() With Worksheets("Hoja1") .Range("A1") = "Nombres" .Range("B1") = "Direccion" .Range("A1:B1").Font.Bold = True End With End Sub Seleccionar celdas en la hoja de cálculo activa Si utiliza el método Select para seleccionar celdas, recuerde que Select sólo funciona en la hoja de cálculo activa. Si ejecuta el procedimiento Sub desde el módulo, el método Select devuelve un error a menos que el procedimiento active la hoja de cálculo antes de utilizar el método Select en un rango de celdas. Por ejemplo, el siguiente procedimiento copia una fila de la hoja "Hoja1" a la hoja "Hoja2" del libro activo. 204 SENATI-Computación e Informática ción con VBA Sub CopiarFilas() Worksheets("Hoja1").Rows(1).Copy Worksheets("Hoja2").Select Worksheets("Hoja2").Rows(1).Select Worksheets("Hoja2").Paste End Sub Activar una celda en una selección Puede utilizar el método Activate para activar una celda en una selección. Sólo puede haber una celda activa, aunque se haya seleccionado un rango de celdas. El siguiente procedimiento selecciona un rango y, a continuación, activa una celda del rango sin cambiar la selección. Sub ActivarRango() Worksheets("Hoja1").Activate Range("A1:D4").Select Range("B2").Activate End Sub Trabajar con rangos 3D Si trabaja con el mismo rango en más de una hoja, utilice la función Array para especificar dos o más hojas a seleccionar. El ejemplo siguiente da formato al borde de un rango tridimensional de celdas. Sub FormatoHojas() Sheets(Array("Hoja2", "Hoja3", "Hoja5")).Select Range("A1:H1").Select Selection.Borders(xlBottom).LineStyle = xlDouble End Sub El ejemplo siguiente aplica el método FillAcrossSheets para transferir los formatos y datos del rango de la hoja Hoja2 a los rangos correspondientes de todas las hojas de cálculo del libro activo. Sub FormatoTodasHojas() Worksheets("Hoja2").Range("A1:H1").Borders(xlBottom).LineStyle=xlDouble Worksheets.FillAcrossSheets (Worksheets("Hoja2").Range("A1:H1")) End Sub SENATI-Computación e Informática 205 Microsoft Office Excel 2007 Trabajar con la celda activa La propiedad ActiveCell devuelve un objeto Range que representa la celda que está activa. Puede aplicar cualquiera de las propiedades o los métodos de un objeto Range a la celda activa, como en el ejemplo siguiente. Sub CeldaActiva1() Worksheets("Hoja1").Activate ActiveCell.Value = 35 End Sub Nota. Sólo se puede trabajar con la celda activa cuando la hoja de cálculo en la que se encuentra sea la hoja activa. Mover la celda activa Puede utilizar el método Activate para designar cuál es la celda activa. Por ejemplo, el siguiente procedimiento convierte B5 en la celda activa y, a continuación, le da formato de negrita. Sub CeldaActiva2() Worksheets("Hoja1").Activate Worksheets("Hoja1").Range("B5").Activate ActiveCell.Font.Bold = True End Sub Nota. Para seleccionar un rango de celdas, use el método Select. Para activar sólo una celda, utilice el método Activate. Puede utilizar la propiedad Offset para pasar a la celda activa. El siguiente procedimiento inserta texto en la celda activa del rango seleccionado y, a continuación, mueve la celda activa una celda a la derecha, sin cambiar la selección. Sub MoverDatos() Worksheets("Hoja1").Activate Range("A1:D10").Select ActiveCell.Value = "Total Mensual" ActiveCell.Offset(0, 1).Activate End Sub 206 SENATI-Computación e Informática ción con VBA Seleccionar las celdas que rodean la celda activa La propiedad CurrentRegion devuelve un rango de celdas limitadas por filas y columnas en blanco. En el siguiente ejemplo, la selección se amplía para incluir las celdas contiguas a la celda activa que contiene datos. A continuación, se asigna el estilo Moneda a este rango. Sub Region() Worksheets("Hoja1").Activate ActiveCell.CurrentRegion.Select Selection.Style = "Currency" End Sub Trabajo con libros y hojas Hacer referencia a hojas por número de índice Un número de índice es un número secuencial asignado a una hoja, según la posición de su etiqueta, contando desde la izquierda, respecto a las hojas del mismo tipo. El siguiente procedimiento utiliza la propiedad Worksheets para activar la hoja de cálculo uno del libro activo. Sub SeleccionarHoja() Worksheets(1).Activate End Sub Si desea trabajar con todos los tipos de hojas (hojas de cálculo, de gráficos, de módulos y de diálogo), utilice la propiedad Sheets. El siguiente procedimiento activa la hoja cuatro del libro. Sub SeleccionarHoja() Sheets(4).Activate End Sub Hacer referencia a hojas por su nombre Puede identificar las hojas por su nombre, utilizando las propiedades Worksheets y Charts. Las siguientes instrucciones activan varias hojas del libro activo. SENATI-Computación e Informática 207 Microsoft Office , Excel 2007 Puede utilizar la propiedad Sheets para devolver una hoja de cálculo, de gráficos, de módulo o de cuadro de diálogo, incluidos todos en el conjunto Sheets. El siguiente ejemplo activa la hoja denominada "hoja1" del libro activo. Sub ActivarHoja() Worksheets("hoja1").Activate End Sub El siguiente ejemplo activa la hoja denominada "grafico1" del libro activo. Sub ActivarHojaGrafico() Sheets("grafico1").Activate End Sub Añadir módulos VBA Para añadir módulos seguir el siguiente procedimiento. 1. Hacer clic en la ficha , botón 2. Se abre la ventana de Visual Basic, hacer clic en el menú botón 3. Se presenta la ventana de programación de módulo. Trabajar con UserForms Para añadir formularios seguir el siguiente procedimiento. 1. Hacer clic en la ficha , botón 2. Se abre la ventana de Visual Basic, hacer clic en el menú 208 SENATI-Computación e Informática ción con VBA Botón 3. Se presenta la ventana de formulario Uso de controles de formulario A continuación se describe el uso de controles de un formulario Control Marco (Frame) Este control permite agrupar otros controles para darle mayor funcionalidad a la interfaz. Los controles Botones de Opción necesariamente tienen que estar agrupados por el control Marco. Para agrupar controles, dibuje primero el control Marco y, a continuación, dibuje los controles dentro de Marco. Propiedades Caption Título de marco. Enabled Determina si está habilitado para responder a las acciones del usuario. Name Nombre del control. Visible Determina si el Marco y los controles que contiene están visibles o no.Control Casilla de Verificación (CheckBox) Las casillas de verificación se utilizan para proporcionar al usuario opciones de tipo Si/No o Verdadero/Falso. Cuando el usuario selecciona una opción (activa la casilla), aparece una marca de verificación () dentro de la casilla. Propiedades Caption Descripción que acompaña a la casilla. Enabled True/False. Determina si está habilitado para responder a las acciones del usuario. Name Nombre del control. SENATI-Computación e Informática 209 Microsoft Office Excel 2007 Value 0 – Unchecked (Vacío, no marcado) 1 – Checked (Marcado) 2 – Grayed (Gris, Indefinido) Visible Determina si la casilla está visible o no. Eventos Click Ocurre cuando el usuario hace clic sobre la casilla. Control Botón de Opción (OptionButton) Estos controles se utilizan para que el usuario seleccione una opción de un grupo opciones. La opción seleccionada tiene un punto en el centro. Propiedades Caption Descripción que acompaña a la opción. Enabled True/False. Determina si está habilitado para responder a las acciones del usuario. Name Nombre del control. Value True/False, marcado o no marcado. Visible True/False. Determina si el botón está visible o no. Eventos Click Ocurre cuando el usuario hace clic sobre el botón. 210 SENATI-Computación e Informática ción con VBA Control Cuadro de Lista (ListBox) Un control ListBox muestra una lista de elementos entre los cuales el usuario puede seleccionar uno o más elementos. Si el número de elementos supera el número que puede mostrarse, se agregará automáticamente una barra de desplazamiento al control ListBox La propiedad List es un arreglo que contiene los elementos de la lista, y comienza con índice 0. La propiedad ListCount establece el número total de elementos de la lista. La propiedad ListIndex contiene el índice del elemento seleccionado, el cual es un número entre 0 (primer elemento) y el número total de elementos en la lista –1 (ListCount – 1). Si no se selecciona ningún elemento, el valor de la propiedad ListIndex será –1. La propiedad NewIndex contiene el índice del último elemento añadido a la lista. Esto puede ser útil si desea hacer algo con el elemento añadido, por ejemplo, que sea el elemento actualmente seleccionado. Propiedades Enabled True/False. Determina si el control responde a las acciones del usuario. List Arreglo con los elementos de la lista. ListCount Número de elementos de la lista. ListIndex Elemento seleccionado. MultiSelect Establece si es posible seleccionar varios elementos o uno solo. Name Nombre del control. Selected Arreglo de valores lógicos paralelo y del mismo tamaño al arreglo list, indica que elementos han sido seleccionados (True) de la lista. Se utiliza en lugar de ListIndex cuando establecemos la propiedad Multiselect en 1 ó 2. Sorted True/False. Establece los elementos se ordenan alfabéticamente. Style Establece el comportamiento del control. Text Devuelve el elemento seleccionado en el cuadro de lista; el valor de retorno es siempre equivalente al que devuelve la expresión List(ListIndex). Es de sólo lectura en tiempo de diseño y es de sólo lectura en tiempo de ejecución. Métodos AddItem Permite añadir nuevos elementos a la lista. RemoveItem Permite eliminar elementos de la lista. SENATI-Computación e Informática 211 Microsoft Office Excel 2007 Eventos Click Ocurre cuando el usuario interactúa con el control. Ejemplos: Muestra en el Cuadro de Texto txtGaseosa el elemento seleccionado Private Sub lstGaseosas_Click() txtGaseosa.Text = lstGaseosas.Text End Sub Añade un nuevo elemento al Cuadro de Lista lstGaseosas Private Sub cmdAgregar_Click() Dim strNuevoElemento As String strNuevoElemento = InputBox("Ingrese una nueva gaseosa:", _ "Nueva gaseosa") If Trim(strNuevoElemento) <> "" Then lstGaseosas.AddItem strNuevoElemento End If End Sub Elimina el elemento actual del Cuadro de Lista lstGaseosas Private Sub cmdEliminar_Click() If lstGaseosas.ListIndex <> -1 Then lstGaseosas.RemoveItem lstGaseosas.ListIndex End If End Sub Control Cuadro Combinado (ComboBox) Un control ComboBox combina las características de un control TextBox y un control ListBox; los usuarios pueden introducir información en la parte del cuadro de texto o seleccionar un elemento en la parte de cuadro de lista del control. 212 SENATI-Computación e Informática ción con VBA Para agregar o eliminar elementos en un control ComboBox, se usa el método AddItem o RemoveItem. Establezca las propiedades List, ListCount y ListIndex para permitir a un usuario tener acceso a los elementos de un control ComboBox. Como alternativa, puede agregar elementos a la lista mediante la propiedad List en tiempo de diseño. Propiedades Enabled True/False. Determina si el control responde a las acciones del usuario. List Arreglo con los elementos de la lista. ListCount Número de elementos de la lista ListIndex Elemento seleccionado. Name Nombre del control. Sorted True/False. Establece si los elementos se ordenan alfabéticamente. Style Establece el comportamiento del control. Text Texto que contiene el control. Métodos AddItem Permite añadir nuevos elementos a la lista. RemoveItem Permite eliminar elementos de la lista. Eventos Click Ocurre cuando el usuario interactúa con el control Change Ocurre cuando el valor de la propiedad Text es modificado. Constante Valor Descripción vbComboDropDown 0 (Predeterminado) Cuadro combinado desplegable. Incluye una lista desplegable y un cuadro de texto.El Usuario puede seleccionar datos en la lista o escribir en cuadro de texto. vbComboSimple 1 Cuadro combinado simple. Incluye un cuadro de texto y una lista, que no se despliega. Incremente la propiedad Height para mostrar más elementos de la lista. vbComboDrop- DownList 2 Lista desplegable. Este estilo sólo permite la selección desde la lista desplegable. SENATI-Computación e Informática 213 Microsoft Office Excel 2007 Propiedad Style Esta propiedad establece el comportamiento del control ComboBox, y puede tomar los siguientes valores: Ejemplo En la siguiente interfaz se ilustra el uso del control ComboBox y la propiedad Style. Muestra la gaseosa seleccionada por el usuario en la etiqueta lblGaseosa Private Sub cboGaseosas_Click() lblGaseosa.Caption = cboGaseosas.Text End Sub Actualiza la etiqueta lblGaseosa cuando el usuario modifica el control cboGaseosas Private Sub cboGaseosas_Change() lblGaseosa.Caption = cboGaseosas.Text End Sub Muestra el encuestado seleccionado por el usuario en la etiqueta lblEncuestado Private Sub cboEncuestados_Click() lblEncuestado.Caption = cboEncuestados.Text End Sub 214 SENATI-Computación e Informática ción con VBA Muestra en la etiqueta lblCiudad el elemento seleccionado del control cboCiudades Private Sub cboCiudades_Click() lblCiudad.Caption = cboCiudades.Text End Sub Funciones VBA InputBox, MsgBox Una de las formas más simples de obtener información para y desde el usuario es utilizandolas funciones MagBox e InpuBox respectivamente. Función MsgBox() Los cuadros de mensaje ofrecen un modo simple y rápido de consultar a los usuarios por información simple o para permitirles tomar decisiones sobre el camino que su programa debe tomar. Puede usar esta función para mostrar diferentes tipos de mensaje y botones con los cuales el usuario da una respuesta. Rpta = MsgBox("¿Está seguro de eliminar a este cliente?" vbQuestion + vbYesNo, "Confirmación") Función InpuBox() La función InputBox muestra un mensaje en un cuadro de diálogo, espera que el usuario escriba un texto o haga clic en un botón y devuelve un tipo String con el contenido del cuadro de texto. strCodigo = InputBox("Ingrese el código del cliente a buscar:","Búsqueda", "CLI0001") Metodo GetOpenfilename , GetSaveAsFileName Función GetOpenfilename () Este método nos permite desplegar el cuadro de dialogo abrir (del menu archivo) pero no abre el archivo indicado. SENATI-Computación e Informática 215 Microsoft Office Excel 2007 El método nos devuelve una cadena con la ruta y nombre del archivo seleccionado. Sintaxis Object.GetOpenFilename(FileFilter,FilterIndex,Title,ButtonText,Multiselect) Argumentos FileFilter. Opcional. Una serie especifica con criterios de filtro de archivo. FilterIndex. Opcional. Los números del índice por defecto bajo criterios de filtro de archivo. Titulo. Opcional .El titulo del cuadro de dialogo. si se omite, el titulo.. mostrara "Abrir" ButtonText. Solo para Macintosh Multiselect. Opcional. Si es verdadero, se pueden seleccionar varios nombres de archivos El argumento Filtro de archivo determínalo que muestra el cuadro de dialogo de los archivos del tipo lista desplegable. Consiste en pares de series de filtro de archivo seguido del comodín especificado. Si se omite sera por defecto : "All File(*.*),*.*" Ejemplo El argumento Filterindex especificara el tipo de archivo que aparece por defecto, 'el titulo del argumento es un texto que se despliega en la barra del título. si el argumento de multiselect es verdadero,el usuario puede seleccionar varios archivos(y se devolveran en una serie) Private Sub CommandButton1_Click() Dim filtrox As String Dim FilterIndex As Integer Dim titulo As String Dim nombreArchivo As Variant 'Configurar Filtro para la lista de archivos filtrox = "Archivos de texto (*.txt),*.txt," & _ "Word(*.doc),*.doc, " & _ "Excel (*.xls), *.xls, " & _ "Power Point(*.ppt), *.ppt, " & _ "Todos los archivos (*.*),*.* " 216 SENATI-Computación e Informática ción con VBA 'Mostrar por defecto todos los archivos FiltroIndex = 3 titulo = "Ejemplo" 'Obtener Nombre del archivo nombreArchivo = Application.GetOpenFilename(FileFilter:=filtrox, FilterIndex:=FiltroIndex, Title:=titulo) TextBox1.Text = nombreArchivo End Sub Función GetSaveAsFileName Permite grabar un archivo Ejemplo Private Sub CommandButton2_Click() Dim FileSaveName As Variant FileSaveName = Application.GetSaveAsFilename( _ Filefilter:="Libro de microsoft Office Excel (*.Xls), *.Xls," & "Ficheros de TEXTO (*.TXT), *.TXT", _ Title:="Guardar Archivo", _ InitialFileName:="MyLibro666", _ FilterIndex:=1) 'Si Anulamos la operacion con Cancelar... If FileSaveName = False Then MsgBox "El libro no será Guardado", vbInformation + vbOKOnly, "ATENCION:" Exit Sub End If ActiveWorkbook.SaveAs Filename:=FileSaveName End Sub Crear y abrir libro Crear un libro nuevo Para crear un nuevo libro en Visual Basic, utilice el método Add. El siguiente procedimiento crea un nuevo libro. Microsoft Excel asigna automáticamente el SENATI-Computación e Informática 217 Microsoft Office Excel 2007 nombre BookN al libro, donde N es el siguiente número disponible. El nuevo libro se convertirá en el libro activo. Sub CrearNuevoLibro() Workbooks.Add End Sub Abrir un libro Al abrir un nuevo libro utilizando el método Open, se convierte en un miembro del conjunto Workbooks. El siguiente procedimiento abre un libro denominado Amortizacion.xls, ubicado en la carpeta SENATI de la unidad C. Sub AbrirLibro() Workbooks.Open("C:\SENATI\Amortizacion.xls") End Sub Cuestionarios 1. Realice un formulario aplicativo de acuerdo a las necesidades de su área donde labores, donde pueda aplicar los conocimiento aprendidos en programación. 2. Crear un formulario aplicativo que permita ingresar una contraseña al abrir una hoja de cálculo. 3. Crear un atajo que permita llamar a un formulario que contiene un calendario. 218 SENATI-Computación e Informática ción con VBA Ejercicios utilizando Macro, Formulario y VBA Ejercicio 1: Números primos Grabar el archivo con el nombre primo.xls Option Explicit Sub primos() ' Igual que primos pero evitando usar etiquetas y goto Dim i As Long Dim j As Long Dim p As Long Dim n As Long Dim primo As Boolean n = InputBox("¿Hasta que número? (máximo 821507)", "Calculo de primos") p = 1 Application.Workbooks("primos.xls").Sheets("Hoja1").Range("c6").Select ActiveCell.Value = 2 ActiveCell.Offset(1, 0).Value = 3 For i = 5 To n Step 2 primo = True For j = 3 To Sqr(i) Step 2 If (i / j) - Int(i / j) = 0 Then primo = False: Exit For Next j If primo Then p = p + 1 ActiveCell.Offset(p, 0).Value = i End If Next i End Sub Sub Limpiar() Range("B6").Select Selection.CurrentRegion.Select Selection.ClearContents Range("B6").Select End Sub SENATI-Computación e Informática 219 Microsoft Office Excel 2007 Ejercicio 2: Fechas Option Explicit Sub nacimiento() Dim dias As Integer, Dsemana As Integer, Factual As Date, d As String, cumple As Date Rem Dsemana es una variable que da un número que indica el día de la semana Rem dado por la función WEEKDAY, que en Excel es =DIASEM(fecha) Static Fnacimiento As Date Factual = Date 'Date es la función de VBA equivalente a =HOY() Fnacimiento = Factual Fnacimiento = InputBox(Prompt:="Introduzca su fecha de nacimiento", _ Title:="Formato DD-MM-AAAA", Default:=Fnacimiento) dias = Factual - Fnacimiento Dsemana = Application.WorksheetFunction.Weekday(Fnacimiento) Select Case Dsemana Case 1: d = "Domingo" Case 2: d = "Lunes" Case 3: d = "Martes" Case 4: d = "Miercoles" Case 5: d = "Jueves" Case 6: d = "Viernes" Case 7: d = "Sabado" End Select MsgBox Prompt:="Usted nació un " & d & " hace " & dias & " días" & Chr(10) _ & "Tiene " & CalEdad(Fnacimiento) & " Años", _ Title:="Esta información es correcta siempre que hoy sea " & Factual End Sub 220 SENATI-Computación e Informática ción con VBA 'Función que calcula la edad en años Function CalEdad(Fnacimiento As Date) Dim Fecha As Date CalEdad = Abs(DateDiff("yyyy", Fnacimiento, Date)) Fecha = DateAdd("YYYY", CalEdad, Fnacimiento) If Fecha > Date Then CalEdad = CalEdad - 1 End Function Sub Trimestres() 'Proporciona el trimestre en el que se encuentra una fecha Dim LaFecha As Date Dim Msj LaFecha = InputBox("Escriba una fecha:") Msj = "Trimestre: " & DatePart("q", LaFecha) 'DatePart es una función VBA MsgBox Msj End Sub Ejercicio3: TIR Option Explicit Sub CalculaTIR() Range("F7").Value = 0 Range("H7").Value = 1 Do While Abs(Range("G8")) > 0.00001 'error admitido If Range("G8") < 0 Then Range("H7") = Range("G7") Else Range("F7") = Range("G7") End If 'La siguiente línea se utiliza para retrasar la ejecución de la macro 'de esta forma se puede ver como converge la tasa a la TIR Application.Wait Now + TimeValue("00:00:1") Loop End Sub SENATI-Computación e Informática 221 Microsoft Office Excel 2007 Ejercicio 4: =PAGO Option Explicit Sub prestamo() Static Principal 'Variable estática. No cambia Static Tasa Static Terminos Dim Pago As Double Principal = Application.InputBox(Prompt:="Principal (100000 por jemplo)",Default:=Principal) Tasa = Application.InputBox(Prompt:="Tipo de interés nominal anual (4,75 por ejemplo)", Default:=Tasa) Terminos = Application.InputBox(Prompt:="Número de años (30 por ejemplo)",Default:=Terminos) 'Vea como se usa la función de Excel Pmt (Pago) sin necesidad de calcularla en una celda Pago = Application.WorksheetFunction.Pmt(Tasa / 1200, Terminos * 12, Principal) MsgBox Prompt:="La Mensualidad es " & Format(-Pago, "Currency"), Title:="Calculadora de Préstamos" End Sub Ejercicio 5: Listado de hojas 222 SENATI-Computación e Informática ción con VBA Option Explicit Sub NombreHojas() 'Pone los nombres de las hojas, salvo la primera Dim contador As Integer For contador = 1 To Sheets.Count With Sheets(1) Cells(contador + 5, 6).Value = Sheets(contador).Name End With Next End Sub Sub Limpia() Range("F6").Select Selection.CurrentRegion.Select Selection.ClearContents Range("A1").Select End Sub Ejercicio 6: Eliminar registros en blanco Option Explicit Sub EliminarFilasEnBlanco() Dim strC As String, lngFila As Long With Worksheets("Hoja1") 'Nombre de la hoja For lngFila = 1 To .UsedRange.Rows.Count If WorksheetFunction.CountA(.Rows(lngFila)) = 0 Then strC = strC & lngFila & ":" & lngFila & "," Next lngFila Application.ScreenUpdating = False .Range(Left(strC, Len(strC) - 1)).Delete Application.ScreenUpdating = True End With End Sub SENATI-Computación e Informática 223 Microsoft Office Excel 2007 Ejercicio 7: Funciones personalizadas Option Explicit Function DiasLaborablesYSabados(Fecha_Inicial As Date, Fecha_Final As Date, Optional Festivos As Range) As Long Dim Laborables As Long Dim i As Long Dim c As Variant Dim F As Long Dim esta As Boolean esta = False Laborables = 0 If Festivos Is Nothing Then For i = Fecha_Inicial To Fecha_Final If i Mod 7 <> 1 Then Laborables = Laborables + 1 224 SENATI-Computación e Informática ción con VBA End If Next i Else For i = Fecha_Inicial To Fecha_Final If i Mod 7 <> 1 Then esta = False For Each c In Festivos F = CDate(c) If i = F Then esta = True: Exit For Next c If Not esta Then Laborables = Laborables + 1 End If Next i End If DiasLaborablesYSabados = Laborables End Function Ejercicio 8: Filtrar la base de datos Sub Filtra() Range("basedatos").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:= _ Range("H5:K6"), CopyToRange:=Range("H12:K12"), Unique:=False Range("A1").Select End Sub SENATI-Computación e Informática 225 Microsoft Office Excel 2007 Sub Auto_Open() 'Copiamos y pegamos, con pegado especial valores, las celdas y9.ab9 'que son las que generan la base de datos. Range("Y9:AB9").Select Selection.Copy Range("B6:E1005").Select ActiveSheet.Paste Application.CutCopyMode = False Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False Application.CutCopyMode = False 'Nombramos la base de datos como basedatos Range("B5").Select Selection.CurrentRegion.Select ActiveWorkbook.Names.Add Name:="basedatos", RefersToR1C1:="=Hoja1!R5C2:R1005C5" Range("A1").Select End Sub Ejercicio 9: Eliminar valores duplicados de una lista Option Explicit Function CuentaListaA() 226 SENATI-Computación e Informática ción con VBA Application.Workbooks("EliminarValores.xls").Worksheets("Hoja1").Range("C5").Activate Selection.End(xlDown).Select CuentaListaA = ActiveCell.Row - 5 End Function Sub Repetidos() 'Borra los elementos de la columna E que esten en la C 'Pero sólo los borra una vez. Si se repiten en C sólo borra el 1º 'Si se quiere que se eliminen todos quitar del programa la vble. "salir" Dim posicion As Long Dim salir As Boolean Dim comodin Dim respuesta As String * 5 Dim filasiniciales As Long Dim filasfinales As Long filasiniciales = CuentaListaA Range("E6").Select posicion = 1 While ActiveCell.Value <> "" comodin = ActiveCell.Value Range("C6").Select salir = False While ActiveCell.Value <> "" And salir = False If ActiveCell.Value = comodin Then ActiveCell.Font.Bold = True respuesta = MsgBox("¿Deseas borrar la celda " & ActiveCell.Address & "?", 4, "¡¡Encontrado!!") If respuesta = vbYes Then 'Edición, Eliminar, Desplazar las celdas hacia arriba Selection.Delete Shift:=xlUp End If salir = True Else ActiveCell.Offset(1, 0).Select End If Wend posicion = posicion + 1 Range("E6").Select ActiveCell.Offset(posicion - 1, 0).Select Wend filasfinales = CuentaListaA MsgBox "La Lista A inicialmente tenia " & filasiniciales & " filas." & Chr(13) _ & "Se han eliminado " & filasiniciales - filasfinales & " filas." & Chr(13) _ & "Por tanto, quedan " & filasfinales & " filas." End Sub SENATI-Computación e Informática 227 Microsoft Office Excel 2007 Ejercicio 10: Rellenar y Eliminar registros de una lista 'En las celdas vacias de una tabla copia el valor de la celda precedente Sub RellenarCeldas() Range("B5").Select 228 SENATI-Computación e Informática