Você está na página 1de 56

1 Qu es Visual Basic Applications?

Es un lenguaje de programacin, el cual es usado para controlar aplicaciones como Microsoft Excel, Microsoft Word o cualquier aplicacin que reconozca esos estndares. Identificaremos Visual Basic Applications simplemente por VBA. Cuando se graba en Excel una macro esta es grabada usando lenguaje VB aplicacin.

2 Qu es una Macro?
Una macro son un conjunto de instrucciones que Excel ejecuta automticamente. Frecuentemente las macro buscan eliminar la repeticin de acciones manuales que se hacen en el uso de Excel, algunas de ellas son: realizar calculo, borrar unos datos especficos, seleccionar un rango para aplicarle negrita, cambio de fuente y centrado. Para evitar hacer estas acciones manualmente, se puede elaborar una macro e invocarla para que ejecute los procesos automticamente. Al crear una macro se pueden ejecutar o reproducir varias veces la tarea y realizarlas rpidamente.

2.1 Cuando realizar una Macro?


Se debe considerar la creacin de una macro cuando se observe que pulsa las mismas teclas, elige los mismos comandos o realiza la misma sucesin de acciones. Algunas tareas que pueden ser automatizadas mediante macros son: Abrir un grupo de libros de trabajo y recuperar informacin de ellos. Imprimir varios rangos de celdas. Abrir una base de datos, ordenarla, crear un informe y cerrarlo. Preparar una hoja de clculo nueva escribiendo ttulos, ajustando anchos de columna y aplicando formatos especiales.

3 Resolviendo problemas con Macros


En la solucin de problemas con macros se deben considerar dos aspectos en el proceso de programacin, ellos son: La interfaz de entrada de datos Las subrutinas de procesamiento

Como se sabe ya, en todo algoritmo de computador se distingue una parte que es la entrada de datos, una parte que es el procesamiento y otra que es la salida.

En los algoritmos la entrada de datos la representamos por una instruccin de lectura, la salida por la instruccin de escritura y el procesamiento por operaciones de asignacin y de salida. Cuando se trabaja con VBA para Excel para dar vida a un algoritmo, estas partes ser pueden ver de la siguiente manera: En VBA un programa toma los datos de la hoja de clculo, mediante instrucciones que estn escritas en lo que llamaremos subrutinas, y all son llevados a las variables en memoria de la computadora donde son procesados, para luego presentarlos en la hoja de clculo produciendo la salida. Ejemplo: Se requiere un programa en Visual Basic Aplication que permita calcular el radio de un crculo, y el permetro de su circunferencia si se conoce el rea del crculo. De acuerdo con lo que se hizo en el planteamiento del algoritmo, el dato de entrada de este programa es el rea del crculo. La siguiente imagen ilustra la preparacin de la hoja de clculo para definir donde se entran los datos y donde se producir la salida.

La siguiente imagen ilustra que sucede cuando se presiona el botn Calcular Permetro.

Se puede ver como al presionar dicho botn se ejecuto un cdigo que se encargo de hacer los clculos del radio y del permetro del crculo. Se puede decir que el cdigo que ejecuta el botn, toma el valor del rea del crculo y realiza los clculos para resolver el problema.

Pero qu es lo que sucede cuando se presiona el botn?, simplemente la computadora ejecuta un cdigo de instrucciones. El siguiente cdigo es el que se ejecuta cuando se presiona el Calcular_PerimetroCirculo.
Sub Calcular_PerimetroCirculo() Sheets("hoja1").Select area = Range("C4").Value RADIO = Sqr(area / 3.1415) Range("c5").Value = RADIO Range("c6").Value = 2 * 3.1415 * RADIO End Sub

Este el cdigo que se ejecuta cuando se presiona el botn Borrar Celdas


Sub BorrarCeldas()

Range("C5").Clear Range("c6").Clear
End Sub

4 Como se hace en Excel para escribir el cdigo de las subrutinas anteriores


Se estar preguntando ahora como hace para introducir las subrutinas anteriores en el VBA. Para escribir una subrutina con el cdigo en VBA proceda as: Teniendo el Excel abierto, abra el men Herramientas en la barra de Excel, luego seleccione la opcin que se muestra en la siguiente figura y haga clic finalmente en la opcin Editor de Visual Basic

Se debe abrir una ventana como la siguiente:

Que se conoce como el editor de Visual Basic Aplication.

4.1 Insertando un modulo para Subrutinas


Para poder escribir una subrutina inicialmente se debe abrir un mdulo u archivo que las contenga, para ello es necesario hacer lo siguiente: Hacer clic en la opcin Insertar y hacer clic sobre la opcin Mdulo despus de lo cual el editor de VBA se ver as:

4.2 Cmo insertar las subrutinas


Para insertar una subrutina o una funcin en un mdulo se hace lo siguiente: Se hace clic en la opcin Insertar y luego en el men que aparece se hace clic en la opcin procedimiento, y el computador responde mostrando una pantalla como la siguiente:

En el cuadro anterior escriba el nombre del procedimiento en el cuadro de nombre, no deje espacios en blanco entre el nombre, seleccione el tipo procedimiento, y seleccione el mbito pblico.

El editor inserta el cdigo necesario para definir una subrutina. Solo falta ingresar el cdigo. Escriba el cdigo que se muestra aqu:
Sheets ("hoja1").Select area = Range("C4").Value RADIO = Sqr(area / 3.1415) Range("c5").Value = RADIO Range("c6").Value = 2 * 3.1415 * RADIO Entre las palabras Sub Calcular_PerimetroCirculo()

End Sub

El proceso se puede repetir para insertar el mtodo borrarceldas Escriba el cdigo para la subrutina y se tendr as:
Sub BorrarCeldas()

Range("C5").Clear

Range("c6").Clear
End Sub

4.3 Asignndole macros a los Botones


Finalmente hay que asignarles las macro a los botones, para ello vaya a la hoja de clculo y haga visible la barra de herramienta de formulario1, seleccione el botn y trace sobre la hoja los dos botones, cuando termine de trazarlos se le abrir una ventana que le permitir seleccionar la macro que se desea se ejecute cuando se haga clic sobre el botn.

5 Conociendo Aplication

las

caractersticas

de

Visual

Basic

En las prximas lneas conocer porque y cuando usar las instrucciones que se escribieron en cada una de los procedimientos, del ejemplo desarrollado en las pginas anteriores.

5.1 Objetos en Excel


Excel es un Software que esta desarrollado bajo las tcnicas de programacin orientada a objetos, por tanto cuando lo estamos utilizando interactuamos sobre objetos. Un objeto en Excel es algo que puede ser programado o en esencia, controlado. El modelo de objetos de Excel contiene ms de 100 objetos

5.2 Objetos, propiedades y mtodos


Todos los objetos Excel tienen lo que se conoce como propiedades y mtodos. Para poder construir macros interactivas se hace necesario comprender primero los conceptos de objeto, propiedades y mtodos. Un ejemplo de la vida real Piense en los objetos que tiene en su vida y que usted puede controlar: su automvil, su telfono, su televisin, su horno microondas, y su computadora. Observe que todas esas cosas se pueden controlar de alguna manera. Todas pueden describirse. Para cada objeto hay un conjunto de adjetivos asociados con l que representan algn aspecto que se puede medir de un objeto. Definimos entonces una propiedad como un rasgo medible de un objeto. Representan todos los aspectos de un objeto.

Haga clic en el men Ver, luego seleccione Barra de Herramientas, y por ltimo haga clic sobre Formulario.

Ejemplo: Para nuestro automvil, una propiedad es el color del carro, el nmero de puertas, la marca, el modelo. Los mtodos son de otro lado, verbos que representan acciones que pueden realizarse con o sobre un objeto. Ejemplo: Para nuestro automvil, los mtodos podran incluir cosas como arrancar, acelerar, frenar y parar.

5.3 Pero como se entiendes estos conceptos en Excel


Para ir concretando los conceptos anteriores en Excel, tengamos en cuenta que cada objeto aqu tiene un conjunto nico de propiedades que se usan para describirlo y un nico conjunto de mtodos representando las acciones que pueden realizarse con o sobre l. Un primer ejemplo de objeto es el libro de trabajo Workbooks, el cual identifica un archivo de Excel, sus propiedades describen las caractersticas. Algunas propiedades son: Author, Creator, Name, Path, ReadOnly Otro objeto, es el objeto Range que tiene propiedades como value y mtodos como clear.

5.4 Qu se puede hacer con una propiedad de un objeto en Excel?


Cuando se esta utilizando Visual Basic Aplicattion para manipular o controlar un objeto puede realizar las siguientes dos operaciones sobre la propiedad: Establecer la propiedad Obtener el valor de la propiedad

5.4.1 Como se establece una propiedad


Para establecer la propiedad de un objeto se hace lo siguiente: Se escribe: NombreObjeto.nombrepropiedad= valorpropiedad Ejemplo: Veamos de manera prctica estos conceptos, el objeto Range representa una o varias celdas de una hoja de clculo. rea=Range(c4).value

En la operacin que indica tomar un dato que esta en la celda C4, a la variable rea. Range("c5").value = radio

6 Objeto Sheets
Es un objeto que representa que contiene todas la hojas que hay en un libro activo, este objeto se utiliza en la primera macro con el fin de hacer que la macro se situ en una hoja de clculo especifica. Para referirse a una de las hojas en un libro utilizamos la siguiente sintaxis: Sheets(Nombre de la Hoja).propiedad Sheets(Nombre de la Hoja).NombreMtodo(parmetros) Los objetos Sheets pueden realizar los siguientes mtodos: Add, Copy, Delete, FillAcrossSheets, Move, PrintOut, PrintPreview, Select Los mismos objetos tienen las siguientes propiedades: Application, Count, Creator, Item, Parent, Visible, VbPageBreaks No es tarea de este documento explicar en detalle todas las propiedades y mtodos, se invita al lector a consultarlas en la ayuda.

6.1 Mtodo Select


Se utiliza para seleccionar una hoja de clculo especfica, esto es til cuando se quiere que una macro se ejecute sobre una hoja de clculo especifica. Tambien se usa para seleccionar un rango especfico. Ejemplo: En el cdigo escrito se uso la instruccin: Sheets("hoja1").Select Para hacer que al iniciar la macro se seleccione la hoja1, esto garantiza que la macro se ejecutar en dicha hoja. Range(A1).select Selecciona una celda determinada de la hoja de calculo en este caso la celda A1.

Objeto Range

Un objeto range se utiliza en las subrutinas (procedimientos) para interactuar sobre celdas o rangos de celdas en una hoja de clculo. El usando este objeto nos podemos referir a una sola celda, una seleccin de celdas, selecciones mltiples, una fila o columna, o un rango 3D. En las macros que se han desarrollado ha guardado datos en la hoja de clculo, en esta seccin, entender como se introducen datos en una celda de la hoja de clculo desde

7.1 Propiedades de un objeto Range


La siguiente es una lista de las propiedades de ms comn uso con el objeto Range. Propiedades del objeto Range Address Count

Descripcin de la propiedad
Devuelve la ubicacin actual del rango Esta propiedad se utiliza para saber cuantas celdas conforman un rango. Ejemplo: Range("A1").Count Devuelve la frmula utilizada para calcular el valor a desplegarlo. Ejemplo: La siguiente expresin define la formula en la celda A2. Range("A2").Formula="=A1*10" Se utiliza para volver a darle tamao a el rango actualmente seleccionado. Devuelve el valor del rango. Ejemplo: El siguiente cdigo pone el valor 23 en la celda activa ActiveCell.Value = 23 Devuelve un objeto Range que representa la celda activa de la ventana activa (la ventana superior) o de la ventana especificada. Si la ventana no contiene una hoja de clculo, esta propiedad devolver un error. Es de slo lectura. Ejemplo: En el siguiente cdigo la celda activa toma el valor 23. ActiveCell.Value = 23

Formula

Resize

Value

ActiveCell

10

Propiedades del objeto Range

Descripcin de la propiedad
Se utiliza para desplazarse de un rango a otro. Ejemplo: El siguiente cdigo ActiveCell.Offset(1, 1) devuelve el objeto Range correspondiente a la celda que est 1 fila adelante y una columna a la derecha de la celda activa.

Offset

7.2 Mtodos del Objeto Range


El mtodo Range tambin tiene muchos mtodos, la siguiente tabla muestra algunos de los mtodos. Mtodos del objeto Range Activate Clear Copy Cut Select PasteSpecial Ejemplos: Las siguientes son instrucciones que hemos utilizado en las macros de nuestro primer ejemplo. area = Range("C4").Value En esa instruccin estamos llevando el valor almacenado en la celda C4 a la variable rea. La siguiente instruccin:
Range("C5").Value = RADIO

Descripcin del mtodo


Esta propiedad activa un rango. La celda activa es donde esta posicionado el cursor. Si hay un rango seleccionado la celda activa se ve generalmente de un color blanco. Este mtodo borra el contenido de un rango. Copia el contenido de un Rango en el portapapeles. Coloca el contenido de un Rango en el portapapeles. Selecciona un Rango. Pega el contenido del portapapeles en un rango

11

Esta llevando el valor de una variable en el procedimiento a la celda c5 de la hoja de clculo seleccionada. Finalmente la instruccin siguiente: Range("C5").Clear Muestra como borrar el contenido de una celda especifica en este caso C5.

8 Funcin InputBox
Es una funcin que se utiliza para mostrar un mensaje en un cuadro de dilogo, y esperar que el usuario escriba o no un texto y luego haga clic sobre uno de los botones que aparecen en la ventana. Cuando esto ocurre la funcin devuelve contenido del cuadro de texto con lo que se escribi como un dato String, si el cuadro de texto esta vaci en el momento de hacer clic, la funcin retorna la cadena vaca. Esta funcin se usa en un programa cuando deseamos que el computador solicite un dato necesario para un programa. Variable=Inputbox(prompt[, title][, default][, xpos][, ypos][, helpfile, context])

Parmetro

Prompt

Title

Xpos

Descripcin Requerido. Expresin de cadena que se muestra como mensaje en el cuadro de dilogo. La longitud mxima de prompt es de aproximadamente 1024 caracteres, segn el ancho de los caracteres utilizados. Si prompt consta de ms de una lnea, puede separarlos utilizando un carcter de retorno de carro (Chr(13)), un carcter de avance de lnea (Chr(10)) o una combinacin de los caracteres de retorno de carro-avance de lnea (Chr(13) y Chr(10)) entre cada lnea y la siguiente. Opcional. Expresin de cadena que se muestra en la barra de ttulo del cuadro de dilogo. Si omite title, en la barra de ttulo se coloca el nombre de la aplicacin. Opcional. Expresin numrica que especifica, en twips, la distancia en sentido horizontal entre el borde izquierdo del cuadro de dilogo y el borde izquierdo de la pantalla. Si se omite xpos, el cuadro de dilogo se centra horizontalmente.

12

Opcional. Expresin numrica que especifica, en twips, la distancia en sentido vertical entre el borde superior del cuadro de dilogo y el borde superior de la Ypos pantalla. Si se omite ypos, el cuadro de dilogo se coloca a aproximadamente un tercio de la altura de la pantalla, desde el borde superior de la misma. Para ms informacin consultar la ayuda de Visual Basic aplication Ejemplo: En el cdigo del procedimiento Calcular_PerimetroCirculo, encuentra el cdigo siguiente: dato = InputBox(" Ingrese el area del Circulo ", "Ingresar dato" _ , 8, 1300, 1400) Cuando se ejecuta la macro usted ver la siguiente ventana:

Cuando se presiona el botn Aceptar el valor en este caso 8 es almacenada en la variable dato La variable debe ser de tipo String

9 Cmo controlar el flujo de la aplicacin


En muchas macros usted podr querer que la computadora haga determinadas acciones dependiendo de que se cumpla o no una determinada situacin, para esos casos usted deber utilizar la funcin if then/else

Estructura de decisin

Instruccin if /then /else

13

If <expre lgica> then


Acciones si expre lgica es verdadera Else Acciones si expre lgica es falsa. End if

Para construir la expresin lgica se utilizan los siguientes operadores de relacin: Operador de Relacin Significado = Igual a <> Diferente >= Mayor o Igual que < Menor que <= Menor o Igual que Para crear expresiones lgicas compuestas se usa los operadores lgicos And, Or, Not, Xor2 Ejemplo Escriba una macro en Excel que calcule el permetro de una circunferencia y el radio conociendo el rea su crculo.

Si una, y solamente una, de las condiciones es verdadera, el resultado es verdadera, el resultado es verdadero. Si ambas son falsas o ambas verdaderas, el resultado es falso.

14

Inicio

Indique el rea

rea
Si
rea>=0 =0>=0
radio = area

No

No se puede

perimetro = 2 * radio

radio=,radio Permetro=,permetro

Dicho diagrama lo podemos hacer operativo en Visual Basic de la siguiente manera, en la subrutina CalcularPerimetro_Circulo como se muestra en la siguiente pgina:
Sub Calcular_PerimetroCirculo() Dim dato As String Dim area As Double, radio As Double Sheets("Hoja1").Select dato = InputBox(" Ingrese el area del Circulo ", "Ingresar dato" _ , 8, 1300, 1400) 'Lo que se toma del cuadro de texto se lleva a una celda en la hoja de calculo Range("C4").Value = dato 'Lo que se lee en InputBox se lleva a una variable en el procedimientos area = Val(dato)

If area >= 0 Then radio = Sqr(area / 3.1415)

15

Range("c5").Value = radio Range("c6").Value = 2 * 3.1415 * radio Else MsgBox ("El rea no puede ser Negativa ") BorrarCeldas End If End Sub

En el cdigo anterior se puede observar como se hace una llamada a una subrutina o procedimiento que ya hemos creado, en este caso cuando el area es negativa se despliega un mensaje y luego se ejecuta el procedimiento Borrar celdas que ya mencionamos su cdigo.

10 Funcin Msgbox
Muestra un mensaje en un cuadro de dilogo, espera a que el usuario haga clic en un botn y devuelve un tipo Integer correspondiente al botn elegido por el usuario. Sintaxis MsgBox (prompt[, buttons][, title][, helpfile, context]) La sintaxis de la funcin MsgBox consta de estos argumentos con nombre: Parmetro Descripcin Requerido. Expresin de cadena que se muestra como mensaje en el cuadro de dilogo. La longitud mxima de prompt es de aproximadamente 1024 caracteres, segn el ancho de los caracteres utilizados. Si prompt consta de ms de una lnea, puede separarlos utilizando un carcter de retorno de carro (Chr(13)), un carcter de avance de lnea (Chr(10)) o una combinacin de los caracteres de retorno de carro-avance de lnea (Chr(13) y Chr(10)) entre cada lnea y la siguiente. Opcional. Expresin numrica que corresponde a la suma de los valores que especifican el nmero y el tipo de los botones que se pretenden mostrar, el estilo de icono que se va a utilizar, la identidad del botn predeterminado y la modalidad del cuadro de mensajes. Si se omite este argumento, el valor

Prompt

buttons

16

Descripcin predeterminado para buttons es 0. Opcional. Expresin de cadena que se muestra en la barra de ttulo del cuadro de Title dilogo. Si se omite title, en la barra de ttulo se coloca el nombre de la aplicacin. Para ms informacin consultar la ayuda de Visual Basic aplication

Parmetro

10.1 Constantes de Botn disponibles para usar en el Msgbox


Las siguientes son algunas constantes de botn de uso comn en el cuadro msgbox: Constante VbOKOnly VbOKCancel VbAbortRetryIgnore VbYesNoCancel VbYesNo VbRetryCancel VbCritical VbQuestion VbExclamation VbInformation VbDefaultButton1 VbDefaultButton2 VbDefaultButton3 VbDefaultButton4 Valor
0 1 2 3 4 5 16 32 48 64 0 256 512 768

Descripcin Muestra solamente el botn Aceptar. Muestra los botones Aceptar y Cancelar. Muestra los botones Anular, Reintentar e Ignorar. Muestra los botones S, No y Cancelar. Muestra los botones S y No. Muestra los botones Reintentar y Cancelar. Muestra el icono de mensaje crtico. Muestra el icono de pregunta de advertencia. Muestra el icono de mensaje de advertencia. Muestra el icono de mensaje de informacin. El primer botn es el predeterminado. El segundo botn es el predeterminado. El tercer botn es el predeterminado. El cuarto botn es el predeterminado.

17

Constante VbApplicationModal

Valor
0

Descripcin Aplicacin modal; el usuario debe responder al cuadro de mensajes antes de poder seguir trabajando en la aplicacin actual.

Ejemplo: En el cdigo del procedimiento de CalcularPerimetro_Circulo se encuentra una instruccin que hace uso de la funcin msgbox as:
MsgBox ("El rea no puede ser Negativa ")

La cual se encarga de sacar un mensaje como el siguiente:

11 Nmeros Aleatorios
En muchas situaciones de programacin se necesita que la computadora, genere nmeros aleatorios (al azar), cuando se necesite hacer eso, el VBA le permite generar nmeros aleatorios mediante la funcin rnd, que se aplica a continuacin.

11.1 Funcin rnd()


La funcin rnd se utiliza con la siguiente sintaxis: rnd() Genera un numero aleatorio mayor o igual a cero y menor que uno, para generar nmeros aleatorios en el intervalo [a,b] con b>a, se debe usar la siguiente formula. Int ((b-a+1)*rnd ()+a) Se le sugiere al lector que consulte la ayuda de Visual Basic Application para obtener ms informacin sobre esta funcin Ejemplo: En un supermercado se estan dando descuentos a los clientes a partir de los valores de su compra, segn el color de una bola que se saca de una bolsa, segn muestra la siguiente tabla:

18

Color Descuento (%) Roja 0 Azul 3 Blanca 4 Amarilla 6 Se quiere un algoritmo que dado el valor de la compra, y simulando la sacada de la bola, calcule el valor del descuento, el % de descuento, y el valor a pagar por un cliente.

Anlisis Que es lo que se necesita? Se necesita que el computador calcule el valor a pagar (valorPagar) por una persona en un supermercado. Calcular el valor % de un descuento (porcentajeDescuento), que se saca de acuerdo con el color de una bola segn la tabla arriba. Calcular el valor del descuento (valorDescuento) Para calcular el valor del descuento se multiplica el valor de la compra (valorCompra) por el porcentaje de descuento. Valor a pagar se calcula de la siguiente manera: valorPagar= valorCompra valorDescuento Colores de la bola: Los vamos a simular as: Color Nmero Roja 0 Azul 1 Blanca 2 Amarilla 3 La siguiente imagen muestra como se organizo la interfaz para la presentacin de datos:

19

El siguiente es la subrutina en VBA que da solucin al problema: Public Sub descuentos()


Dim dato As String Dim bola As Integer Dim valorDescuento As Double, valorPagar As Double Dim descuento As Double, valorCompra As Double dato = InputBox("ingrese el valor a pagar") valorCompra = Val(dato) bola = Int(4 * Rnd()) Range("c12").Value = valorCompra If bola = 0 Then descuento = 0 Range("c13").Value = "Roja" Else If bola = 1 Then descuento = 3 Range("c13").Value = "Azul" Else If bola = 2 Then descuento = 4 Range("c13").Value = "Blanca" Else descuento = 6 Range("c13").Value = "Amarilla" End If End If End If

End Sub El diagrama de la subrutina anterior se puede ver as:

20

Inicio

Ingrese valor compra

valorCompra

Bola= Int (4*rnd ()) NO Bola= ()

SI

SI Bola=1 SI
Descuento=3%

NO Descuento=0%

NO Bola=2

Descuento=4%

Descuento= 6%

Calculo de: Valor de descuento Valor a pagar

21

12 Procesos Repetitivos
En esta seccin veremos como un programador puede lograr que el computador realice de manera repetida la ejecucin de varias instrucciones.

12.1 Instruccin Mientras:


La instruccin mientras, la utilizan los programadores para indicarle a la computadora que instrucciones debe ejecutar de manera repetida para lograr realizar un determinado proceso.

MIENTRAS

Expresin lgica

Instrucciones Que define el proceso que Se debe repetir Mientras la expresin lgica es Verdadera Fin Mientras

La computadora al encontrar una instruccin mientras se comporta as:

1. Evala la expresin lgica, si es verdadera, entra a ejecutar todas las instrucciones entre el Mientras y el Fin Mientras. Si es falsa continua con la ejecucin de las instrucciones despus del Fin Mientras. 2. Al llegar a Fin Mientras la computadora vuelve a evaluar la expresin lgica; si es verdadera repite el proceso, esto es vuelven a ejecutar todas las instrucciones entre el Mientras y el Fin Mientras; si es falsa, continua ejecutando las instrucciones despus del Fin Mientras. 3. Dentro de las instrucciones a repetir, debe existir al menos una instruccin que haga que la expresin lgica sea falsa en algn momento, para garantizar que el ciclo se deje de ejecutar.

22

12.2 La instruccin Mientras (while) en VBA


La instruccin mientras en VBA se escribe as:

Do While Expresin lgica Instrucciones Que define el proceso que Se debe repetir Mientras la expresin lgica es Verdadera

While Expresin lgica Instrucciones Que define el proceso que Se debe repetir Mientras la expresin lgica es Verdadera

Loop Ejemplo:

Wend

Escriba una macro que escriba un mensaje que se ingresa n veces en un rango de celda que usted elije. Algoritmo: Variables Entera n, i; Cadena mensaje; Escriba Cuantas celdas va escribir Leer (n) Escriba Ingrese el mensaje Leer (mensaje) i=1 Suma=0 Mientras i<=n Escriba mensaje i=i+1 Loop VBA
Public Sub EscribiendoTexto() Dim texto As String Dim n As Integer, i As Integer Dim dato As String Sheets("hoja2").Select texto = InputBox("Indique el texto a escribir ") dato = InputBox("Indique el numero de veces que desea " _ & Chr(13) & texto) n = Val(dato) Range("E6").Value = n Range("E6").Select i=1 Do While (i <= n) Range("e6").Offset(i + 2, 0).Value = texto i=i+1 Loop End Sub

12.3 El mtodo Offset:


Devuelve un objeto Range que representa un rango desplazado con respecto al rango especificado. Es de slo lectura.

23

expresin.Offset(RowOffset, ColumnOffset) Donde expresin es un rango. Expresin Es el rango con respecto al cual se quiere desplazar. RowOffset Variant opcional. El nmero de filas (positivo, negativo o cero) que indica el desplazamiento del rango. Los valores positivos desplazan hacia abajo y los negativos, hacia arriba. El valor predeterminado es 0. ColumnOffset Variant opcional. El nmero de columnas (positivo, negativo o cero) que indica el desplazamiento del rango. Los valores positivos desplazan a la derecha y los negativos, hacia la izquierda. El valor predeterminado es 0. Ejemplo: En la subrutina del ejemplo anterior la expresin: Range("e6").Offset(i + 2, 0).Value = texto Esta permitiendo desplazarse con respecto a la celda E6 e ir poniendo un texto en unas celdas especificas. Ejemplos: Escriba una macro en VBA que permita calcular todos los nmeros que existen entre el numero 1 y n y al final nos diga el valor de la suma. La macro debe tomar el valor de n desde la celda B1 y luego realizar el proceso solicitado desde la celda B3 en adelante. Anlisis: Se nos esta solicitando crear todos los nmeros entre 1 y n Datos de entrada: Ingresar el valor de n que indica cuantos nmeros, se van a ingresar. Qu debe calcular la mquina? La mquina debe calcular cada nmero entre 1 y n, para ello se debe hacer lo siguiente:

24

Una variable que llamaremos numero la iniciamos con el valor de 1 y luego la asignamos a la celda B3, luego, incrementamos la variable numero as: numero=numero +1 Y el nuevo valor se asigna a la celda B4, y el proceso se repite mientras numero sea menor o igual que n.
Inicio

Ingrese n

n
No

i<=n
Si

Escriba,i

i=i+1

Fin

El anterior es el diagrama de flujo de la subrutina, siguiente:

13 La propiedad end:
En muchas situaciones se necesita seleccionar un rango de celdas en una macro, para poder realizar esto, se necesita conocer la celda inicial del rango y la celda final. Conocer la primera de ellas se puede hacer por medio del objeto selection, para conocer la ltima se hace utilizando la propiedad End de una seleccin as: Selection.End(Direccion) Direccin Direccin de desplazamiento.

25

Direccin puede ser una de estas constantes. xlDown xlToRight xlToLeft xlUp Ejemplo: La siguiente es la subrutina que nos permite borrar un conjunto de celdas de las cuales no conocemos su rango. Public Sub BorraRangoDesconocido() Dim x As Range Dim n As Integer Range("D10").Select Range(Selection, ActiveCell.End(xlDown)).Select Selection.ClearContents End Sub Ejercicios: Escriba una macro en Excel que dado n, se escriban todos n valores enteros aleatorios entre 1 y 32000, con un letrero al frente de cada nmero diciendo si el nmero es par o impar. Ejercicio: Escriba una macro en Excel que dado n, se escriban todos los divisores que tiene n entre 1 y n. Ejercicio: Escriba una macro en Excel que dado n, se escriban todos los trminos de la suma siguiente, al final debe escribir el valor de la suma. n 1 1 2 n 2i = 21 + 2 2 +K+ 2n i =1 Ejercicio: La conjetura de Ulam. La siguiente se llama la conjetura de Ulam en honor del matemtico S.Ulam: Dado un entero cualquiera positivo. Si es par divdalo por 2; si es impar; multiplquese por 3 y agrguese 1. Obtenga enteros sucesivamente repitiendo el proceso hasta que el entero en curso no sea 1. Al final se obtendr un nmero 1, independientemente del entero inicial. Ejemplo 26 13 40 20 10 5 16 8 4 2 1

26

Escriba una macro que dado n calcule la conjetura de ULAM para ese nmero. Ejercicio Escriba un programa que permita entrar nmeros hasta cuando el usuario dgito un 0. Cuando el nmero sea 0, se debe decir cuantos nmeros positivos ley y cuanto negativos, la suma de los positivos y la suma de los negativos. Ejemplo: El siguiente es el diagrama de flujo que da solucin al problema de encontrar todos los divisores de un nmero entero n.
Inicio
Public Sub CalcularDivisores() Dim dato As String Dim i As Integer, n As Integer, filaDesplazamiento As Integer dato = InputBox("Ingres el numero para encontrar divisores", "Entrada", 1) n = Val(dato) i=1 filaDesplazamiento = 1 Do While (i <= n) If (n Mod i = 0) Then Range("B4").Offset(filaDesplazamiento, 0).Value = i filaDesplazamiento = filaDesplazamiento + 1 End If i=i+1 Loop End Sub

Entrar n

n i=1 no i<=n si
n mod i =0
Escriba n

i=i+1

Fin

27

14 Las Variables y las Constantes:


En esta seccin comenzara a aprender a utilizar el VBA de manera interactiva, pero para ello deberemos definir los conceptos de variable, constante y objeto range.

14.1 Qu son las variables?


Son lugares en la memoria del computador donde la computadora almacena temporalmente datos mientras se esta ejecutando una macro.

14.2 Tipos de Variables


El tipo de una variable se utiliza para decirle al computador que tipo de informacin se va almacenar en la memoria. La siguiente tabla muestra algunos tipos de datos que maneja el VBA. Tamao de almacenamiento
1 byte 2 bytes 2 bytes 4 bytes 4 bytes 0 a 255 True o False -32,768 a 32,767 -2,147,483,648 a 2,147,483,647 -3,402823E38 a 1,401298E-45 para valores negativos; 1,401298E-45 a 3,402823E38 para valores positivos 4,94065645841247E-324 para valores negativos; 4,94065645841247E-324 a 1,79769313486232E308 para valores positivos -922.337.203.685.477,5808 922.337.203.685.477,5807 a

Tipo de Dato Byte Boolean Integer Long (entero largo) Single (coma flotante/ precisin simple) Double (coma flotante/ precisin doble -) Currency (entero a escala) Decimal Date Object String (longitud variable) String (longitud fija) Variant

Intervalo

8 bytes 8 bytes

14 bytes

8 bytes 4 bytes 10 bytes + longitud de la cadena Longitud de la cadena 16 bytes

+/-79.228.162.514.264.337.593.543.950.335 sin punto decimal; +/-7,9228162514264337593543950335 con 28 posiciones a la derecha del signo decimal; el nmero ms pequeo distinto de cero es+/0,0000000000000000000000000001 1 de enero de 100 a 31 de diciembre de 9999 Cualquier referencia a tipo Object Desde 0 a 2.000 millones Desde 1 a 65.400 aproximadamente Cualquier valor numrico hasta el intervalo de

28

Tipo de Dato
(con nmeros) Variant (con caracteres) Definido por el usuario (utilizando Type)

Tamao de almacenamiento
un tipo Double 22 bytes + longitud de la cadena Nmero requerido por los elementos

Intervalo

El mismo intervalo que para un tipo String de longitud variable El intervalo de cada elemento es el mismo que el intervalo de su tipo de datos.

14.3 Como crear variables en los mtodos?


Para crear una variable en los mtodos debe usar la instruccin Dim siguiendo la sintaxis siguiente: Dim nombre_variable as tipo_de_dato
Donde nombre_variable3 es el nombre de la variable que se esta creando y el tipo de dato es alguno de los definidos en la tabla anterior. Los nombres de las variables deben empezar con letras y pueden contener letras, nmeros y ciertos caracteres especiales. No pueden usar espacios puntos, signos de exclamacin o los caracteres @, &, $, #. Adems no pueden tener ms de 255 caracteres Ejemplo: La siguiente macro muestra el uso de las variables de una manera simple:
Public Sub Macro3() Dim nombre As String Dim edad As Integer Dim dias_vividos As Long nombre = InputBox("Ingresar su nombre? ", Entrada de dato ) edad = InputBox("Hola " & Nombre & " Ingresa tu edad ", Entrada de dato ) dias_vividos = edad * 365 MsgBox "Sus dias vividos " & Nombre & " son " & dias_vividos, vbOKOnly+VbInformation, " Resultados " End Sub

15 Instruccin Do Loop Until


Es una instruccin similar a la instruccin do while, solo que en esta la condicin de repeticin se evala una vez se ejecuta el proceso almenos una vez. Como se ve en los diagramas siguientes el Do Loop Until, no tiene la expresin mientras al principio de la instruccin, por el contrario tiene la expresin Until (hasta que) lo que esta indicando que las instrucciones se ejecutan hasta cuando la expresin lgica se cumpla.

Se sugiere escribir los nombres de la variable con letras minsculas.

29

Do

Instrucciones a ejecutar mientras se cumpla la condicin

Instrucciones a ejecutar mientras se cumpla la condicin

Hasta que <expresin lgica> Loop Until <expresin Logica>

16 Instruccin For..Next, procesos repetitivos


La instruccin fornext se utiliza en Visual Basic aplication para hacer que el computador realice una determinada tarea una o mas veces. Cuando necesite repetir la ejecucin de un conjunto de instrucciones un numero determinado de veces, necesitar emplear el bucle For .. next. La instruccin For .. Next es la siguiente:

Estructura de repeticin

Instruccin for next

For variable=Vi To Vf [step paso]


Instrucciones a Repetir Next variable

Ejemplo: 1. Escriba un programa que lea un nmero entero n y determine si n es un nmero primo, utilice la instruccin Do Loop Until.

30

2. Escriba un algoritmo que evale la funcin y= -3*X + X3 en el intervalo [-2,2] y nos diga cual es el mximo valor que toma y para cual x es ese valor. 3. Escriba un algoritmo que lea un nmero entero n y escriba en la pantalla la descomposicin en factores primos del n.

N 14 2 7 7 1
4. Calcule el error cometido al calcular e (el nmero de Euler) elevado a la -x si usa para evaluarlo: X2 X3 Xn e x = 1 x + +L+ ( 1) n * 2! 3! n! o si usa exp(). % error = valor aproximado * 100 valor real

5. Escriba un algoritmo que permita calcular el mximo comn divisor de dos nmeros, siguiendo para ello el algoritmo de EUCLIDES, que dice: Tome dos nmeros enteros a y b, si a<b intercambie a con b, sino djelos como estn. Divida ahora a por b y calcule el residuo, si el residuo es cero el mximo comn divisor entre a y b es b, sino haga que a tome el valor de b y b tome el valor del residuo y vuelva a dividir a por b. 6. Escriba un programa que calcule el MCD (mximo comn denominador) y el MCM (mnimo comn mltiplo) de n nmeros. | a *b | MCM (a, b) = MCD (a, b) 7. Para desarrollar multiplicaciones con base en sumas y divisiones, algn ruso curioso desarrollo el siguiente algoritmo para multiplicar.
Ejemplo: Impar Impar 3 1 * * 7 14 7 14 __ 21 5 2 Impar * * 1 14 28 * 14 56 ___ 70

8. El mtodo de Newton-Raphson, es otro de los procedimientos ms comunes que hay para resolver una funcin de la forma f (x)=0, este mtodo consiste en encontrar una sucesin de puntos x0,x1, x2, x3, x4.....xn, mediante la expresin:

xi +1 = xi +

f ( xi ) f '( xi )

31

Ejemplo:
Sea la ecuacin x3 +2x2 + 10x 20=0, con x0 =1 y |xi+1-xi| <10-3 la siguiente tabla muestra los valores que se obtienen con este mtodo:

i
0 1 2 3 4 1

xi
1.41176 1.36934 1.36881 1.36881

|xi+1 xi|
0.41176 0.04243 0.00053 0.0000

|g(x)|
0.24221 0.02446 0.00031 1.09*10-6 1.2714*10-6

Se requiere que usted implemente un algoritmo que dado el xo y el nmero de iteraciones encuentre la solucin a una ecuacin por medio del mtodo de NewtonRaphson.

17 Instruccin Select Case


Se utiliza para seleccionar la ejecucin de un grupo de instrucciones, dependiendo del valor de una variable o el resultado de la evaluacin de una expresin. El uso del select es similar al uso de varias instrucciones if then else anidadas.
Select case nombreVariable Case valor1 Instrucciones para valor1 Case valor2 Instrucciones para valor2 Case valor3 Instrucciones para valor3 Case else Instrucciones para otro valor End select
nombreVariable

valor1
Instrucc iones a ejecutar cuando la variable tiene el valor1

valor2
Instrucc iones a ejecutar cuando la variable tiene el valor2

valorN
Instrucc iones a ejecutar cuando la variable tiene el valorN

La seccin Case else es opcional, cuando se utiliza, se pone all las instrucciones que se desea que la computadora realice cuando el valor de la variable no sea alguno de los valores mencionados en los case.

32

18 La propiedad CurrentRegion
Se habr preguntado como seleccionar un rango del cual no se conoce su tamao. La propiedad CurrentRegion, devuelve la regin colindante con la primera fila y primera columna vaca. Ejemplo: La siguiente macro se sita en la celda F3 de la figura y selecciona todas las celdas que se ven debajo de dicha celda y nos dice cual es el rango seleccionado. Public Sub CurrentRegion() Range("F3").Activate ActiveCell.CurrentRegion.Select MsgBox "El rea seleccionada es " & Selection.Address

End Sub Ejemplo: Escriba un programa en VBA que permita evaluar para todos y cada uno de los elemento de la figura el valor de y, mediante la siguiente expresin.

Utilice para la solucin la instruccin Select Case. t si op = 1 5 t t si op = 2 y= t 6 * si op = 3 o 4 2 1 Para cualquier otro caso En la siguiente pgina tenemos el algoritmo para el botn calcular y junto con las instrucciones en VBA para los botones Calcular y, e Borrar

33

Algoritmo

Cdigo VBA para el botn que calcula los y de cada dato op y t


VBA botn Calcular y Public Sub Evaluar() Dim filas As Integer, op As Integer Dim y As Double, t As Double Dim i As Integer
Range("B3").Select Selection.CurrentRegion.Select filas = Selection.Rows.Count Range("D3").Select For i = 1 To filas - 1 op = Range("D3").Offset(i, -1).Value t = Range("D3").Offset(i, -2).Value Select Case op Case 1 y=t/5 Case 2 y=t^t Case 3, 4 y = 6 * (t / 2) Case Else y=1 End Select Range("D3").Offset(i, 0).Select Selection.Value = y Selection.Style = "Comma" Next End Sub

VBA botn Borrar

Public Sub BorrarDatos() Range("D3").Activate Range(Selection.Offset(1, 0), _ ActiveCell.End(xlDown)).Select Selection.Clear End Sub

34

19 Objeto Selection
En el cdigo con el cual se dio solucin al problema de la pgina anterior, se utilizo el objeto seleccin, el cual se puede utilizar despus de usar el mtodo select vase seccin 6.1, el objeto select devuelve la referencia al objeto que se haya seleccionado, por el momento este objeto se ha utilizado para obtener la referencia a la celda o celdas. En las prximas secciones que podemos seleccionar otros tipos de objetos como libro, hojas de Excel etc.

Ejemplo: El siguiente cdigo:

Range("D3").Offset(i, 0).Select
Con la instruccin anterior estamos seleccionando la celda que se encuentre i celdas por debajo de D3.

Selection.Value = y Selection.Style = "Comma"


En el cdigo anterior, con el Objeto Selection nos estamos refiriendo a la celda que hemos seleccionado i celdas por debajo de la celda D3. Ejercicios Escriba un algoritmo que lea n y calcule:
n

(i + 4 * i
i =1

Anlisis: Datos de Entrada: El valor de n que indicara cuantos trminos de la productoria se deben calcular. Qu es lo que se debe hacer? Calcular el producto de las expresiones que se obtienen con: (i + 4 * i 2 ) para cada i tomando valores entre 1 y n. Cmo se calcula dicho producto? Para realizar el calculo de ese producto, se inicializa una variable que llamaremos productoria con el valor de 1 y luego se ejecuta la instruccin 2 productoria=productoria* (i + 4 * i ) para cada uno de los i entre 1 y n. En la siguiente hoja se encuentra el algoritmo en diagrama de flujo.

35

Queda de ejercicio escribir un programa en VBA que imprima cada uno de los trminos de la productoria, con el valor de i para el cual se calculo y en la ltima celda el valor de la productoria. La siguiente es una interfaz propuesta para el problema.

20 CICLOS ANIDADOS:
Cuando dentro de una instruccin de ciclo repetitivo existe una o ms instrucciones de ciclo repetitivo, decimos que el programa est ejecutando unos ciclos anidados. Ejemplo: Escribir un algoritmo que permita encontrar la siguiente suma: n xi i! i =1

36

Anlisis
Para calcula la suma de los: xi se debe realizar las siguientes operaciones: i! Anlisis Algoritmo Para cada i hacemos lo siguiente: Mientras i<=n HAGA Calculamos el factorial de i x i! Acumulamos el cociente anterior Calculamos el cociente de Incrementamos i
i

Calculamos el factorial de i Calculamos el cociente de xi Suma = suma + i! i=i+1 Fin mientras xi i!

Pero para calcular el factorial del i el algoritmo es el siguiente: Factorial=Factorial * j para cada j=1..i con Factorial arrancando desde 1 Por tanto nos queda que el algoritmo sera as:

Anlisis Para cada i hacemos lo siguiente:


Factorial=1 Factorial=Factorial*i para i=1..n

Algoritmo Mientras i<=n HAGA Factorial=1 Para j=1 hasta i Factorial=Factorial*j Siguiente xi Termino= Factorial Suma = Suma + Termino i=i+1 Fin mientras

xi i! Acumulamos el cociente anterior Incrementamos i Se repite el proceso Calculamos el cociente de

Observe como en ese algoritmo el proceso de calculo del factorial se repite para cada i, aunque no es eficiente muestra como es un ciclo anidado. Ejercicio: Se necesita un programa en VBA que calcule para diferentes xi en un intervalo [a,b] igualmente espaciados con un x, valor de la siguiente sumatoria:

xi i! i =1
n

Para un n dado y fijo:

37

El siguiente es el cdigo que da solucin al problema:


El mtodo de botn calcular suma Public Sub CalcularXi() Dim suma As Double, x As Double Dim n As Integer, filas As Integer, i As Integer Dim j As Integer, factorial As Long, factor As Long Range("B10").Select 'Deseamos saber cuantas filas hay filas = ActiveCell.CurrentRegion.Rows.Count For i = 1 To filas - 1 suma = 0 n = Range("d3").Value x = Range("d9").Offset(i, -1).Value '**Este ciclo calcula la sumatoria ***** For j = 1 To n '****Aqu calculamos el Factorial factorial = 1 For factor = 1 To j factorial = factorial * factor Next '****** Aqu termina el calculo factorial ****** suma = suma + (x ^ j) / factorial Next Range("D9").Offset(i, 0) = suma Range("D9").Offset(i, 0).Style = "Comma" Next End Sub Public Sub IngresarDatos() Dim i As Integer, n As Integer Dim x As Double,a As Double, b As Double Dim delta As Double Dim dato As String Dim bandera As Boolean bandera = False Do dato = InputBox("Ingrese el numero de terminos" _ , "n", 1) If IsEmpty(dato) = False Then If IsNumeric(dato) = True Then n = dato Range("D3").Value = n bandera = True Else MsgBox "Dato Invalido", vbOKOnly + vbInformation End If End If Loop Until bandera Se omite el cdigo de ingreso de los otros datos ver la hoja de calculo Ciclos anidados.xls x=a i=0 Range("B10").Select Do Selection.Offset(i + 1, 0).Value = i Selection.Offset(i + 1, 1).Value = x x = x + delta i=i+1 Loop Until x >= b If (x = b) Then Selection.Offset(i + 1, 0).Value = i Selection.Offset(i + 1, 1).Value = x End If End Sub

El siguiente es el cdigo para el botn que borra las celdas: Public Sub Borrar() Dim x As Range Range("D10").Select Set x = Selection If IsEmpty(x.Value) = False Then Range(Selection, Selection.End(xlDown)).Select Selection.Clear Else MsgBox "Celda vacia" End If End Sub

38

21 El tipo dato Range


As como se pueden declarar variable de tipo double, flota etc. Tambin podemos definir variables de tipo Range, este tipo de variable pueden almacenar objetos de tipo range; esto es pueden almacenar referencias a celdas. Para declarar variables de tipo Range siga la siguiente norma: Dim nombreVariable as Range Ejemplo: En el cdigo del mtodo borrar del ejemplo anterior, se declaro la variable x de tipo range Dim x As Range

21.1 Para inicializar la variable Range


Para lograr que una variable Range referencie una celda se hace de la siguiente manera. Set nombreVariable=ObjetoRange Donde ObjetoRange es una expresin que retorne un rango. Ejemplo: En el cdigo del ejemplo anterior la expresin siguiente: Set x = Range("B11") Le asigna a la variable x la referencia a la celda B11.

1.

Ejercicios Escriba un algoritmo que sea capaz de calcular la siguiente sumatoria:

( i j ) para i
i =1 j =1

xi

2.

Para x pertencientes a un rango [a,b] tomados en intervalos de ancho: (b a ) x = donde n se se ingresa n Escriba un programa que lea a y b nmeros reales y m valores diferentes de n pares que indica en cuantas partes se va a dividir el intervalo [a,b] y evalu la integral de f(x)=x2 + 1, para cada uno de las m particiones diferentes. Si el n que se ingresa no es par el programa no debe calcular ningn valor. 2 * (b - a) b [f( x0 ) + 4f( X 1 ) + 2 * f( X 2 ) + 4 * f( X 3 )K + 4 * f( x n ) + f( xn )] a f(x)dx = 3* n

39

3.

Elabore un algoritmo en VBA que genere aleatoriamente n enteros positivos con valores entre 1 y 20, y luego le calcule a cada numero su cuadrado mediante el siguiente mtodo: 1 al cuadrado es 1 2 al cuadrado es 1+3 que es 4 3 al cuadrado es 1 + 3 + 5 que es 9 4 al cuadrado es 1 + 3+ 5 + 7 que es 16 les calcule a cada uno de ellos su cuadrado.

A
1 2 3 4 5 6 7 8 9 4.

B
Ingrese n

C
5

i 1 2 3 4 5

Nmeros Cuadrado 2 4 4 16 12 144 5 25 14 196

Escriba un programa en VBA que dado a y b extremos de un intervalo, calcule para cada xi en el intervalo que estn a una distancia uniforme x, el valor de e- xi por medio de la serie siguiente: xi x x i + L + (1) n * i 2! 3! n! Y para cada valor calcule el % error por la formula siguiente: valor aproximado % error = * 100 valor real A B C D E 1 2 Ingrese n 5 3 Ingrese a 2 4 Ingrese b 4 5 6 i Xi e-xi error 7 0 2 8 1 2,4 9 2 2.8 10 3 3.2 11 4 3,6 12 5 4,0 e xi = 1 x i +
2 3 n

40

22 INTRODUCCION A LAS ESTRUCTURAS DE DATOS :


22.1 Que es un estructura de datos?
Es un conjunto o coleccin de elementos organizados de una manera especfica en la memoria de la computadora.

22.2 Clasificacin de las estructuras de datos:


En la programacin de computadoras se clasifican las estructuras de datos en estticas y dinmicas, con esta clasificacin se diferencian las estructuras por la manera en que es manejado el espacio de memoria que ocupan durante la ejecucin de un programa. Las estructuras dinmicas cambia el tamao que ocupan en memoria durante su ejecucin, las estructuras estticas no pueden cambiar el espacio que ocupan durante la ejecucin del programa.

22.3 Estructuras de datos estticas


Las dos estructuras de datos estticas4 ms comnmente utilizadas en la programacin de computadoras son los vectores y las matrices.

22.4 Vectores:
Un Vector es un sitio en memoria que se caracteriza por estar conformado por varias celdas consecutivas, cada una de las cuales puede contener un dato. Cada una de esas celdas se identifica por el nombre del sitio en memoria y un nmero llamado ndice que dice la posicin que ocupa en el arreglo. El ndice5 con que se enumeran cada una de las celdas asumiremos que se inicia en 1 y termina en n. Los datos que se almacenan en el vector deben ser del mismo tipo.

Ejemplo:
A Indice 123 1 34 2 455 3 567 4 233 5 432 6

Del arreglo A puede decirse que almacena el dato 455 en la celda 4 de dicho vector y que esa posicin s referencia por A(3) Algunos lenguajes como Java y VBA numeran las posiciones de un vecto arrancando en 0, como muestra la figura:
A Indice 123 0 34 1 455 2 567 3 233 4 432 5

Observe como la celda primera se indexa con el numero 0, y la ltima con el 5, el total de celdas en el vector es 6.
Aunque hoy en da algunos compiladores modernos permiten implementar estas dos estructuras de tal manera que pueden ser estticas o dinmicas de acuerdo con las necesidades del programador. 5 Lenguajes como Java, C y Visual Basic indexan los vectores comenzando con 0.
4

41

22.4.1

Declaracin de un Vector

La declaracin de un vector se har de la siguiente manera: Nombre_de_la_variable( tamao ) :Tipo_de_dato Donde el tamao es un nmero entero con el cual indicaremos cuantas celdas debe tener el vector.

Ejemplo: La siguiente declaracin permite crear en memoria un vector con seis celdas consecutivas.
A( 6 ) :ENTEROS

22.4.2 22.4.3

Entrando datos a un arreglo: Entrar dato a una celda del vector:

Se pueden entrar datos a un arreglo de dos maneras:

Para ello se declara una sentencia de la forma: A[i]=<expresin>; donde i es el nmero de la celda que se quiere acceder y en la expresin se pueden definir cosas como:

Ejemplo :
A[3]=10; Almacena en la posicin 3 del vector A el valor 10. A[4]=A[3]+20; Almacena en la posicin 4 del vector A el valor de las suma de 20 y lo que hay en la celda A[3], que si suponemos que es 10 estamos almacenando 30 en la celda 4.

22.4.3.1 Entrar de manera ordenada datos a todas las celdas del vector:
Algoritmo para entrar datos al Vector
Para i=indice_inicial Hasta indice_final Haga ESCRIBA('Entre A[',i,'])='); LEER(A[i]); Siguiente;

Algoritmo abreviado
Leer (A[i]) Con i=1 ..n

42

Ejemplo:
Para entrar todos los datos para el vector de nuestro ejemplo:

Para i=1 Hasta 4 Haga ESCRIBA('Entre A[',i,'])='); LEER(A[i]); siguiente; Ejemplo: Escriba un algoritmo que permita almacenar n elementos en un vector A y en un vector B y la computadora debe obtener el producto escalar entre los dos vectores.
Anlisis: Datos de entrada: n A(i) B(i) Dato de salida: C(i) : : : numero de elementos que se ingresan Los n elementos del vector A Los n elemento del vector B El vector con los n elementos donde C(i)=A(i)*B(i) para i=1..n

Algoritmo Leer n Leer(A(i)) con i=1..n Leer (B(i)) con i=1..n Para i=1 Hasta n C(i)=A(i)*B(i) Siguiente Para i=1 Hasta n Escribir(C(i)) Siguiente Ejercicio: Haciendo uso de papel y lpiz, siga el siguiente algoritmo y suponga que cuando se hace la lectura del vector X se ingresan los siguientes datos: 50, 15, 56, 14, 35, 1, 12, 9 y cuando se hace la lectura de n se ingresa 8. Diga que es lo que hace el algoritmo. Algoritmo
Leer n Leer(X(i)) con i=1..n Para i=1 to n-1 Para j=1 hasta n-1

Si (

x[ i ]>X[j+1]) entonces
43

Algoritmo Aux=x[j] x[j]=x[j+1] x[j+1]=Aux Fin si Siguiente Siguiente Ejemplo: Escriba un algoritmo que lea un vector de 10 posiciones con nmeros reales. El algoritmo debe averiguar cual es el mayor nmero que hay en el vector y en que posicin se encuentra y cual es el menor y en que posicin estn. Anlisis: Sean ai un conjunto de nmeros con i=1 .. n Para encontrar el mximo de ese conjunto se procede as: Se suponer que el mayor elemento sea a1 y se compara cada ai donde i=2..n con el mayor, si el ai es mayor que el mayor este ser el nuevo mayor. Cuando el proceso se ha repetido para cada i=2..n, tendremos el mximo elemento en el mayor. Seudocodigo Para i=1 hasta n Haga Leer(ai) Leer ai con i=1..n Siguiente Mximo= a1 Suponemos el mximo a1 Posicin=1 Para i=2 hasta n Haga Para cada i=2..n Se compara cada ai con el mximo, si el ai es SI ai >MximoENTONCES mayor que el mayor el nuevo ai ser el nuevo Mximo= ai Posicin=i mayor FIN SI Siguiente Escribir el Mximo Escriba(Mayor =, Mximo); Escribir la Posicin Escriba(Est en = , posicin); Ejemplo Escribir un algoritmo que permita almacenar en un vector fsica los m carnets de los estudiantes que perdieron Fsica 1 y en un vector calculo los carnet de los n estudiantes que perdieron Clculo, se quiere encontrar un vector C con los carnet de los que perdieron ambas materias. Anlisis El siguiente vector muestra los m carnets de los estudiantes que perdieron Fsica: Fsica 12 15 17 45 56 78 Algoritmo

44

El siguiente vector muestra los carnets de los estudiantes que perdieron Clculo: Calculo 34 12 45 234 17

Para encontrar los carnets que perdieron Fsica y Clculo hay que hacer el siguiente proceso: Se compara cada elemento del vector Fsica[i] con i=1..m con cada uno de los elementos del vector Calculo[j] con j=1..n, si Fsica[i] es igual algn Calculo[j] el elemento Fsica[i], es llevado al vector C en la posicin k.

Subproblemas

Seudocdigo

Escriba Ingresar el numero n de estudiantes Ingresar el numero de estudiantes que perdieron que perdieron fsica 1 Fsica Leer(n) Escriba Ingresar el nmero m de estudiantes Ingresar el numero de estudiantes que perdieron que perdieron clculo. calculo Leer(m) Ingresar los n carnet de los que Leer (Fsica[i]) con i=1..n perdieron fsica Ingresar los m carnet de los que Leer (calculo[i]) con i=1..m perdieron clculo. i=1 k=1 Mientras i<=n Haga j=1 Comparar cada carnet de los Mientras j<=m Haga estudiantes que perdieron Fsica Si Fisica[i]=Calculo[j] Entonces con los carnets de los que perdieron C[k]=Fisica[i] calculo, si Fsica[i] es igual k=k+1 calculo[j], entonces C[k]=Fsica[i] Fin Si j=j+1 Fin Mientras i=i+1; Fin Mientras Para j=1 hasta k-1 Escribir el vector C[j] para j=1..k-1 Escriba (C[j]) Fin para

45

23 Los vectores y matrices en VBA


Si desea utilizar un vector o una matriz en una subrutina de VBA debe seguir la siguiente sintaxis en sus programas.

23.1 Declaracin de vectores:


Para declarar una variable de tipo Vector hay que seguir la siguiente sintaxis: Dim nombre_variable(n) AS tipo_de_dato Donde n es un nmero entero que indica que la variable puede almacenar n + 1 elementos. El indice de cada elemento en el vector son numerado con valores entre 0 y n Dim nombre_variable(n1 To n2) AS tipo_de_dato Donde n1 es un numero entero que indica que la primera celda tiene el indice con numero n1 y la ultima tiene el indice n2. La variable tiene n2-n1 celdas con n1>n2 Ejemplo: La siguiente declaracin en un programa en Visual Basic crea una variable Vector, con 5 celdas, cada una de ellas se identifica por el nmero 0, 1, 2, 3, 4. Dim A(4) As Integer

Ejemplo: La siguiente declaracin en un programa en Visual Basic crea una variable Vector, con 4 celdas, cada una de ellas se identifica por el nmero 2, 3, 4,5. Dim A( 2 To 5) As Integer

46

23.1.1

Vectores Dinmicos:

A veces tendr problemas en los que durante la ejecucin del programa necesitar cambiar el tamao en memoria del vector, es ese el momento en que deber utilizar los vectores dinmicos. Para crear vectores dinmicos siga los siguientes pasos.
1. Declare el vector utilizando la instruccin Dim pero no especifique la dimensin. Ejemplo: Dim B() AS Integer 2. Asigne el tamao al vector antes de hacer referencia alguna celda dentro del vector, utilice la instruccin ReDim para lograr el vector del tamao deseado. Ejemplo: Redim B(10) En este momento ha creado un vector con 11 celdas.

Puede utilizar al momento de ejecutar la instruccin Redim la partcula To para definir la numeracin de los subndices del vector. Tenga en cuenta que cada que se ejecuta la instruccin Redim perder todos los datos almacenados en el vector en el momento de la ejecucin de dicha instruccin.

23.2 Las Matrices


Una Matriz es un sitio en memoria que se caracteriza por ser un arreglo de varias filas y varias columnas consecutivas organizadas de tal manera que conforman un rea rectangular, en la cual se interceptan entre si originando celdas. Cada una de las cuales se identifica dentro de los programas, por el nombre del sitio en memoria y dos nmeros llamado ndice que especifican la fila y la columna que dan origen a cada celda.

23.2.1

Declaracin de matrices:

Para declarar una variable de tipo Matriz hay que seguir la siguiente sintaxis: Dim nombre_variable(m,n) AS tipo_de_dato Donde m es un numero entero que indica que la matriz debe tener m+1 filas Donde n es un numero entero que indica que la matriz debe tener n+1 columnas. El ndice de cada fila en la matriz son numerado con valores entre 0 y m. El ndice de cada columna en la matriz son numerado con valores entre 0 y n. Dim nombre_variable(n1 To n2) AS tipo_de_dato

47

Donde n1 es un nmero entero que indica que la primera celda tiene el ndice con numero n1 y la ultima tiene el ndice n2. La variable tiene n2-n1 celdas con n1>n2 Ejemplo: La siguiente declaracin en un programa en Visual Basic crea una variable Matriz, con 5 filas, cada una de ellas se identifica por el nmero 0, 1, 2, 3, 4, y 3 columnas numeradas con numero entre 0,1,2 Dim B(4,3)As Integer

Ejemplo: La siguiente declaracin en un programa en Visual Basic crea una variable Matriz, con 3 filas, cada una de ellas se identifica por el nmero 1,2,3 y con cuatro columnas numeradas con 1, 2, 3, 4. Dim B( 1 To 3, 1 To 4) As Integer

48

23.3 Matrices Dinmicos:


A veces tendr problemas en los que necesitar cambiar el tamao en memoria durante la ejecucin del programa de la matriz, es ese el momento en que deber utilizar las matrices dinmicas. Para crear matrices dinmicos siga los siguientes pasos.
1. Declare la matriz utilizando la instruccin Dim pero no especifique la dimensin. Ejemplo: Dim B() AS Integer 2. Asigne el tamao al vector antes de hacer referencia alguna celda dentro del vector, utilice la instruccin ReDim para hacer crear el vector del tamao deseado. Ejemplo: Redim B(4,3) En este momento ha creado una matriz con 12 celdas.

Puede utilizar al momento de ejecutar la instruccin Redim la particula To para definir la numeracin de los subndices del vector. Tenga en cuenta que cada que se ejecuta la instruccin Redim perder todos los datos almacenados en el vector en el momento de la ejecucin de dicha instruccin. Funcin UBound: La funcin UBound se utiliza en los programas cuando se quiere saber cual es el ltimo indice de una vector o matriz. Ejemplo El siguiente cdigo ilustra un posible uso de la variable funcin UBound con los vectores. Dim A(3) as Integer ........ ........ 'Almacena en la variable n un 3 n=UBound(A) Ejemplo El siguiente cdigo ilustra un posible uso de la funcin UBOUND con las matrices. Dim B(1 To 5, 1 To 3) as Double ........ ........ 'Almacena en la variable n un 5, que es ltimo ndice de las filas 'Con el nmero 1 se le indica a la funcin UBOUND que deseamos 'conocer el indice de las filas

49

n=UBound(B,1) 'Almacena en la variable m un 3, que es ltimo indice de las columnas 'Con el nmero 2 se le indica a la funcin UBOUND que deseamos 'conocer el indice de las columnas m=UBound(B,2)

23.4 Preservar el contenido de las matrices dinmicas


Como ya se ha dicho en los prrafos anteriores cada que se ejecuta la instruccin Redim se pierden los datos. Visual Basic hace que los valores en la matriz se vuelvan empy si la matriz ha sido declarada de tipo variant, o a cero si matriz ha sido declarada con alguno de los tipos numricos como: Integer, Double, Single, Long, Currency. Lo anterior es muy til, pero existen situaciones en que se quiere cambiar el tamao de la matriz pero que conserve los datos, en esos casos puede usar la instruccin Redim con la palabra Preserve. Para utilizar dicha palabra haga lo siguiente. Ejemplo Con la siguiente instruccin se aumenta el tamao de un vector en una celda ms y se preservan los datos almacenados en ese momento. ReDim Preserve A(UBound(A)+1) Ejemplo Al querer preservar los datos de una matriz hay que tener en cuenta que solo se puede cambiar el lmite superior de la matriz multidimensional, cuando se utilice la instruccin Preserve ReDim Preserve B(3,UBound(B,2)+1) Ejemplo El siguiente ejemplo muestra un uso incorrecto de la palabra Preserve al momento de redimensionar una matriz. ReDim Preserve B(UBOUND(B,1)+3,5) Lo que muestra el ejemplo anterior es que no se puede cambiar el primer lmite o nmero de filas del arreglo multidimensional.

23.5 Ingresando datos a un Vector en VBA


Para ingresar datos a un vector en memoria se puede hacer de dos maneras: Mediante la instruccin InputBox y usando un ciclo for Tomando un rango de datos de una hoja de clculo y llevndolos a un vector o a una matriz.

23.5.1

Mediante un ciclo for

Para realizar dicho proceso basta con escribir una estructura as: For i=0 to n Step x nombreVector(i)= InputBox(prompt[, title][, default][, xpos][, ypos][, helpfile, context]) next

50

Ejemplo: El siguiente cdigo muestra como entrar datos a un vector a usando el procedimiento que se explico. For i = 0 To n - 1 dato = InputBox("Ingrese a(" & i & ")") a(i) = Val(dato) Next

23.6 Llevando la informacin de un vector a una hoja de clculo6


Una de las cosas interesantes de los array de VBA es que se pueden asignar directamente a un rango de una hoja de clculo sin tener que recorrer cada elemento del array, asignando la propiedad value del rango. Para realizar esto lo que hay que hacer es esto: Rango(x,y).value=nombreVector Hay que tener en cuenta que si el vector ha sido declarado de la forma siguiente: Dim nombreVector(n) as Tipo Al pasarla a un rango de hoja de clculo este rango debe ser un rango horizontal, no un rango vertical. Si se quiere que los datos sean pasados a rangos verticales, el vector debe ser declarado as: Dim nombreVector(n,0) as Tipo Ejemplo: El siguiente cdigo muestra como llevar los datos que estn almacenados en un vector A una hoja de clculo:

'Pasar el vector a a la hoja


Range("d13").Select Range(Selection, ActiveCell.Offset(0, n - 1)).Select Selection.Value = a

Ejemplo: Escribir un programa en VBA que le permita a un profesor calcular el producto escalar entre dos vectores de tamao n.

Tomado de Microsoft Excel 2007 pagina 411

51

El programa debe tener la siguiente interfaz:

Cuando se presione el botn Ingresar Datos el programa permitir ingresar la dimensin de los vectores, luego solicitara los datos para cada una de las posiciones del vector las almacenas en memoria y luego los lleva a la hoja de clculo. Cuando se presione el botn Borra el programa debe desplegar un mensaje confirmando si se desea o no borrar los datos, si se presiona el botn de s se borran los datos, en caso contrario no. El botono Calcular el Producto Escalar calcula el producto entre los vectores. Veamos el cdigo que hay en cada una de las subrutinas asociadas a cada botn: Public Sub leerVectores() Dim a(100) As Integer, b(100) As Integer Dim dato As String, i As Integer dato = InputBox("Ingrese la dimension del Vector") n = Val(dato); Range("E4").Value = n

'Ingresar los datos al vector en memoria


For i = 0 To n - 1 dato = InputBox("Ingrese a(" & i & ")") a(i) = Val(dato) dato = InputBox("Ingrese b(" & i & ")") b(i) = Val(dato) Next

'Pasar el vector a a la hoja


Range("d13").Select Range(Selection, ActiveCell.Offset(0, n - 1)).Select Selection.Value = a

'Pasar el vector b a la hoja


Range("d14").Select

52

Range(Selection, ActiveCell.Offset(0, n - 1)).Value = b End Sub

El botn calcular producto escalar realiza las siguientes acciones: Public Sub prodEscalar() Dim i As Integer Dim suma As Double Dim b(100) As Double, a(100) As Double 'Tomando datos de la hoja de calculo Range("d13").Select For i = 0 To n - 1 a(i) = Selection.Offset(0, i).Value Next Range("d14").Select For i = 0 To n - 1 b(i) = Selection.Offset(0, i).Value Next suma = 0 'Calcula el producto escalar For i = 0 To n - 1 suma = suma + a(i) * b(i) Next 'Escribe el producto Escalar Range("E5").Value = suma 'Cambia las caractersticas de la celda E5 Range("E5").Font.Size = 13 Range("E5").Font.Name = "Time new Roman" Range("E5").Font.Bold = True Range("E5").Font.Color = vbRed Range("E5").Interior.Color = RGB(57, 244, 11) Range("E5").HorizontalAlignment = xlCenter Range("E5").VerticalAlignment = xlCenter End Sub El botn borrar realiza las siguientes acciones Public Sub Borrar() Dim boton As Integer n = Range("E4").Value boton = MsgBox("Desea Borrar datos", vbInformation + vbYesNo)

53

If boton = vbYes Then Range("d13", Range("d13").Offset(0, n - 1)).Clear Range("d14", Range("d14").Offset(0, n - 1)).Clear Range("E5").Font.Bold = True Range("E5").Font.Color = vbBlack Range("E5").Interior.Color = vbWhite Range("E5").HorizontalAlignment = xlGeneral Range("E5").VerticalAlignment = xlGeneral Range("E5").Clear End If End Sub

23.7 Enviando datos de la hoja de calculo a un vector en el programa


As como se pueden llevar datos de un vector a la hoja de clculo, se puede trasladar datos de un rango en la hoja de clculo a un vector o matriz. Sin embargo, al trasladar datos desde un rango hasta un array, este debe ser siempre una variable de tipo variant. Para pasar un arreglo a un rango utilice la siguiente sintaxis: Para pasar un rango a un vector. nombreArray7=Range(x).value Donde Range(x) es el rango que contiene los datos de la matriz o el vector que se van a llevar a memoria.

23.8 Ingresando datos de una matriz a una hoja de clculo


Para ingresar datos de una matriz a una hoja de clculo se puede usar las siguientes instrucciones: For i = 0 To n - 1 For j = 0 To m - 1 x = InputBox("Ingrese a[" & i & "," & j & "]", "Matriz") Range(X).Offset(i, j).Value = x Range(X).Offset(i, j).Interior.Color = vbCyan Next Next Donde n es el nmero de filas, m es el nmero de columnas, X es la direccin de la celda desde donde se inicia el ingreso de la matriz.

Es un array de tipo variant

54

Ejemplo: Escriba un algoritmo que lea dos nmeros entero m y n y la computadora permite almacenar m*n elementos en una matriz A. Luego la computadora obtiene un vector B donde cada B[i] es la suma de los elementos de la fila i. Su programa debe tener la siguiente interfaz:

El siguiente es el cdigo asignado al botn ingresar m y n, este botn permite llevar a la hoja de clculo tanto m, n y la matriz. Public Sub EntrarMNMatriz() Dim i As Integer, j As Integer, x As Double m = InputBox("Ingrese el numero de filas de la matriz", "Lectura de Filas") n = InputBox("Ingrese el numero de columnas de la matriz", "Lectura de columnas") If (IsNumeric(m)) Then Range("d7").Value = m Else End End If If (IsNumeric(n)) Then Range("d8").Value = n Else End End If Aqui se da el tamao a la matriz a ReDim a(1 To m, 1 To n) Range("d8").Value = n For i = 1 To m For j = 1 To n x = InputBox("Ingrese a[" & i & "," & j & "]", "Matriz") Range("C10").Offset(i - 1, j - 1).Value = x Next Next Range("C10").Select Range(Selection, Selection.Offset(m - 1, n - 1)).Select

55

Aqui tomamos los datos de la hoja de clculo y se meten en la matriz a = Selection.Value Selection.Interior.Color = vbCyan End Sub En el cdigo anterior es importante resaltar que la matriz variant que se crea tiene filas y columnas que se numeran desde 1 hasta m y hasta n respectivamente. El siguiente cdigo muestra como calcular la suma de las filas de los elementos de la matriz. Public Sub CalcularSumaFilas() Dim i As Integer, j As Integer, suma As Double Dim x() As Double Aqui se le da el tamao al vector ReDim x(1 To m, 0) For i = 1 To m suma = 0 For j = 1 To n suma = suma + a(i, j) Next x(i, 0) = suma Next Range("C10").Offset(0, n + 1).Select Range(Selection, Selection.Offset(m - 1, 0)).Select Aqui se llevan los datos del vector a la hoja Selection.Value = x Selection.Interior.Color = vbYellow End Sub En el cdigo anterior, es importante resaltar el uso de la instruccin redim, que permite definir el tamao de la matriz x en tiempo de ejecucin. El botn borrar ejecuta el siguiente cdigo: Public Sub BorrarRango() Range("C10").Select Range(Selection, Selection.Offset(m - 1, n + 1)).Select Selection.Clear Selection.Interior.ColorIndex = xlNone End Sub

56

Você também pode gostar