SlideShare una empresa de Scribd logo
1 de 76
Descargar para leer sin conexión
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
Contents

1 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                                                                  .   .   .   .   .   .   .   .   .   .   .   .   49

2 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
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
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).
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
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.
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
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.
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
      ...
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.
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)
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
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.
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
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
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.
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
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
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
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
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
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
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
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.
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
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
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.
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
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
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")
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      ´
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)
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.
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
          ...
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()
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 ...
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
Vba excel mnumericos
Vba excel mnumericos
Vba excel mnumericos
Vba excel mnumericos
Vba excel mnumericos
Vba excel mnumericos
Vba excel mnumericos
Vba excel mnumericos
Vba excel mnumericos
Vba excel mnumericos
Vba excel mnumericos
Vba excel mnumericos
Vba excel mnumericos
Vba excel mnumericos
Vba excel mnumericos
Vba excel mnumericos
Vba excel mnumericos
Vba excel mnumericos
Vba excel mnumericos
Vba excel mnumericos
Vba excel mnumericos
Vba excel mnumericos
Vba excel mnumericos
Vba excel mnumericos
Vba excel mnumericos
Vba excel mnumericos
Vba excel mnumericos
Vba excel mnumericos
Vba excel mnumericos
Vba excel mnumericos
Vba excel mnumericos
Vba excel mnumericos
Vba excel mnumericos
Vba excel mnumericos
Vba excel mnumericos
Vba excel mnumericos
Vba excel mnumericos
Vba excel mnumericos
Vba excel mnumericos

Más contenido relacionado

La actualidad más candente

La actualidad más candente (15)

Cálculo Raíces Con Octave
Cálculo Raíces Con OctaveCálculo Raíces Con Octave
Cálculo Raíces Con Octave
 
Desarrollo proyectos-informaticos-con-java
Desarrollo proyectos-informaticos-con-javaDesarrollo proyectos-informaticos-con-java
Desarrollo proyectos-informaticos-con-java
 
Teoriapto
TeoriaptoTeoriapto
Teoriapto
 
Gretl guide-es[1]
Gretl guide-es[1]Gretl guide-es[1]
Gretl guide-es[1]
 
Tutorial de maxima
Tutorial de maximaTutorial de maxima
Tutorial de maxima
 
Qc2235plus um e_1.1.1
Qc2235plus um e_1.1.1Qc2235plus um e_1.1.1
Qc2235plus um e_1.1.1
 
Manual Scilab
Manual ScilabManual Scilab
Manual Scilab
 
Curso logica digital unam
Curso logica digital unamCurso logica digital unam
Curso logica digital unam
 
Econometria aplicada con gretl
Econometria aplicada con gretlEconometria aplicada con gretl
Econometria aplicada con gretl
 
Introduccion poo con_java
Introduccion poo con_javaIntroduccion poo con_java
Introduccion poo con_java
 
Algoritmos y estructura_de_datos
Algoritmos y estructura_de_datosAlgoritmos y estructura_de_datos
Algoritmos y estructura_de_datos
 
Intro2
Intro2Intro2
Intro2
 
Matematicas en ingenieria_con_matlab_y_o
Matematicas en ingenieria_con_matlab_y_oMatematicas en ingenieria_con_matlab_y_o
Matematicas en ingenieria_con_matlab_y_o
 
Heuristicos Para Vrp
Heuristicos Para VrpHeuristicos Para Vrp
Heuristicos Para Vrp
 
Modulo fisica-i1
Modulo fisica-i1Modulo fisica-i1
Modulo fisica-i1
 

Destacado

Excel Avanzado Y Macros 2009
Excel Avanzado Y Macros 2009Excel Avanzado Y Macros 2009
Excel Avanzado Y Macros 2009Fernanda Guzmán
 
Teaching Students with Emojis, Emoticons, & Textspeak
Teaching Students with Emojis, Emoticons, & TextspeakTeaching Students with Emojis, Emoticons, & Textspeak
Teaching Students with Emojis, Emoticons, & TextspeakShelly Sanchez Terrell
 
Study: The Future of VR, AR and Self-Driving Cars
Study: The Future of VR, AR and Self-Driving CarsStudy: The Future of VR, AR and Self-Driving Cars
Study: The Future of VR, AR and Self-Driving CarsLinkedIn
 
Hype vs. Reality: The AI Explainer
Hype vs. Reality: The AI ExplainerHype vs. Reality: The AI Explainer
Hype vs. Reality: The AI ExplainerLuminary Labs
 

Destacado (6)

Excel Avanzado Y Macros 2009
Excel Avanzado Y Macros 2009Excel Avanzado Y Macros 2009
Excel Avanzado Y Macros 2009
 
Macros en excel
Macros en excelMacros en excel
Macros en excel
 
Inaugural Addresses
Inaugural AddressesInaugural Addresses
Inaugural Addresses
 
Teaching Students with Emojis, Emoticons, & Textspeak
Teaching Students with Emojis, Emoticons, & TextspeakTeaching Students with Emojis, Emoticons, & Textspeak
Teaching Students with Emojis, Emoticons, & Textspeak
 
Study: The Future of VR, AR and Self-Driving Cars
Study: The Future of VR, AR and Self-Driving CarsStudy: The Future of VR, AR and Self-Driving Cars
Study: The Future of VR, AR and Self-Driving Cars
 
Hype vs. Reality: The AI Explainer
Hype vs. Reality: The AI ExplainerHype vs. Reality: The AI Explainer
Hype vs. Reality: The AI Explainer
 

Similar a Vba excel mnumericos (20)

Introduccion a matlab
Introduccion a matlabIntroduccion a matlab
Introduccion a matlab
 
Algoritmos
AlgoritmosAlgoritmos
Algoritmos
 
Rarepaso
RarepasoRarepaso
Rarepaso
 
Rarepaso
RarepasoRarepaso
Rarepaso
 
Matlab adv esp
Matlab adv espMatlab adv esp
Matlab adv esp
 
Introduccion a la programacion en c prev
Introduccion a la programacion en c prevIntroduccion a la programacion en c prev
Introduccion a la programacion en c prev
 
Linux benchmarking como
Linux benchmarking comoLinux benchmarking como
Linux benchmarking como
 
Scd 13-14 todo
Scd 13-14 todoScd 13-14 todo
Scd 13-14 todo
 
Manualscilab 090513151714 Phpapp02
Manualscilab 090513151714 Phpapp02Manualscilab 090513151714 Phpapp02
Manualscilab 090513151714 Phpapp02
 
Pensar enc++
Pensar enc++Pensar enc++
Pensar enc++
 
ApuntesC++.pdf
ApuntesC++.pdfApuntesC++.pdf
ApuntesC++.pdf
 
Introduccion al lenguaje c
Introduccion al lenguaje cIntroduccion al lenguaje c
Introduccion al lenguaje c
 
Introducción al r
Introducción al rIntroducción al r
Introducción al r
 
Guia_Analisis_Exp.pdf
Guia_Analisis_Exp.pdfGuia_Analisis_Exp.pdf
Guia_Analisis_Exp.pdf
 
Manual de programacion_con_robots_para_la_escuela
Manual de programacion_con_robots_para_la_escuelaManual de programacion_con_robots_para_la_escuela
Manual de programacion_con_robots_para_la_escuela
 
Manual de programacion_con_robots_para_la_escuela
Manual de programacion_con_robots_para_la_escuelaManual de programacion_con_robots_para_la_escuela
Manual de programacion_con_robots_para_la_escuela
 
Algoritmos y estructura_de_datos
Algoritmos y estructura_de_datosAlgoritmos y estructura_de_datos
Algoritmos y estructura_de_datos
 
Diseño canónico control automatico
Diseño canónico control automaticoDiseño canónico control automatico
Diseño canónico control automatico
 
Sistema operativo
Sistema operativoSistema operativo
Sistema operativo
 
Teoria de la medida
Teoria de la medidaTeoria de la medida
Teoria de la medida
 

Vba excel mnumericos

  • 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
  • 2. Contents 1 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 . . . . . . . . . . . . 49 2 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. 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