1Programaci´n Visual Basic (VBA) para Excel y An´lisis Num´rico          o                                    a         e ...
Contents1 Programaci´n Visual Basic (VBA) para Excel             o                                                        ...
Chapter 1Programaci´n Visual Basic (VBA)           opara Excel1.1     Introducci´n                  oMicrosof Excel c es u...
VBA para Excel                                                    M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 4     ...
VBA para Excel                                               M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 5          ...
VBA para Excel                                                 M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 6        ...
VBA para Excel                                             M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 7            ...
VBA para Excel                                               M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 8          ...
VBA para Excel                                             M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 9            ...
VBA para Excel                                               M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 10         ...
VBA para Excel                                              M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 11          ...
VBA para Excel                                              M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 12          ...
VBA para Excel                                            M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 13            ...
VBA para Excel                                           M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 14             ...
VBA para Excel                                               M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 15         ...
VBA para Excel                                            M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 16            ...
VBA para Excel                                                  M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 17      ...
VBA para Excel                                                 M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 18       ...
VBA para Excel                                              M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 19          ...
VBA para Excel                                            M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 20            ...
VBA para Excel                                           M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 21             ...
VBA para Excel                                              M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 22          ...
VBA para Excel                                                    M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 23    ...
VBA para Excel                                           M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 24             ...
VBA para Excel                                           M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 25             ...
VBA para Excel                                           M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 26             ...
VBA para Excel                                           M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 27             ...
VBA para Excel                                             M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 28           ...
VBA para Excel                                                   M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 29     ...
VBA para Excel                                            M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 30            ...
VBA para Excel                                          M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 31              ...
VBA para Excel                                                          M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. ...
VBA para Excel                                                       M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 33 ...
VBA para Excel                                                 M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 34       ...
VBA para Excel                                             M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 35           ...
VBA para Excel                                            M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 36            ...
VBA para Excel                                                   M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 37     ...
Vba excel mnumericos1
Vba excel mnumericos1
Vba excel mnumericos1
Vba excel mnumericos1
Vba excel mnumericos1
Vba excel mnumericos1
Vba excel mnumericos1
Vba excel mnumericos1
Vba excel mnumericos1
Vba excel mnumericos1
Vba excel mnumericos1
Vba excel mnumericos1
Vba excel mnumericos1
Vba excel mnumericos1
Vba excel mnumericos1
Vba excel mnumericos1
Vba excel mnumericos1
Vba excel mnumericos1
Vba excel mnumericos1
Vba excel mnumericos1
Vba excel mnumericos1
Vba excel mnumericos1
Vba excel mnumericos1
Vba excel mnumericos1
Vba excel mnumericos1
Vba excel mnumericos1
Vba excel mnumericos1
Vba excel mnumericos1
Vba excel mnumericos1
Vba excel mnumericos1
Vba excel mnumericos1
Vba excel mnumericos1
Vba excel mnumericos1
Vba excel mnumericos1
Vba excel mnumericos1
Vba excel mnumericos1
Vba excel mnumericos1
Vba excel mnumericos1
Vba excel mnumericos1
Upcoming SlideShare
Loading in …5
×

Vba excel mnumericos1

1,014 views
906 views

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,014
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
0
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Vba excel mnumericos1

  1. 1. 1Programaci´n Visual Basic (VBA) para Excel y An´lisis Num´rico o a e M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. e Escuela de Matem´tica a Instituto Tecnol´gico de Costa Rica o Octubre 2005 Versi´n 0.1 o
  2. 2. Contents1 Programaci´n Visual Basic (VBA) para Excel o 3 1.1 Introducci´n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o . . . . . . . . . . . . 3 1.2 Evaluaci´n de funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o . . . . . . . . . . . . 3 1.2.1 Funciones definidas por el usuario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.2.2 Errores comunes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.2.3 Evaluando una funci´n en varios tipos de par´metros . . . . . . . . . o a . . . . . . . . . . . . 5 1.3 Gr´ficas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . a . . . . . . . . . . . . 8 1.4 Programaci´n de macros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o . . . . . . . . . . . . 9 1.4.1 Introducci´n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o . . . . . . . . . . . . 9 1.4.2 Funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.5 Elementos de programaci´n en VBA . . . . . . . . . . . . . . . . . . . . . . o . . . . . . . . . . . . 13 1.5.1 Flujo secuencial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 1.5.2 Flujo condicional (If - Else) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 1.5.3 Flujo repetitivo (For-Next, While-Wend, Do While-Loop) . . . . . . . . . . . . . . . . . 16 1.5.4 Manejo de rangos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 1.5.5 Subrutinas. Edici´n y ejecuci´n de una subrutina . . . . . . . . . . . o o . . . . . . . . . . . . 23 1.5.6 Ejecuci´n de una subrutina mediante un bot´n . . . . . . . . . . . . o o . . . . . . . . . . . . 25 1.5.7 Matrices din´micas . . . . . . . . . . . . . . . . . . . . . . . . . . . . a . . . . . . . . . . . . 29 1.5.8 Inclusi´n de procedimientos de borrado . . . . . . . . . . . . . . . . o . . . . . . . . . . . . 35 1.6 Evaluando expresiones matem´ticas escritas en lenguaje matem´tico com´n a a u . . . . . . . . . . . . 38 1.6.1 Usando clsMathParser. Sintaxis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 1.6.2 Ejemplo: un graficador 2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 1.6.3 Ejemplo: un graficador de superficies 3D . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 1.6.4 Ejemplo: series num´ricas y series de potencias . . . . . . . . . . . . e . . . . . . . . . . . . 492 Elementos de An´lisis Num´rico a e 54 2.1 Soluci´n de ecuaciones de una variable . . . . . . . . . . . . . . . . o . . . . . . . . . . . . . . . . . 54 2.1.1 M´todo de Newton-Raphson . . . . . . . . . . . . . . . . . e . . . . . . . . . . . . . . . . . 54 2.2 Integraci´n . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . o . . . . . . . . . . . . . . . . . 56 2.2.1 M´todo de Romberg para integraci´n . . . . . . . . . . . . e o . . . . . . . . . . . . . . . . . 56 2.2.2 La funci´n Gamma . . . . . . . . . . . . . . . . . . . . . . . o . . . . . . . . . . . . . . . . . 58 2.2.3 Cuadratura gaussiana e integral doble gaussiana. . . . . . . . . . . . . . . . . . . . . . . . 59 2.3 Problemas de valor inicial para ecuaciones diferenciales ordinarias . . . . . . . . . . . . . . . . . . 66 2.3.1 Existencia y unicidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 2.3.2 M´todo de Euler . . . . . . . . . . . . . . . . . . . . . . . . e . . . . . . . . . . . . . . . . . 67 2.3.3 M´todos de Heun . . . . . . . . . . . . . . . . . . . . . . . . e . . . . . . . . . . . . . . . . . 71 2
  3. 3. Chapter 1Programaci´n Visual Basic (VBA) opara Excel1.1 Introducci´n oMicrosof Excel c es un software para el manejo de hojas electr´nicas agrupadas en libros para c´lculos de casi o acualquier ´ ındole. Entre muchas otras aplicaciones, es utilizado en el tratamiento estad´ ıstico de datos, as´ como ıpara la presentaci´n gr´fica de los mismos. La hoja electr´nica Excel es ampliamente conocida, en forma gen- o a oeralizada, por profesionales y estudiantes en proceso de formaci´n, pero hay una gran cantidad de usuarios que ono conocen a profundidad su gran potencial y adaptabilidad a los diferentes campos del conocimiento.Para cient´ ıficos e ingenieros, el Excel constituye una herramienta computacional muy poderosa. Tambi´n tiene egran utilidad para ser utilizado en la ense˜anza de las ciencias y la Ingenier´ particularmente, en la ense˜anza n ıa, nde los m´todos num´ricos. Pese a que existen en el mercado programas computacionales muy sofisticados, tales e ecomo MATLAB, MATHEMATICA, etc., no est´n tan disponibles como Excel, que usualmente forma parte del apaquete b´sico de software instalado en las computadoras que funcionan bajo el sistema Windows c de Microsoft. aA continuaci´n se brinda al lector una breve introducci´n a algunas actividades de programaci´n con macros o o oescritos en VBA (una adaptaci´n de Visual Basic para Office de Microsoft), definidos desde una hoja electr´nica o ode Excel. Salvo peque˜as diferencias para versiones en ingl´s, el material puede ser desarrollado en cualquier n eversi´n. o1.2 Evaluaci´n de funciones o1.2.1 Funciones definidas por el usuarioA manera de ejemplo, vamos a evaluar la funci´n o cos(x) f (x) = 2x3 + ln(x) − + sen(x) ex 1. Como al evaluar f (x) se debe recurrir a varias funciones b´sicas que se invocan desde Excel, se puede a tener acceso a su sintaxis, pulsando el ´ ıcono fx y seleccionar ‘Matem´ticas y Trigonom´tricas’. a e 2. Para escribir una f´rmula, seleccionamos una celda para escribir el valor a ser evaluado; por ejemplo, o podemos digitar el valor 1.1 en la celda B3. 3
  4. 4. VBA para Excel M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 4 e Figure 1.1: Funciones predefinidas en Excel. 3. Ahora en la celda C3 digitamos, de acuerdo a la sintaxis de la versi´n de Excel en espa˜ol1 , la f´rmula: o n o =2*B3^3+LN(B3)-COS(B3)/EXP(B3)+SENO(B3) Una vez que ha sido digitada, simplemente se pulsa la tecla ‘Entrar’ o ‘Enter’. Figure 1.2: Al evaluar f´rmulas, a menudo se requiere evaluar varias funciones predefinidas. o1.2.2 Errores comunesConforme vamos digitando nuestras primeras f´rmulas, nos van apareciendo algunos errores que usualmente son odebidos a un manejo inadecuado de la sintaxis o a la incompatibilidad con la configuraci´n de la computadora. oA continuaci´n se describen algunas situaciones que pueden aparecer. o 1. El valor de error #¿NOMBRE? aparece cuando Excel no reconoce texto en una f´rmula. Deber revisar la o sintaxis de dicha f´rmula o, si es una macro, verificar que est´ en un m´dulo de esta hoja. o e o 2. El valor de error #¡VALOR! da cuando se utiliza un tipo de argumento (u operando) incorrecto. Este error se da por ejemplo, cuando evaluamos una funci´n num´rica en una celda que contiene algo que no sea un o e n´mero (Por defecto, el contenido de una celda vac´ es cero). u ıa 3. El valor de error #¡NUM! se aparece cuando hay un problema con alg´n n´mero en una f´rmula o funci´n. u u o o Por ejemplo, si evaluamos una funci´n logar´ o ıtmica en cero o en un n´mero negativo. u 1 La versi´n que estamos usando est´ en espa˜ ol. Por ejemplo, en la versi´n en ingl´s de Excel, se usa SIN(x) en lugar de o a n o eSENO(x).
  5. 5. VBA para Excel M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 5 e 4. El valor de error #¡DIV/0! se produce cuando se divide una f´rmula por 0 (cero). o 5. El valor de error #¡REF! se da cuando una referencia a una celda no es v´lida. a 6. Dependiendo de la forma en que est´ configurado el sistema Windows, debe usarse punto o coma para e separar la parte decimal de los n´meros a evaluar. Para personalizarlo, se debe entrar al panel de control u y en la ‘Configuraci´n regional’ se selecciona ‘N´meros’. En la primera cejilla, ‘S´ o u ımbolo Decimal’ se selecciona el punto o la coma, seg´n sea el caso. Finalmente, se presiona el bot´n ‘Aplicar’ y luego u o ‘Aceptar’. 7. Una situaci´n que a veces es confundida con un error se da cuando el sistema trabaja con poca precisi´n y o o se presentan valores num´ricos no esperados. Por ejemplo, si el formato de una celda se ha definido para e dos posiciones, entonces la operaci´n +1.999+1 efectuado en dicha celda dar´ como resultado el valor 2, o a que no es otra cosa que el resultado de tal suma redondeado a dos decimales. El valor correcto se obtiene aumentado la precisi´n con el ´ o ıcono correspondiente: Tambi´n se puede cambiar la precisi´n en el men´ ‘Formato-Celdas-N´mero-Posiciones decimales’. e o u u Estos cambios son s´lo de apariencia, pues, independientemente del n´mero de d´ o u ıgitos que sean desplega- dos, Excel manipula los n´meros con una precisi´n de hasta 15 d´ u o ıgitos. Si un n´mero contiene m´s de 15 u a d´ ıgitos significativos, Excel convertir´ los d´ a ıgitos adicionales en ceros (0).1.2.3 Evaluando una funci´n en varios tipos de par´metros o aMuchas f´rmulas a evaluar tienen argumentos de distinto tipo, pues algunos argumentos var´ (a veces con o ıanun incremento determinado), mientras que otros permanecen constantes. Por lo general estos argumentos sontomados de celdas espec´ıficas, por lo que es importante saber manejar distintos escenarios para la evaluaci´n ode una funci´n o f´rmula. o oEvaluaci´n con argumentos variables oContinuando con el ejemplo que iniciamos en la secci´n 2.1, a partir de la celda B4 podemos continuar digitando ovalores, siempre en la columna B y con el cuidado de que estos n´meros no se salgan del dominio de la funci´n u o cos(x)f (x) = 2x3 + ln(x) − + sen(x), que en este caso es el conjunto de los n´meros reales positivos. Una vez u exhecho ´sto, se eval´a la funci´n f (x) en la celda C3, como se hizo previamente. Luego, seleccionamos esta e u omisma celda C3 y se ubica el mouse en la esquina inferior derecha, arrastr´ndolo hasta la celda deseada. Otra aposibilidad es hacer un doble clic en la esquina inferior derecha de la celda a copiar y esto realiza la copiaautom´ticamente. aEvaluaci´n con argumentos variables y/o constantes oEs com´n tener que evaluar funciones o f´rmulas que dependen de varios par´metros, algunos de los cuales se u o amantienen fijos mientras que otros son variables. Ejemplo 1
  6. 6. VBA para Excel M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 6 e Figure 1.3: Copia de una f´rmula en un grupo de celdas. oEl siguiente ejemplo describe una funci´n con dos par´metros y una variable. o a K K − P0La funci´n P (t) = o −kt , con A = , describe el tama˜o de una poblaci´n en el momento t. n o 1 + Ae P0Aqu´ ı: . k es una constante de proporcionalidad que se determina experimentalmente, dependiendo de la poblaci´n o particular que est´ siendo modelada, a . P0 es la poblaci´n inicial y o . K es una constante llamada capacidad de contenci´n o capacidad m´xima que el medio es capaz de sostener. o aSi queremos evaluar P (t) para distintos valores del tiempo t en d´ seguimos la siguiente secuencia de pasos: ıas, 1. Para empezar, es importante escribir encabezados en cada una de las columnas (o filas) donde vamos a escribir los datos que ser´n los argumentos de la funci´n. En este caso, comenzando en la celda B3, a o escribimos las etiquetas P0 K k t P(t). 2. A continuaci´n escribimos los valores de los par´metros, comenzando en la celda B4 o a 100 1000 0.08 0. 3. Ahora escribimos la f´rmula de la funci´n P (t) en la celda G4: o o =C$4/(1+((C$4-B$4)/B$4)*EXP(-D$4*E4)) Como puede observarse, el unico argumento variable es t y nos interesa mantener a los otros argumentos ´ constantes. Para mantener un valor (que se lea en una celda) constante, se le agrega el s´ ımbolo $ antes del n´mero de fila, como por ejemplo C$4. u En nuestro ejemplo, los argumentos constantes son los que est´n en las celdas B4, C4 y D4, mientras que a el valor de t en la celda E4, es variable.
  7. 7. VBA para Excel M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 7 e Figure 1.4: Evaluaci´n con par´metros constantes y un par´metro con un incremento variable. o a a 4. Finalmente, escribimos varios valores para t en la columna E, seleccionamos la celda F4 y arrastramos para evaluar P (t) en el resto de valores de t. dP P Nota: P (t) es la soluci´n de la llamada ecuaci´n log´ o o ıstica = kP 1− . dt KConstruyendo rangos con un incremento fijoA menudo necesitamos evaluar una funci´n en una secuencia de valores igualmente espaciados, por lo que a ocontinuaci´n se explica c´mo hacerlo, modificando el ejemplo previo de crecimiento de una poblaci´n. o o o 1. Podemos seleccionar la columna C para poner los valores fijos P0 , K, k y el incremento h. En este caso, por ejemplo, h = 5 servi´ como incremento entre un tiempo y el siguiente, iniciando con t = 0. a 2. En la celda E4 escribimos el tiempo inicial t = 0 y en la celda E5 se escribe el nuevo tiempo con el incremento h: =+E4+C$6 Debemos usar C$6 para que el incremento se mantenga inalterado al copiar esta operaci´n en otra fila o celda situada en una fila diferente. 3. Ahora seleccionamos esta celda E5 y la arrastramos hacia abajo para obtener los nuevos tiempos con el respectivo incremento. Figure 1.5: Evaluaci´n con un par´metro de incremento fijo o aNota: Esto tambi´n se puede hacer escribiendo, en celdas consecutivas, un valor y luego el valor m´s el incre- e amento y luego seleccionando ambas celdas y arrastrando. Sin embargo, en algunos algoritmos es m´s c´modo a o
  8. 8. VBA para Excel M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 8 etener una celda d´nde leer el incremento. o1.3 Gr´ficas aContinuando con el ejemplo anterior en el que se ha evaluado la poblaci´n P (t) en un conjunto de valores del otiempo t, recordemos que en las columnas E y F se han escrito, respectivamente, los valores de t y P (t). Paragraficar P (t) con respecto a t, pordemos seguir los siguientes pasos: 1. Seleccionamos el rango en el cual se encuentran los valores de t y P (t). Este rango puede incluir las celdas que contienen los r´tulos de las columnas. o 2. Presionamos el icono , que activa el asistente para gr´ficos. a Hay varias opciones que podemos elegir para el gr´fico y en nuestro caso podemos elegir el tipo Dispersi´n. a o Figure 1.6: Selecci´n del tipo de gr´fico. o a 3. Presionamos el bot´n Siguiente y luego Finalizar . Antes de finalizar se pueden escoger distintas op- o ciones para personalizar el gr´fico. A continuaci´n se muestra la salida del gr´fico. a o a Figure 1.7: Curva obtenida para el modelo log´ ıstico de crecimiento de una poblaci´n. o La curva obtenida se llama curva log´ ıstica o sigmoide, por la forma de ‘S’ que tiene.
  9. 9. VBA para Excel M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 9 e1.4 Programaci´n de macros o1.4.1 Introducci´n oEl lenguaje Visual Basic para Aplicaciones (VBA), en el contexto de Excel, constituye una herramienta deprogramaci´n que nos permite usar c´digo Visual Basic adaptado para interactuar con las m´ltiples facetas de o o uExcel y personalizar las aplicaciones que hagamos en esta hoja electr´nica. oLas unidades de c´digo VBA se llaman macros. Las macros pueden ser procedimientos de dos tipos: o- Funciones (Function)- Subrutinas (Sub) ).Las funciones pueden aceptar argumentos, como constantes, variables o expresiones. Est´n restringidas a en- atregar un valor en una celda de la hoja. Las funciones pueden llamar a otras funciones y hasta subrutinas (enel caso de que no afecten la entrega de un valor en una sola celda)Una subrutina realiza acciones espec´ ıficas pero no devuelven ning´n valor. Puede aceptar argumentos, como uconstantes, variables o expresiones y puede llamar funciones.Con las subrutinas podemos entregar valores en distintas celdas de la hoja. Es ideal para leer par´metros en aalgunas celdas y escribir en otras para completar un cuadro de informaci´n a partir de los datos le´ o ıdos.Editar y ejecutar macros.Las funciones y las subrutinas se pueden implementar en el editor de Visual Basic (Alt-F11).Para usar una funci´n en una hoja de Excel se debe, en el editor de VB, insertar un m´dulo y editar la funci´n o o oen este m´dulo. Esta acci´n de describe m´s adelante. De la misma manera se pueden editar subrutinas en un o o am´dulo. oUna funci´n se invoca en una hoja, como se invoca una funci´n de Excel o una f´rmula. Una subrutina se puede o o oinvocar por ejemplo desde la ventana de ejecuci´n de macros (Alt-F8) o desde un bot´n que hace una llamada o oa la subrutina (como respuesta al evento de hacer clic sobre ´l, por ejemplo). eEl c´digo que ejecuta un bot´n puede llamar a subrutinas y a las funciones de la hoja. El c´digo del bot´n o o o ono est´ en un m´dulo. En la hoja de edici´n donde se encuentra el c´digo del bot´n, se pueden implementar a o o o ofunciones para uso de este c´digo pero que ser´n desconocidas para la hoja (mensaje de error #¿NOMBRE?). o aNota: un error frecuente es editar una funci´n en un m´dulo que corresponde a una hoja y llamarlo desde otra o ohoja. En este caso se despliega el error (mensaje de error #¿NOMBRE?).1.4.2 FuncionesUna funci´n tiene la siguiente sintaxis: oFunction NombreFun(arg1, arg2,...,argn) Declaraci´n de Variables y constantes o Instruccci´n 1 o Instruccci´n 2 o ...
  10. 10. VBA para Excel M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 10 e Instruccci´n k o NombreFun = Valor de retorno ’comentarioEnd FunctionUna funci´n puede tener o no tener argumentos, pero es conveniente que retorne un valor. Observe que se debe ousar el nombre de la funci´n para especificar la salida: o NombreFun = Valor de retornoNota 1: Al interior de las funciones, se pueden hacer comentarios utilizando (antes de ´stos) la comilla (’). eNota 2: Para el uso de nombres de variables o de cualquier otra palabra reservada de VBA, no se discrimina entre el uso de letras may´sculas y min´sculas. u uEjemplo 1: implementar una funci´n. oVamos a implementar como una macro la funci´n con la que se trabaj´ previamente: o o cos(x) f (x) = 2x3 + ln(x) − + sen(x) exPara su definici´n y utilizaci´n, se siguen los pasos: o o 1. Ingresamos al men´ y en la opci´n Herramientas seleccionamos Macros. Luego se elige Editor de u o Visual Basic: Figure 1.8: Primeros pasos para la definici´n de una macro. o Tambi´n puede usar Alt - F11 e 2. Nuevamente, en el men´ de la ventana que se abre, se elige Insertar, para luego seleccionar M´dulo: u o 3. Ahora en la pantalla de edici´n del m´dulo, escribimos el siguiente c´digo: o o o Function f(x) f = 2 * x ^ 3 + Log(x) - Cos(x) / Exp(x) + Sin(x) End Function 4. Una vez que ha sido editado el c´digo del macro, se salva y salimos del ambiente de programaci´n en o o Visual Basic para volver a la hoja electr´nica de donde partimos. Esto se hace en el men´ Archivo, o u seleccionando Cerrar y Volver a Excel.
  11. 11. VBA para Excel M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 11 e Figure 1.9: Se inserta un m´dulo en el que se escribir´ el c´digo de las macros. o a o Figure 1.10: Escritura del c´digo de una macro. o 5. Para evaluar la funci´n f (x) en algunos valores que se localicen, por ejemplo, desde la fila 3 hasta la fila 6 o de la columna B, nos situamos en una celda en la que nos interese dejar el resultado de dicha evaluaci´n o y se digita +f(B3). Luego se arrastra hasta C6 para copiar la f´rmula, quedando: o Figure 1.11: Evaluaci´n de una funci´n definida por el usuario. o oNota: Para conocer con detalle la sintaxis de las funciones matem´ticas est´ndar que se pueden evaluar en a a Visual Basic, puede usarse la Ayuda del Editor de Visual Basic. Esta sintaxis es un poco diferente a la que maneja Excel para las mismas funciones. Como ya vimos, para implementar la funci´n o cos(x) f (x) = 2x3 + ln(x) − + sen(x) ex • en Excel la sintaxis es: 2*B3^3+LN(B3)-COS(B3)/EXP(B3)+SENO(B3)
  12. 12. VBA para Excel M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 12 e • en VBA la sintaxis es 2 * x ^ 3 + Log(x) - Cos(x) / Exp(x) + Sin(x) Observe, por ejemplo, que la funci´n logaritmo natural ln(x), en Excel se escribe LN mientras que en VBA o se escribe Log.Ejemplo 2: lectura de par´metros en celdas aUna vez m´s vamos a trabajar con el modelo de crecimiento poblacional descrito anteriormente. La funci´n a o K P (t) = , 1 + Ae−ktcon K − P0 A= . P0Ahora evaluaremos P (t) para distintos valores del tiempo t en d´ pero esta vez haremos dicha evaluaci´n ıas, omediante una macro para definir P (t) .Los par´metros los vamos a leer desde unas celdas ubicadas en la columna C. Para hacer referencia a una celda, ase usa el c´digo o Cells(fila,columna)pero escribiendo ‘columna’ en formato num´rico. Por ejemplo, la celda C5 se invoca como e Cells(5,3)Lo primero que hacemos es escribir, en el editor de VBA, la f´rmula de P (t), luego la invocamos en la celda F3 o(de nuestra hoja de ejemplo) y arrastramos. Para ´sto, se siguen los siguientes pasos: e 1. En primer lugar, abrimos una hoja Excel, que se llame por ejemplo Poblacion.xls. Luego se escriben los valores de los par´metros, tal y como puede observarse en la siguiente figura: a Figure 1.12: Ubicaci´n inicial de los par´metros. o a 2. Ahora ingresamos al men´ y en la opci´n Herramientas seleccionamos Macros. Luego se elige Editor de Visual Basic. u o Nuevamente, en el men´ de la ventana que se abre, se elige Insertar, para luego seleccionar M´dulo y u o escribir el siguiente c´digo: o Function P(t) P0 = Cells(2, 3) ’P0 est’a en la celda C2 LimPobl = Cells(4, 3) ’K est’a en la celda C4 k = Cells(5, 3) ’k est’a en la celda C5 A = (LimPobl - P0) / P0 P = LimPobl / (1 + A * Exp(-k * t)) End Function
  13. 13. VBA para Excel M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 13 e Figure 1.13: Captura de algunos par´metros constantes de las celdas de la hoja. a De esta forma, la ventana de edici´n de Visual Basic, quedar´ as´ o ıa ı: 3. Una vez que ha sido editado el c´digo de la macro, se guarda y salimos del ambiente de programaci´n en o o Visual Basic para volver a la hoja electr´nica de donde partimos. Este retorno se hace siguiendo el men´ o u Archivo y seleccionando Cerrar y Volver a Excel. 4. Para evaluar la funci´n P (t) en los valores de t que est´n en la fila que inicia en F2, nos situamos en la o a celda F3 y se digita +P(F2). Luego se arrastra hasta J2 para copiar la f´rmula, quedando: o Figure 1.14: Resultado final al evaluar la macro del modelo poblacional.1.5 Elementos de programaci´n en VBA oUn programa computacional escrito mediante cualquier lenguaje de programaci´n puede verse a grandes rasgos ocomo un flujo de datos, algunos jugando el papel de datos de entrada, otros son datos que cumplen algunafunci´n temporal dentro del programa y otros son datos de salida. A lo largo del programa es muy frecuente oque sea necesaria la entrada en acci´n de otros programas o procesos. A mayor complejidad del problema que oresuelve el programa, mayor es la necesidad de programar por aparte algunos segmentos de instrucciones quese especializan en una tarea o conjunto de tareas.Hay tres tipos de estructuras b´sicas que son muy utilizadas en la programaci´n de un algoritmo, a saber, la a oestructura secuencial, la estructura condicional y la repetitiva.A continuaci´n se explica, con ejemplos programados como macros de Excel, estas estructuras. Tambi´n se o eincluyen los programas en seudoc´digo y diagramas de flujo para explicar de un modo m´s gr´fico la l´gica del o a a oprograma. El uso de estos ultimos es cada vez menor, pues el seudoc´digo por lo general es suficientemente ´ oclaro y se escribe en lenguaje muy cercano al lenguaje natural.1.5.1 Flujo secuencialEl flujo secuencial consiste en seguir una secuencia de pasos que siguen un orden predeterminado.
  14. 14. VBA para Excel M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 14 ePor ejemplo, un programa que a partir de un n´mero N de d´ calcula la cantidad de segundos que hay en u ıas,esta cantidad de d´ ıas. Este programa se puede ver como una secuencia de varios pasos: • Inicio: Ingresa el n´mero N de d´ u ıas • Paso 1: H = 24*N, para determinar la cantidad de horas • Paso 2: M = 60*H, para determinar la cantidad de minutos. • Paso 3: S = 60*M, para determinar la cantidad de segundos. • Paso 4: Retorne S. • Fin.La macro correspondiente a esta secuencia de c´lculos puede escribirse como sigue: a Function CalculeSegundos(Dias) CantHoras = 24 * Dias CantMinutos = 60 * CantHoras CalculeSegundos = 60 * CantMinutos End Function Figure 1.15: Flujo secuencial1.5.2 Flujo condicional (If - Else)Un flujo condicional se presenta en un programa o procedimiento que debe escoger una acc´n o proceso a eje- ocutar, dependiendo de condiciones que puedan cumplirse.El caso m´s sencillo ocurre cuando el programa verifica si una condici´n se cumple y en caso de ser verdadera a oejecuta un proceso, en tanto que si es falsa ejecuta otro proceso.En VBA tenemos la instrucci´n o
  15. 15. VBA para Excel M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 15 e If...Then...Else Ejecuta condicionalmente un grupo de instrucciones, dependiendo del valor de una expresi´n. o Sintaxis If condici´n Then o instrucciones Else instrucciones-else Puede utilizar la siguiente sintaxis en formato de bloque: If condici´n Then o instrucciones ElseIf condici´n Then o instrucciones-elseif ... Else instrucciones-else End IfNota: En la ayuda del editor de Visual Basic, tenemos acceso a la referencia del lenguaje. Ejemplo 2En este ejemplo veremos c´mo usar la instrucci´n If...Then...Else o o √ √Obtener un programa que calcule aproximaciones de 2, sabiendo que la sucesi´n {xn }n∈N converge a o 2,definida en forma recurrente mediante la relaci´n: o  1 2  xn+1 = 2 (xn + xn )  x0 = 1El programa deber´ estimar el error absoluto de las aproximaciones y ser´ capaz de escribir un mensaje de ´xito a a eo de fracaso, dependiendo de si el error absoluto es o no menor que una tolerancia dada.Para los resultados que aparecen en la gr´fica anterior pueden programarse las siguiente macros para ser eval- auadas en cada columna:Function AproxDeRaiz(x) AproxDeRaiz = (1 / 2) * (x + 2 / x)End FunctionFunction CalculoElError(Aproximacion, ValorExacto) CalculoElError = Abs(Aproximacion - ValorExacto)End Function
  16. 16. VBA para Excel M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 16 e √ Figure 1.16: Resultado de la aproximaci´n de o 2.Function verificaTol(Error, Tol) If (Error < Tol) Then verificaTol = "EXITO" Else verificaTol = "FRACASO" End IfEnd FunctionEl diagrama siguiente ilustra la forma en que esta ultima funci´n de verificaci´n act´a con base en el valor de ´ o o usus dos par´metros de entrada: a Figure 1.17: Diagrama de flujo condicional para verificar si se alcanz´ la tolerancia. o1.5.3 Flujo repetitivo (For-Next, While-Wend, Do While-Loop)El flujo repetitivo se presenta en un algoritmo cuando se requiere la ejecuci´n de un proceso o parte de un oproceso sucesivamente, hasta que ocurra una condici´n que permita terminar. oEste tipo de flujos repetitivos se presentan en tres formas que obedecen a maneras diferentes de razonarlos peroque en el fondo hacen lo mismo: • Utilizar un contador que empiece en un n´mero y termine en otro, ejecutando el proceso cada vez que el u contador tome un valor distinto.
  17. 17. VBA para Excel M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 17 e • Mientras una condici´n sea verdadera, ejecutar un proceso y regresar a la condici´n. o o • Ejecutar un proceso, hasta que una condici´n deje de cumplirse. oEn VBA tenemos las siguientes instrucciones para realizar procesos iterativos: 1. For ... Next Repite un grupo de instrucciones un n´mero especificado de veces. u Sintaxis (las instrucciones entre ‘[ ]’ son instrucciones adicionales) For contador = inicio To fin [Step incremento] instrucciones [Exit For] instrucciones Next contador 2. While...Wend Ejecuta una serie de instrucciones mientras una condici´n dada sea True. o Sintaxis While condici´n o intrucciones Wend Nota: No hay un Exit While. En una subrutina, si fuera necesario, se podr´ usar Exit Sub ıa 3. Una instrucci´n muy parecida a While pero m´s eficiente es Do o a Sintaxis Do while condici´n o instrucciones [Exit Do] Loop Ejemplo 3Para ilustrar estas formas de realizar un flujo repetitivo, vamos a aproximar la suma de una serie alternada conun error estimado menor que una cantidad tol dada.Consideremos la serie alternada
  18. 18. VBA para Excel M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 18 e ∞ 1 1 1 1 (−1)k = −1 + − + − ... k2 4 9 16 k=1La suma parcial N -´sima viene dada por e N 1 1 1 1 1 SN = (−1)k = −1 + − + − . . . + (−1)N 2 k2 4 9 16 N k=1es decir S1 = −1 = −1 S2 = −1 + 1/4 = −0.75 S3 = −1 + 1/4 − 1/9 = −0.861111... S3 = −1 + 1/4 − 1/9 + 1/16 = −0.798611... . . . ∞ 1De acuerdo con la teor´ de series alternadas, la serie ıa (−1)k es convergente. Si su suma es S, al aproxi- k2 k=1 1marla con la suma parcial SN , el error de la aproximaci´n es menor que o , es decir (N + 1)2 1 |S − SN | ≤ (N + 1)2Primer problemaDada una tolerancia TOL, calcular cada una de las sumas parciales hasta que el error de aproximaci´n sea menor oque TOLSoluci´n o Figure 1.18: Sumas parciales y estimaci´n del error o
  19. 19. VBA para Excel M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 19 eImplementamos dos macros, una para el c´lculo de las sumas parciales y otra para hacer la verificaci´n del error a oestimado. En este caso, vamos a suponer que TOL est´ en la celda B33 aFunction sumaParcial(hastaN) Dim Acum, signo As Integer Acum = 0signo = -1For k = 1 To hastaN Acum = Acum + signo * 1 / k ^ 2 signo = -signoNext ksumaParcial = Acum End Function’--------------------------------------------------------------------Function verificaTol(elN, tol) If (1 / (elN + 1) ^ 2 > tol) Then verificaTol = "Error estimado > " + Str(tol) ’tol es un n´mero u Else ’no una String verificaTol = "OK, error estimado <" + Str(tol) ’por esto debemos usar ’Str’ End IfEnd FunctionEn la primera llamada de las macros se us´ sumaParcial(C33) y verificaTol(C33;B$33) oSegundo problemaDada una lista de tolerancias TOL (donde T OL es una cantidad positiva, como 10−1 ,10−8 , etc.), aproximar la 1suma de la serie con una cantidad N de t´rminos lo suficientemente grande de tal manera que e < T OL. (N + 1)2 1La cantidad juega en este problema el papel de una cota del error, al aproximar la serie correspondiente (N + 1)2hasta el t´rmino N-´simo e e 1. Primera soluci´n: o 1 Dado que hay que sumar hasta el t´rmino N-´simo tal que e e < T OL, en este caso es posible (N + 1)2 despejar el entero positivo N , quedando: 1 N> −1 T OL 1 Tomamos N como la parte entera superior de T OL − 1, por lo que se calcula: 1 N= (parte entera) T OL Los pasos a seguir para programar la suma a partir de la tolerancia dada, son los siguientes: • Inicio: Ingresa la tolerancia con que se har´ la aproximaci´n. a o
  20. 20. VBA para Excel M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 20 e 1 • Paso 1: Calcular N = T OL • Paso 2: Acum = 0 (Se iniciliza el acumulador para la suma). • Paso 3: Para k = 1 . . . N: 1 Acum = Acum + (−1)k k2 • Paso 4: Retorne Acum. • Fin. Figure 1.19: Diagrama de flujo correspondiente a la primera soluci´n. o Observe que en cada sumando, se incluye el factor (−1)k , que en la pr´ctica, m´s que una potencia, lo que a a indica es el cambio de signo en los t´rminos sucesivos. Para evitarle al programa c´lculos innecesarios, e a podemos inicializar una variable signo en −1 y en cada paso de la instrucci´n repetitiva se cambia al signo o contrario. La macro correspondiente a este programa puede escribirse como sigue: Function SumaParcial(Tol) Acum = 0 signo = -1 N = Int(1 / Sqr(Tol)) For k = 1 To N Acum = Acum + signo * 1 / k ^ 2 signo = -signo Next k SumaParcial = Acum End Function La siguiente figura muestra la evaluaci´n de esta macro para algunos valores de la tolerancia. o 2. Segunda soluci´n: o En esta soluci´n no es necesario calcular el valor de N , sino que se suman los t´rminos mientras no se o e haya alcanzado la tolerancia. El programa en seudoc´digo se puede escribir como sigue: o • Inicio: Ingresa la tolerancia con que se har´ la aproximaci´n. a o • Paso 1: Iniciar con N = 1. • Paso 2: Acum = -1 (Se iniciliza el acumulador para la suma con el primer t´rmino). e 1 • Paso 3: Mientras > T ol : (N + 1)2
  21. 21. VBA para Excel M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 21 e Figure 1.20: Resultados calculados mediante la primera soluci´n. o . N =N +1 1 . Acum = Acum + (−1)N N2 • Paso 4: Retorne Acum. • Fin. Figure 1.21: Diagrama de flujo correspondiente a la segunda soluci´n. o El c´digo es o Function SumaParcial2(Tol) N = 1 Acum = -1 signo = 1 While (1 / (N + 1) ^ 2 > Tol) N = N + 1 Acum = Acum + signo * 1 / N ^ 2 signo = -signo Wend SumaParcial2 = Acum End Function
  22. 22. VBA para Excel M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 22 e1.5.4 Manejo de rangosUna rango en Excel corresponde a una selecci´n de celdas. Una selecci´n de las celdas de una fila o una columna o ose maneja en Excel como una matriz de orden 1 × n o de orden n × 1 (un vector). La selecci´n de un bloque ode celdas se maneja como una matriz n × m. Si una celda est´ en blanco, se lee un cero. a Ejemplo 4Promedio simple. Consideremos una tabla con 5 notas, todas con igual peso. Figure 1.22: Promedio simple.Para calcular el promedio simple, en cada fila, vamos a hacer una macro que recibe un rango, cuenta las notas,suma y divide entre el n´mero de notas. uFunction PromedioSimple(R As Range) As Double ’R es la variableque recibe el rango Dim n As Integer Dim sump As Double sump = 0 n = R.EntireColumn.Count ’cantidad de notas en el rango For Each x In R ’suma de las notas sump = sump + x Next x Sume = sump / n ’promedio simpleEnd FunctionEn primera celda de la columna Promedio, llamamos a la macro con: PROMEDIO(C52:G52) pues en este caso elrango es C52:G52. Ejemplo 5El Promedio eliminando las dos notas m´s bajas. En este caso, a un conjunto de notas les calculamos el apromedio simple pero eliminando las dos notas m´s bajas. El programa PromedioQ suma las n notas de una afila (rango), localiza la posici´n (en el vector R) de las dos notas m´s bajas y luego le resta a la suma estas dos o anotas para luego dividir entre n − 2. En este caso, el rango R es una matriz 1 × n, o sea, se puede ver como unvector de n componentes.Function PromedioQ(R As Range) As Double Dim n, i, Imin1, Imin2 As Integer
  23. 23. VBA para Excel M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 23 e Figure 1.23: Promedio de notas, eliminando las dos m´s bajas. a Dim suma As Double suma = 0 n = R.EntireColumn.Count ’n´mero de elementos de la selecci´n u o For i = 1 To n suma = suma + R(1, i) ’R es una matriz 1xn (o sea, un vector) Next i ’En R no se hace referencia a la celda Imin1 = 1 ’POSICION de la 1ra nota m´nima en R ı For i = 1 To n If R(1, i) < R(1, Imin1) Then Imin1 = i End If Next i Imin2 = 1 ’POSICION de la segunda nota m´nima en R ı If Imin1 = 1 Then Imin2 = 2 End If ’comparar con todos excepto Imini1 For i = 1 To n If (R(1, i) < R(1, Imin2)) And (i <> Imin1) Then Imin2 = i End If Next i PromedioQ = (suma - R(1, Imin1) - R(1, Imin2)) / (n - 2)End FunctionNota: Tambi´n podr´ e ıamos resolver este problema usando Selection.Sort pero la programaci´n es un poco om´s compleja. a1.5.5 Subrutinas. Edici´n y ejecuci´n de una subrutina o oLa subrutinas o procedimientos es otro de los tipos b´sicos de programas en Visual Basic. Una descripci´n de la a osintaxis de una subrutina que no es completa, pero s´ suficiente para los alcances de este material es la siguiente2 : ı 2 Aparte de la posibilidad de declarar la subrutina como Private o Public, tambi´n se puede declarar como Friend, pero esto etiene que ver m´s con la programaci´n orientada a objetos, que no se aborda en el presente material a o
  24. 24. VBA para Excel M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 24 e Sintaxis: Sub Nombre-de-Subrutina(lista-argumentos) instrucciones End Sub o tambi´n e [Private | Public] [Static] Sub Nombre-de-Subrutina(lista-argumentos) instrucciones End SubLass partes entre corchetes indican que son opcionales. Adem´s: a Public. Es opcional. Indica que la subrutina puede ser llamada por todas las dem´s subrutinas sin a importar donde se encuentre. Private. Es opcional. Indica que la subrutina puede ser llamada solamente por otras subrutinas que se encuentren en el mismo m´dulo. o Static. Es opcional. Indica que las variables locales de la subrutina se mantienen constantes de una llamada a otra. El ´mbito de acci´n de esta declaraci´n no incluye a variables declaradas fuera de la a o o subrutina. Nombre-De-Subrutina. Es requerido. Indica el nombre de la subrutina. lista-argumentos. Es opcional e indica las variables que conforman los argumentos con que una sub- rutina es llamada. Para separar una variable de otra se escribe una coma. instrucciones. Es opcional y conforma el conjunto de instrucciones que son ejecutadas a lo largo de la subrutina. Ejemplo 6Elevar al cuadrado los valores de una selecci´n (ejecutar desde la ventana de ejecuci´n de macros). o oPodemos implementar una subrutina en una hoja, que recorra una selecci´n hecha con el mouse y que vaya oelevando al cuadrado el valor de cada celda.
  25. 25. VBA para Excel M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 25 e Figure 1.24: Elevar al cuadrado los elementos de la selecci´n oSub elevAlCuadado() For Each cell In Selection.Cells ’para cada celda de la selecci´n o cell.Value = cell.Value ^ 2 ’recalcula el valor de la celda Next cellEnd SubNota: La macro se aplica a los datos que est´n actualmente seleccionados a• Para editar la subrutina, vamos al editor VB (Alt-F11) y hacemos doble-clic sobre (Hoja1) Figure 1.25: Edici´n de la subrutina en Hoja 1 oEscribimos el c´digo, compilamos (en men´ Depuraci´n), guardamos y nos devolvemos a la hoja. o u o• Para ejecutar la macro seleccionamos la tabla con el mouse y levantamos la ventana de ejecuci´n de macros o(Alt-F8)y damos clic en ’Ejecutar’Nota: Esta subrutina tambi´n se puede editar en un m´dulo. Para ejecutarla se procede de la misma forma. e o1.5.6 Ejecuci´n de una subrutina mediante un bot´n o oOtra posibilidad bastante pr´ctica para ejecutar un programa o subrutina como los presentados en la secci´n a oprecedente es mediante un bot´n de comando. o
  26. 26. VBA para Excel M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 26 e Figure 1.26: Ejecutar macro Ejemplo 7Elevar al cuadrado los valores de una selecci´n. o 1. Primero digitarmos la tabla de valores. Luego insertamos un bot´n. Para esto seleccionamos un bot´n del o o cuadro de controles (si la barra no est´ disponible, puede habilitarla con Ver - Barra de herramientas a - Cuadro de Controles). Figure 1.27: Insertar un bot´n o 2. Luego hacemos clic en el lugar de la hoja donde queremos el bot´n. Una vez que tenemos el bot´n, pode- o o mos agregar algunas propiedades como etiqueta, color de fondo, etc., en el men´ de contexto. Este men´ u u se abre con clic derecho + propiedades. Luego cerramos el men´ u 3. Para editar el c´digo que deber´ ejecutar el bot´n, le damos un par de clics al bot´n (que todav´ est´ en o a o o ıa a modo dise˜o). En este caso, si es la primera vez, nos aparece el c´digo n o Private Sub CommandButton1_Click() End Sub Aqu´ tenemos dos opciones ı a.) Implementar la subrutina por separado y luego llamarla desde la subrutina del bot´n o
  27. 27. VBA para Excel M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 27 e Figure 1.28: Men´ de contexto para un bot´n u o Figure 1.29: Tabla y bot´n o Sub elevAlCuadado() For Each cell In Selection.Cells ’para cada celda de la selecci´n o cell.Value = cell.Value ^ 2 ’recalcula el valor de la celda Next cell End Sub ’----------------------------------------------------------------------- Private Sub CommandButton1_Click() elevAlCuadado ’sin par´ntesis e End Sub ’----------------------------------------------------------------------- b.) Incluir en la subrutina del bot´n lo que vamos a querer que se ejecute cuando se haga clic sobre ´l o e Private Sub CommandButton1_Click() For Each cell In Selection.Cells ’para cada celda de la selecci´n o cell.Value = cell.Value ^ 2 ’recalcula el valor de la celda Next cell End Sub 4. Una vez que escogemos alguna de las dos opciones anteriores, compilamos (en men´ Depurar), guardamos u y nos devolvemos a la hoja.
  28. 28. VBA para Excel M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 28 e 5. Para habilitar el bot´n debemos deshabiltar el ´ o ıcono de dise˜o n . 6. Ahora solo resta seleccionar la tabla y hacer clic sobre el bot´n. o Observe que al dar un clic sobre el bot´n, el programa opera sobre lo que tengamos seleccionado previa- o mente Figure 1.30: Correr una subrutina desde un bot´n con la tabla seleccionada o
  29. 29. VBA para Excel M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 29 eNota: Puede ser importante conocer la primera o la ultima celda de una selecci´n. Para esto podemos usar la ´ opropiedad Address Set R = Selection adr = R(1, 1).Address ’primera celda de la selecci´n, por ejemplo $A$1 o num = Right(adr, 1) ’primera posici´n a la derecha de adr (1 en este caso) o1.5.7 Matrices din´micas aCuando hacemos una selecci´n con el mouse, es conveniente entrar los valores seleccionados en una matriz odin´mica, es decir, una matriz que se ajuste a la cantidad de datos seleccionada y que, eventualmente, se pueda arecortar o hacer m´s grande. aUna matriz din´mica mtr1 de entradas enteras se declara as´ a ı: Dim mtr1() As Integer ’ Declara una matriz din´mica. aLas instrucciones siguientes cambian el tama˜o de la matriz mtr1 y la inicializa. Observe el uso de Redim para ncambiar el tama˜o de la matriz din´mica. n aDim mtr1() As Integer ’ Declara una matriz din´mica. aDim r() as DoubleRedim mtr1(10) ’ Cambia el tama~o a 10 elementos, 1x10. nRedim r(n,m) ’ Cambia tama~o a n n x mFor i = 1 To 10 ’ Bucle 10 veces. mtr1(i) = i ’ Inicializa la matriz.Next iUsando Preserve se puede cambiar el tama˜o de la matriz mtr1 pero sin borrar los elementos anteriores. nRedim Preserve mtr1(15) ’ Cambia el tama~o a 15 elementos. n Ejemplo 8Centro de gravedad de un conjunto de puntos en R2Consideremos un conjunto Ω = {(xi , yi ) / i = 1, 2, · · · , n, xi , yi ∈ R}. Supongamos que a cada punto (xi , yi ) nse le asigna un peso pi tal que pi = 1. El centro de gravedad GΩ de Ω se define as´ ı i=1 n GΩ = pi (xi , yi ) i=1
  30. 30. VBA para Excel M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 30 ePor ejemplo, si tenemos dos puntos A, B ∈ R2 con igual peso (este deber´ ser 1/2 para cada punto), entonces ael centro de gravedad es el punto medio del segmento que une A con B A+B GΩ = 2La subrutina que calcula el centro de gravedad de un conjunto de puntos Ω ⊂ R2 act´a sobre un rango de utres columnas en el que se han escrito las coordenadas (x, y) de dichos puntos, as´ como sus pesos. Podemos ıcorrer el programa una vez que se ha seleccionado el rango completo en el que se ubican los puntos y sus pesos,haciendo clic sobre un bot´n “Centro Gravedad”. El gr´fico es un trabajo adicional. o aComo el programa necesita que el usuario haya seleccionado al menos dos filas y exactamente tres columnas,incluimos un fragmento de c´digo adicional para controlar la selecci´n. o oSet R = Selection n = R.Rows.Count ’ N´mero de filas m = uR.Columns.Count ’ N´mero de columnas uIf n > 1 And m = 3 Then ’todo est´ bien, el programa contin´a a uElse MsgBox ("Debe seleccionar los datos") Exit Sub ’ salimos de la subrutinaEnd IfObservemos que si no se cumple el requisito, se env´ un mensaje y la subrutina se deja de ejecutar. Puede ıacausar curiosidad que que antes del Else no haya c´digo. A veces se usa esta construcci´n por comodidad. Si o ono hay c´digo el programa contin´a. o uVeamos el c´digo completo en la subrutina del bot´n o oPrivate Sub CommandButton2_Click() Dim R As Range Dim n,m, i As Integer Dim x() As Double ’ matriz din´mica a Dim y() As Double ’ se ajustar´ a la selecci´n de datos a o Dim p() As Double Dim Sumapesos, Gx, Gy As Double ’En el rango R guardamos el rango seleccionado: Set R = Selection n = R.Rows.Count ’ N´mero de filas u m = R.Columns.Count ’ N´mero de columnas u ’ chequear que se hayan seleccionado los datos de la tabla If n > 1 And m = 3 Then ’nada pasa, todo bien Else MsgBox ("Debe seleccionar los datos")
  31. 31. VBA para Excel M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 31 e Exit Sub ’ salimos de la subrutina End If ReDim x(n) ’ vector x tiene ahora n campos ReDim y(n) ReDim p(n) Sumapesos = 0 ’inicializa para acumular Gx = 0 Gy = 0 ’inicializa las matrices con los datos If n > 1 Then ’si hay datos seleccionados, n > 1 For i = 1 To n x(i) = R(i, 1) ’entra los datos de columna de los x’s y(i) = R(i, 2) p(i) = R(i, 3) ’calcula centro de gravedad Sumapesos = Sumapesos + p(i) Gx = Gx + x(i) * p(i) Gy = Gy + y(i) * p(i) Next i If Abs(Sumapesos - 1) < 0.001 Then ’la suma los pesos debe ser 1 Gx = Gx / Sumapesos Gy = Gy / Sumapesos ’escribe G en la celda D14 Cells(14, 4) = "G = (" + Str(Gx) + "," + Str(Gy) + ")" Cells(14, 5) = "" ’limpia E14 de mensajes previos Else ’mensaje de error Cells(14, 5) = "Error, los pesos suman " + Str(Sumapesos) Cells(14, 4) = "" ’limpia D14 de valores previos End If Else Cells(14, 4) = "" ’ventana de advertencia: seleccione datos! MsgBox ("Debe seleccionar los datos") Exit Sub ’ aborta la subrutina si no hay datos End IfEnd SubNota: Por cuestiones de redondeo, la instrucci´n If Sumapesos = 1 se cambi´ por If Abs(Sumapesos - 1) o o< 0.001 .Un ejemplo de corrida se ve en la figura que sigueEjercicios 1 1. Usando la notaci´n del ultimo ejemplo, se define la inercia total de Ω como o ´
  32. 32. VBA para Excel M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 32 e Figure 1.31: Correr una subrutina desde un bot´n o n I(Ω) = pi || (xi , yi ) − GΩ | |2 i=1 √ donde ||(a, b)|| = a2 + b2 es la norma usual. Implemente una subrutina que calcula la Inercia Total de Ω y apl´ ıquela a la tabla del ejemplo 8. 2. Si tenemos n + 1 puntos {(x0 , y0 ) , (x1 , y1 ) , (x2 , y2 ) , · · · (xn , yn ) }, se define (x − x0 )(x − x1 ) · · · (x − xi−1 )(x − xi+1 ) · · · (x − xn ) Lin (x) = (xi − x0 )(xi − x1 ) · · · (xi − xi−1 )(xi − xi+1 ) · · · (xi − xn ) O sea, en Lin (x) se elimina el factor (x − xi ) en el numerador y el factor (xi − xi ) en el denominador Implemente una hoja, como se ve en la figura, en la que el usuario hace una selecci´n de la tabla y al o hacer clic en el bot´n, se calcula L2n (2.56) o Figure 1.32: L2n (2.56)
  33. 33. VBA para Excel M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 33 e Parte del c´digo ser´ o ıa ... Set R = Selection n = R.Rows.Count ’ N´mero de filas u ReDim x(n) ’ vector x tiene ahora n campos ReDim y(n) valorX = Cells(2, 3) ’ valorX est´ en celda C2 a If n > 1 Then ’si hay datos seleccionados, n > 1 For i = 1 To n x(i) = R(i, 1) ’entra los datos de columna de los xi’s y los yi’s, inicia en 1 y(i) = R(i, 2) ’aqu´, iniciamos desde x1, es decir el x0 de la teor´a, es x1 ı ı Next i L2n= 1 ’inicia c´lculo de L2n(variable x) a For j = 1 To n ’calculamos L2n(valorX) If j <> 2 Then L2n = L2n * (valorX - x(j)) / (x(k) - x(j)) ’L2n evaluado en valorX End If Next j Cells(2, 4) = L2n Else MsgBox ("Debe seleccionar los datos") Exit Sub ’ aborta la subrutina si no hay datos seleccionados End If ... 3. Si tenemos n + 1 puntos {(x0 , y0 ) , (x1 , y1 ) , (x2 , y2 ) , · · · (xn , yn ) }, un polinomio que pasa por todos estos puntos se llama Polinomio Interpolante. Un polinomio interpolante muy conocido es el Polinomio de Lagrange n n (x − xj ) P (x) = yi i=0 j=0,j=i (xi − x1 ) o sea n (x − x0 )(x − x1 ) · · · (x − xi−1 )(x − xi+1 ) · · · (x − xn ) P (x) = yi i=0 (xi − x0 )(xi − x1 ) · · · (xi − xi−1 )(xi − xi+1 ) · · · (xi − xn ) O sea, para cada valor de i se elimina el factor (x − xi ) en el numerador y el factor (xi − xi ) en el denominador Este polinomio cumple P (xi ) = yi i = 1, 2, ...n.
  34. 34. VBA para Excel M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 34 e Por ejemplo, para el caso de tres puntos (x0 , y0 ), (x1 , y1 ) y (x2 , y2 ), el Polinomio de Lagrange es (x − x1 )(x − x2 ) (x − x0 )(x − x2 ) (x − x0 )(x − x1 ) P (x) = y0 + y1 + y2 (x0 − x1 )(x0 − x2 ) (x1 − x0 )(x1 − x2 ) (x2 − x0 )(x2 − x1 ) (a) Implemente una subrutina que, a partir de una selecci´n de puntos (xi , yi ) (en dos columnas) en o una hoja de Excel, eval´a el polinomio interpolante en una valor dado de antemano en una celda, o u sea, calcula P (a) para un valor a dado. (b) Aplique la implementaci´n anterior a una tabla como la que se presenta en la figura o Figure 1.33: Polinomio de Lagrange Parte del c´digo ser´ o ıa ... suma = 0 ’inicializa para acumular If n > 1 Then ’si hay datos seleccionados, n > 1 For i = 1 To n x(i) = R(i, 1) ’entra los datos de columna de los xi’s y los yi’s, inicia en 1 y(i) = R(i, 2) ’aqu´, iniciamos desde x1, es decir el x0 de la teor´a, es x1 ı ı Next i For k = 1 To n Lkn = 1 ’inicia c´lculo de Lkn a For j = 1 To n ’calculamos Lkn(valorX) If j <> k Then Lkn = Lkn * (valorX - x(j)) / (x(k) - x(j)) ’Lkn evaluado en valorX End If Next j suma = suma + Lkn * y(k) Next k Cells(5, 4) = suma Else ’ventana de advertencia: seleccione datos! MsgBox ("Debe seleccionar los datos") Exit Sub ’ aborta la subrutina si no hay datos seleccionados End If ...
  35. 35. VBA para Excel M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 35 e1.5.8 Inclusi´n de procedimientos de borrado oEn ocasiones es necesario borrar alguna informaci´n que ha sido escrita en una hoja electr´nica, por lo que es o oimportante conocer una forma de incorporar en la aplicaci´n un procedimiento de borrado. o Ejemplo 9Presentamos a continuaci´n un programa que, a partir de un n´mero N construye el tri´ngulo de Pascal de N o u aniveles. Tambi´n se incluye un programa que funciona como borrador o destructor del tri´ngulo. e aEn cada nivel del tri´ngulo hay un uno en los extremos y, a partir del tercer nivel, cada n´mero, salvo los a uextremos, es la suma de los dos de arriba. Concretamente, el tri´ngulo de Pascal es un arreglo triangular de an´meros de la forma: u Figure 1.34: Tri´ngulo de Pascal. aPor simplicidad, presentamos un programa que lee el n´mero de niveles del tri´ngulo de Pascal en la celda E1 u ay lo despliega de la forma: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 ...El procedimiento para borrar el tri´ngulo tambi´n lee el n´mero de niveles del tri´ngulo de la celda E1. a e u aTanto la construcci´n del tri´ngulo como su destrucci´n pueden ser activados mediante botones. Las instruc- o a ociones que realizan estos procedimientos tambi´n pueden ser incluidas directamente en el c´digo de los botones, e otal y como se detalla a continuaci´n. oEl c´digo para la construcci´n del tri´ngulo quedar´ as´ o o a ıa ı:Private Sub EjecucionDePascal_Click()
  36. 36. VBA para Excel M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 36 e ’ Lectura de la cantidad de niveles: N = Cells(1,5) ’ Llenar unos: For i = 1 To N Cells(i,1)= 1 Cells(i,i)= 1 Next i ’ Llenar el resto: If N > 2 Then For i=3 To N For j=2 To i-1 Cells(i,j)= Cells(i-1,j) + Cells(i-1,j-1) Next j Next i End IfEnd SubEl procedimiento para borrar el tri´ngulo tambi´n lee el n´mero de niveles y hace el mismo recorrido de celdas a e uque hizo el constructor y en cada celda escribe un valor nulo.Private Sub Borrador_Click() N = Cells(1, 5).Value For i = 1 To N For j = 1 To i Cells(i, j).Value = Null Next j Next iEnd Sub Figure 1.35: Tri´ngulo de Pascal construido con 10 niveles. aEjercicios 2 1. Tri´ngulo de Pascal. Haga un programa que, al activarlo desde un bot´n de comando, lea un un n´mero a o u N de la celda A1 y construya el tri´ngulo de Pascal en la forma: a 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 ...
  37. 37. VBA para Excel M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 37 e Adem´s, incluya un bot´n que active un destructor especializado para este tri´ngulo. a o a 2. Aritm´tica entera. En VBA hay dos tipos de divisi´n: a/b es la divisi´n corriente (en punto flotante) e o o y ab que es la divisi´n entera. Por ejemplo, 3/2 = 1.5 mientras que 32 = 1. o Hay muchos algoritmos en los que se usa exclusivamente divis´n entera. Veamos un ejemplo. o √ Si N es un entero positivo, vamos a calcular el entero m´s grande que es menor o igual a N , es √ a decir N (‘ ’ es la parte entera). El algoritmo, que opera en aritm´tica entera, es el siguiente e N a.) Inicio: s0 = 2 N si + si b.) si+1 = , i = 0, 1, 2, ... 2 c.) iterar hasta que si+1 ≥ si √ d.) el ultimo si es ´ N √ Por ejemplo si N = 10 , N ≈ 3, 16227766 y el ultimo si ser´ 3 ´ ıa Implemente el algoritmo. √ 3. C´lculo de la ra´ cuadrada. Para calcular x con x ∈ R+ , se pueden usar varios algoritmos de- a ız pendiendo de la precisi´n y rapidez que se busca. La calculadoras usualmente tienen implementadas muy o √ buenas subrutinas para calcular exponenciales y logaritmos por lo que para calcular x usan la identidad √ 1 ln(x) x = e2 En nuestro caso, por simplicidad, vamos a usar un m´todo iterativo: el m´todo de Newton. Bajo ciertas e e hip´tesis, si x0 es una buena aproximaci´n a una soluci´n r de la ecuaci´n P (x) = 0 entonces el esquema o o o o iterativo P (xi ) xi+1 = xi − P (xi ) converge a r con error ≤ |xi − xi+1 | . √ 1 1 Para hallar U con U > 0 , vamos a resolver la ecuaci´n 2 − o = 0 con el m´todo de Newton. Esto e √ x U nos dar´ una aproximaci´n a U . a o Nota: Como U es una constante, el esquema iterativo se podr´ simplificar un poco m´s en el c´digo ıa a o Nota: Tambi´n se pudo haber usado la ecuaci´n x2 − U = 0 pero el proceso de aproximaci´n es un poco e o o m´s lento. a

×