1. 1
Programaci´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
3. Chapter 1
Programaci´n Visual Basic (VBA)
o
para Excel
1.1 Introducci´n
o
Microsof Excel c es un software para el manejo de hojas electr´nicas agrupadas en libros para c´lculos de casi
o a
cualquier ´
ı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 o
eralizada, por profesionales y estudiantes en proceso de formaci´n, pero hay una gran cantidad de usuarios que
o
no 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
e
gran utilidad para ser utilizado en la ense˜anza de las ciencias y la Ingenier´ particularmente, en la ense˜anza
n ıa, n
de los m´todos num´ricos. Pese a que existen en el mercado programas computacionales muy sofisticados, tales
e e
como MATLAB, MATHEMATICA, etc., no est´n tan disponibles como Excel, que usualmente forma parte del
a
paquete b´sico de software instalado en las computadoras que funcionan bajo el sistema Windows c de Microsoft.
a
A continuaci´n se brinda al lector una breve introducci´n a algunas actividades de programaci´n con macros
o o o
escritos en VBA (una adaptaci´n de Visual Basic para Office de Microsoft), definidos desde una hoja electr´nica
o o
de Excel. Salvo peque˜as diferencias para versiones en ingl´s, el material puede ser desarrollado en cualquier
n e
versi´n.
o
1.2 Evaluaci´n de funciones
o
1.2.1 Funciones definidas por el usuario
A 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. 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.
o
1.2.2 Errores comunes
Conforme vamos digitando nuestras primeras f´rmulas, nos van apareciendo algunos errores que usualmente son
o
debidos a un manejo inadecuado de la sintaxis o a la incompatibilidad con la configuraci´n de la computadora.
o
A 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 e
SENO(x).
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 a
Muchas f´rmulas a evaluar tienen argumentos de distinto tipo, pues algunos argumentos var´ (a veces con
o ıan
un incremento determinado), mientras que otros permanecen constantes. Por lo general estos argumentos son
tomados de celdas espec´ıficas, por lo que es importante saber manejar distintos escenarios para la evaluaci´n
o
de una funci´n o f´rmula.
o o
Evaluaci´n con argumentos variables
o
Continuando con el ejemplo que iniciamos en la secci´n 2.1, a partir de la celda B4 podemos continuar digitando
o
valores, 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
ex
hecho ´sto, se eval´a la funci´n f (x) en la celda C3, como se hizo previamente. Luego, seleccionamos esta
e u o
misma celda C3 y se ubica el mouse en la esquina inferior derecha, arrastr´ndolo hasta la celda deseada. Otra
a
posibilidad es hacer un doble clic en la esquina inferior derecha de la celda a copiar y esto realiza la copia
autom´ticamente.
a
Evaluaci´n con argumentos variables y/o constantes
o
Es com´n tener que evaluar funciones o f´rmulas que dependen de varios par´metros, algunos de los cuales se
u o a
mantienen fijos mientras que otros son variables.
Ejemplo 1
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.
o
El siguiente ejemplo describe una funci´n con dos par´metros y una variable.
o a
K K − P0
La funci´n P (t) =
o −kt
, con A = , describe el tama˜o de una poblaci´n en el momento t.
n o
1 + Ae P0
Aqu´
ı:
. 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 a
Si 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. 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 K
Construyendo rangos con un incremento fijo
A menudo necesitamos evaluar una funci´n en una secuencia de valores igualmente espaciados, por lo que a
o
continuaci´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 a
Nota: Esto tambi´n se puede hacer escribiendo, en celdas consecutivas, un valor y luego el valor m´s el incre-
e a
mento y luego seleccionando ambas celdas y arrastrando. Sin embargo, en algunos algoritmos es m´s c´modo
a o
8. VBA para Excel M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 8
e
tener una celda d´nde leer el incremento.
o
1.3 Gr´ficas
a
Continuando con el ejemplo anterior en el que se ha evaluado la poblaci´n P (t) en un conjunto de valores del
o
tiempo t, recordemos que en las columnas E y F se han escrito, respectivamente, los valores de t y P (t). Para
graficar 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. VBA para Excel M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 9
e
1.4 Programaci´n de macros
o
1.4.1 Introducci´n
o
El lenguaje Visual Basic para Aplicaciones (VBA), en el contexto de Excel, constituye una herramienta de
programaci´n que nos permite usar c´digo Visual Basic adaptado para interactuar con las m´ltiples facetas de
o o u
Excel y personalizar las aplicaciones que hagamos en esta hoja electr´nica.
o
Las 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-
a
tregar un valor en una celda de la hoja. Las funciones pueden llamar a otras funciones y hasta subrutinas (en
el 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
u
constantes, 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
a
algunas 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 o
en este m´dulo. Esta acci´n de describe m´s adelante. De la misma manera se pueden editar subrutinas en un
o o a
m´dulo.
o
Una 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 o
invocar por ejemplo desde la ventana de ejecuci´n de macros (Alt-F8) o desde un bot´n que hace una llamada
o o
a la subrutina (como respuesta al evento de hacer clic sobre ´l, por ejemplo).
e
El 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 o
no 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 o
funciones para uso de este c´digo pero que ser´n desconocidas para la hoja (mensaje de error #¿NOMBRE?).
o a
Nota: un error frecuente es editar una funci´n en un m´dulo que corresponde a una hoja y llamarlo desde otra
o o
hoja. En este caso se despliega el error (mensaje de error #¿NOMBRE?).
1.4.2 Funciones
Una funci´n tiene la siguiente sintaxis:
o
Function NombreFun(arg1, arg2,...,argn)
Declaraci´n de Variables y constantes
o
Instruccci´n 1
o
Instruccci´n 2
o
...
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 ’comentario
End Function
Una funci´n puede tener o no tener argumentos, pero es conveniente que retorne un valor. Observe que se debe
o
usar el nombre de la funci´n para especificar la salida:
o
NombreFun = Valor de retorno
Nota 1: Al interior de las funciones, se pueden hacer comentarios utilizando (antes de ´stos) la comilla (’).
e
Nota 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 u
Ejemplo 1: implementar una funci´n.
o
Vamos 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)
ex
Para 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. 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 o
Nota: 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. 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
a
Una vez m´s vamos a trabajar con el modelo de crecimiento poblacional descrito anteriormente. La funci´n
a o
K
P (t) = ,
1 + Ae−kt
con
K − P0
A= .
P0
Ahora evaluaremos P (t) para distintos valores del tiempo t en d´ pero esta vez haremos dicha evaluaci´n
ıas, o
mediante 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,
a
se 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. 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
o
Un programa computacional escrito mediante cualquier lenguaje de programaci´n puede verse a grandes rasgos
o
como un flujo de datos, algunos jugando el papel de datos de entrada, otros son datos que cumplen alguna
funci´n temporal dentro del programa y otros son datos de salida. A lo largo del programa es muy frecuente
o
que sea necesaria la entrada en acci´n de otros programas o procesos. A mayor complejidad del problema que
o
resuelve el programa, mayor es la necesidad de programar por aparte algunos segmentos de instrucciones que
se 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 o
estructura 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 e
incluyen 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 o
programa. El uso de estos ultimos es cada vez menor, pues el seudoc´digo por lo general es suficientemente
´ o
claro y se escribe en lenguaje muy cercano al lenguaje natural.
1.5.1 Flujo secuencial
El flujo secuencial consiste en seguir una secuencia de pasos que siguen un orden predeterminado.
14. VBA para Excel M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 14
e
Por 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 secuencial
1.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-
o
cutar, 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 o
ejecuta un proceso, en tanto que si es falsa ejecuta otro proceso.
En VBA tenemos la instrucci´n
o
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 If
Nota: En la ayuda del editor de Visual Basic, tenemos acceso a la referencia del lenguaje.
Ejemplo 2
En 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 = 1
El programa deber´ estimar el error absoluto de las aproximaciones y ser´ capaz de escribir un mensaje de ´xito
a a e
o 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-
a
uadas en cada columna:
Function AproxDeRaiz(x)
AproxDeRaiz = (1 / 2) * (x + 2 / x)
End Function
Function CalculoElError(Aproximacion, ValorExacto)
CalculoElError = Abs(Aproximacion - ValorExacto)
End Function
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 If
End Function
El diagrama siguiente ilustra la forma en que esta ultima funci´n de verificaci´n act´a con base en el valor de
´ o o u
sus dos par´metros de entrada:
a
Figure 1.17: Diagrama de flujo condicional para verificar si se alcanz´ la tolerancia.
o
1.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
o
proceso sucesivamente, hasta que ocurra una condici´n que permita terminar.
o
Este tipo de flujos repetitivos se presentan en tres formas que obedecen a maneras diferentes de razonarlos pero
que 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. 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.
o
En 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 3
Para ilustrar estas formas de realizar un flujo repetitivo, vamos a aproximar la suma de una serie alternada con
un error estimado menor que una cantidad tol dada.
Consideremos la serie alternada
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=1
La 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=1
es 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...
.
.
.
∞
1
De acuerdo con la teor´ de series alternadas, la serie
ıa (−1)k
es convergente. Si su suma es S, al aproxi-
k2
k=1
1
marla 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)2
Primer problema
Dada una tolerancia TOL, calcular cada una de las sumas parciales hasta que el error de aproximaci´n sea menor
o
que TOL
Soluci´n
o
Figure 1.18: Sumas parciales y estimaci´n del error
o
19. VBA para Excel M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 19
e
Implementamos dos macros, una para el c´lculo de las sumas parciales y otra para hacer la verificaci´n del error
a o
estimado. En este caso, vamos a suponer que TOL est´ en la celda B33
a
Function sumaParcial(hastaN) Dim Acum, signo As Integer Acum = 0
signo = -1
For k = 1 To hastaN
Acum = Acum + signo * 1 / k ^ 2
signo = -signo
Next k
sumaParcial = 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 If
End Function
En la primera llamada de las macros se us´ sumaParcial(C33) y verificaTol(C33;B$33)
o
Segundo problema
Dada una lista de tolerancias TOL (donde T OL es una cantidad positiva, como 10−1 ,10−8 , etc.), aproximar la
1
suma de la serie con una cantidad N de t´rminos lo suficientemente grande de tal manera que
e < T OL.
(N + 1)2
1
La cantidad juega en este problema el papel de una cota del error, al aproximar la serie correspondiente
(N + 1)2
hasta 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. 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. 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. VBA para Excel M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 22
e
1.5.4 Manejo de rangos
Una rango en Excel corresponde a una selecci´n de celdas. Una selecci´n de las celdas de una fila o una columna
o o
se maneja en Excel como una matriz de orden 1 × n o de orden n × 1 (un vector). La selecci´n de un bloque
o
de celdas se maneja como una matriz n × m. Si una celda est´ en blanco, se lee un cero.
a
Ejemplo 4
Promedio 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.
u
Function PromedioSimple(R As Range) As Double ’R es la variable
que 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 simple
End Function
En primera celda de la columna Promedio, llamamos a la macro con: PROMEDIO(C52:G52) pues en este caso el
rango es C52:G52.
Ejemplo 5
El Promedio eliminando las dos notas m´s bajas. En este caso, a un conjunto de notas les calculamos el
a
promedio simple pero eliminando las dos notas m´s bajas. El programa PromedioQ suma las n notas de una
a
fila (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 a
notas para luego dividir entre n − 2. En este caso, el rango R es una matriz 1 × n, o sea, se puede ver como un
vector de n componentes.
Function PromedioQ(R As Range) As Double
Dim n, i, Imin1, Imin2 As Integer
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 Function
Nota: Tambi´n podr´
e ıamos resolver este problema usando Selection.Sort pero la programaci´n es un poco
o
m´s compleja.
a
1.5.5 Subrutinas. Edici´n y ejecuci´n de una subrutina
o o
La subrutinas o procedimientos es otro de los tipos b´sicos de programas en Visual Basic. Una descripci´n de la
a o
sintaxis 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
e
tiene que ver m´s con la programaci´n orientada a objetos, que no se aborda en el presente material
a o
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 Sub
Lass 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 6
Elevar al cuadrado los valores de una selecci´n (ejecutar desde la ventana de ejecuci´n de macros).
o o
Podemos implementar una subrutina en una hoja, que recorra una selecci´n hecha con el mouse y que vaya
o
elevando al cuadrado el valor de cada celda.
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
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
Nota: 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
o
Escribimos 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 o
1.5.6 Ejecuci´n de una subrutina mediante un bot´n
o o
Otra posibilidad bastante pr´ctica para ejecutar un programa o subrutina como los presentados en la secci´n
a o
precedente es mediante un bot´n de comando.
o
26. VBA para Excel M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 26
e
Figure 1.26: Ejecutar macro
Ejemplo 7
Elevar 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. 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. 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. VBA para Excel M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 29
e
Nota: Puede ser importante conocer la primera o la ultima celda de una selecci´n. Para esto podemos usar la
´ o
propiedad 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)
o
1.5.7 Matrices din´micas
a
Cuando hacemos una selecci´n con el mouse, es conveniente entrar los valores seleccionados en una matriz
o
din´mica, es decir, una matriz que se ajuste a la cantidad de datos seleccionada y que, eventualmente, se pueda
a
recortar o hacer m´s grande.
a
Una matriz din´mica mtr1 de entradas enteras se declara as´
a ı:
Dim mtr1() As Integer ’ Declara una matriz din´mica.
a
Las instrucciones siguientes cambian el tama˜o de la matriz mtr1 y la inicializa. Observe el uso de Redim para
n
cambiar el tama˜o de la matriz din´mica.
n a
Dim mtr1() As Integer ’ Declara una matriz din´mica.
a
Dim r() as Double
Redim mtr1(10) ’ Cambia el tama~o a 10 elementos, 1x10.
n
Redim r(n,m) ’ Cambia tama~o a
n n x m
For i = 1 To 10 ’ Bucle 10 veces.
mtr1(i) = i ’ Inicializa la matriz.
Next i
Usando Preserve se puede cambiar el tama˜o de la matriz mtr1 pero sin borrar los elementos anteriores.
n
Redim Preserve mtr1(15) ’ Cambia el tama~o a 15 elementos.
n
Ejemplo 8
Centro de gravedad de un conjunto de puntos en R2
Consideremos un conjunto Ω = {(xi , yi ) / i = 1, 2, · · · , n, xi , yi ∈ R}. Supongamos que a cada punto (xi , yi )
n
se 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. VBA para Excel M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 30
e
Por ejemplo, si tenemos dos puntos A, B ∈ R2 con igual peso (este deber´ ser 1/2 para cada punto), entonces
a
el centro de gravedad es el punto medio del segmento que une A con B
A+B
GΩ =
2
La subrutina que calcula el centro de gravedad de un conjunto de puntos Ω ⊂ R2 act´a sobre un rango de
u
tres 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 a
Como 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 o
Set R = Selection n = R.Rows.Count ’ N´mero de filas m =
u
R.Columns.Count ’ N´mero de columnas
u
If n > 1 And m = 3 Then
’todo est´ bien, el programa contin´a
a u
Else
MsgBox ("Debe seleccionar los datos")
Exit Sub ’ salimos de la subrutina
End If
Observemos que si no se cumple el requisito, se env´ un mensaje y la subrutina se deja de ejecutar. Puede
ıa
causar curiosidad que que antes del Else no haya c´digo. A veces se usa esta construcci´n por comodidad. Si
o o
no hay c´digo el programa contin´a.
o u
Veamos el c´digo completo en la subrutina del bot´n
o o
Private 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. 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 If
End Sub
Nota: 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 sigue
Ejercicios 1
1. Usando la notaci´n del ultimo ejemplo, se define la inercia total de Ω como
o ´
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. 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. 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. VBA para Excel M.Sc. Walter Mora F., M.Sc. Jos´ Luis Espinoza B. 35
e
1.5.8 Inclusi´n de procedimientos de borrado
o
En ocasiones es necesario borrar alguna informaci´n que ha sido escrita en una hoja electr´nica, por lo que es
o o
importante conocer una forma de incorporar en la aplicaci´n un procedimiento de borrado.
o
Ejemplo 9
Presentamos a continuaci´n un programa que, a partir de un n´mero N construye el tri´ngulo de Pascal de N
o u a
niveles. Tambi´n se incluye un programa que funciona como borrador o destructor del tri´ngulo.
e a
En cada nivel del tri´ngulo hay un uno en los extremos y, a partir del tercer nivel, cada n´mero, salvo los
a u
extremos, es la suma de los dos de arriba. Concretamente, el tri´ngulo de Pascal es un arreglo triangular de
a
n´meros de la forma:
u
Figure 1.34: Tri´ngulo de Pascal.
a
Por simplicidad, presentamos un programa que lee el n´mero de niveles del tri´ngulo de Pascal en la celda E1
u a
y 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 a
Tanto la construcci´n del tri´ngulo como su destrucci´n pueden ser activados mediante botones. Las instruc-
o a o
ciones que realizan estos procedimientos tambi´n pueden ser incluidas directamente en el c´digo de los botones,
e o
tal y como se detalla a continuaci´n.
o
El c´digo para la construcci´n del tri´ngulo quedar´ as´
o o a ıa ı:
Private Sub EjecucionDePascal_Click()
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 If
End Sub
El procedimiento para borrar el tri´ngulo tambi´n lee el n´mero de niveles y hace el mismo recorrido de celdas
a e u
que 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 i
End Sub
Figure 1.35: Tri´ngulo de Pascal construido con 10 niveles.
a
Ejercicios 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. 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