You are on page 1of 65

1. Bienvenidos!

A lo largo de estas pginas intentar aportar algunos temas que puede ayudar a todo aquel que est interesado en aprender VBA Excel en sus diversos, niveles. Espero a su vez todas aquellas aportaciones que puedan aportar y enriquecer los temas tratados. Para empezar tratar de desarrollar punto por punto los pasos lgicos para realizar un programa. De forma muy resumida diremos que todo pasa por tener muy claro lo que se quiere hacer y por aplicar estrategias de resolucin y desarrollo adecuadas. INTRODUCCIN Aunque pueda parecer extrao, buena parte de los quebraderos de cabeza a los que nos enfrentamos programando derivan de no saber bien lo que queremos hacer. Esto responde al siguiente esquema:

Este sistema es posible pero muy poco recomendable ya que equivale a:

Lo cual implica, simplemente, comenzar una tarea sin la preparacin necesaria. En el ejemplo del edificio slo en situaciones de extrema sencillez (por ejemplo levantar un cuarto) el resultado ser satisfactorio. En el resto de los casos la falta de mtodo llevar a defectos o colapsos debido a la ausencia de proyecto, planos, clculos, etc. No podemos pretender desarrollar un programa simplemente en base a ideas, intuiciones, nociones. Necesitaremos mtodo y esquemas claros que raramente estarn en nuestra cabeza. Necesitarn de un trabajo de desarrollo. El buen programador, al igual que el buen proyectista en arquitectura, ha de tener claros cules son los pasos a ir dando para desarrollar una construccin slida. La precipitacin, la falta de reflexin o las prisas por terminar son malas consejeras. Cada programador tiene sus propios esquemas de trabajo, pero en lneas generales podemos distinguir las siguientes fases en el desarrollo de un programa:

CONOCER EL PROBLEMA A RESOLVER Como primer paso a la hora de desarrollar un programa tenemos que conocer el problema a resolver. Necesitaremos un conocimiento profundo de todos los aspectos relacionados con el problema, lo cual implica saber responder las siguientes preguntas: 1. 2. 3. 4. 5. Cul es mi objetivo? Cules son los condicionantes que afectan al problema? Qu mtodo o esquema de resolucin voy a aplicar? Cules son los datos de partida? Qu resultado quiero obtener?

SOBRE EL OBJETIVO
A la hora de plantear un objetivo trataremos de subdividir la extensin y complejidad del problema hasta niveles lo ms fcilmente abarcables por una persona, segn la conocida estrategia del divide y vencers. Aunque ser la experiencia la que mejor nos gue a la hora de plantear objetivos podemos usar esta regla: Slo trataremos de programar aquello que mentalmente somos capaces de abarcar en mtodo, extensin y condicionantes. Ejemplo: Supongamos que trabajamos en el sector de logstica y almacenamiento de combustibles y venimos haciendo diversos clculos manuales relativos a determinacin de volmenes de depsitos. Por cambios productivos se empiezan a instalar depsitos de formas geomtricas muy diversas y decidimos programar para obtener volmenes. Posibles planteamientos de objetivos: a) Desarrollar un programa para el clculo de volmenes para cualquier forma de depsito contenedor de un lquido. Comentarios: incumplimos la premisa de plantear algo que mentalmente seamos capaces de abarcar. Lo planteado posiblemente se puede programar, pero al nivel en que nos encontramos (somos programadores individuales y no expertos) el objetivo resultara inalcanzable. Entre otras cosas por la gran cantidad de formas regulares (esferas, elipsoides, pirmides, conos, cuas, paraboloides, hiperparaboloides, etc.) que en el caso de las irregulares o combinaciones entre irregulares se tornan en infinitas posibilidades. Los datos de partida y los mtodos resultaran de extensin y complejidad inabarcable. Condicionantes Llamamos condicionantes a todos los factores que afectan a la resolucin del problema. Despus de tener un objetivo centrado y enfocado tendremos que valorar qu condicionantes nos afectan y si tenemos un conocimiento suficiente de ellos. Mtodos Una vez determinado el objetivo y conocidos los condicionantes, valorar el mtodo o esquema de resolucin para el problema planteado ser el siguiente paso en el proceso de conocer el problema. Ser una etapa ms a cumplir antes de empezar a trabajar en su programacin. Cualquier mtodo debe incluir unos datos de partida y va enfocado a obtener un resultado cierto y esperado

2. VBA Introduccin
7 JULIO, 2011 DEJA UN COMENTARIO

Vba o Visual basic for Applications es un editor de progrmacin en Visual Basic incorporado a los productos Office de Microsoft. Se trata de una herramienta que nos va a permitir potenciar y optimizar nuestra labor con Excel (para el caso que nos ocupa). VBA&Excel se encuentra en los escritorios de de 400 millones de usuarios de Office, siendo curioso que slo alrededor de un 10 % utiliza o ha utilizado alguna vez dicha herramienta. Una manera directa, aunque con errores de ver y aprender, qu se esconde detrs de toda automatizacin de excel, es decir cuando trabajamos con la grabadora de macros es abrir el editor de VBA y leer el cdigo anexo.Bien o tiene errores o sobra cdigo. Empenzando con una visin de conjunto: la barra de herramientas Acceso: en Excel selecciona Ver>Barra de herramientas>Visual Basic

La barra de herramientas proporciana acciones para ejecutar macros, grabar macros, abrir el editor, mostrar el cuadro de controles y activar el modo diseo. El editor de secuencias de comando de Microsoft, nos abre el editor para crear secuencias de sitios web. Mtodo alternativo: Herramientas>Macro accederemos prcticamente a los mismos controles. Si deseamos acceder directamente al editor Alt+F11

El editor de Visual Basic


Para acceder al editor utilice Alt+F11. En principio podr ver tres ventanas:

El explorador de proyectos. La ventana de Propiedades. La ventana de Programacin.

Se puede modificar las opciones mediante Herramientas>Opciones>Editor. Todos excepto uno estn establecidos por correctamente por defecto. En VBA no es necesario declarar las variables aunque s que es recomendable. Por ello sera conveniente tener activada la casilla Requerir declaracin de variables.

En la ventana del explorador de proyectos podemos observar todos los proyectos que en ese momento tenemos abiertos. A su vez tambin se despliega una carpeta de mdulos, donde se instertan tanto las macros que hemos grabado, como aquellos procedimientos que hayamos creado. La ventana de propiedades nos muestra para cada uno de los objetos que marcamos sus propiedades principales. Para poder entender mejor la utilidad de cada una de esas ventanas, previamente es necesario comprender el concepto de VBA como lenguaje de programacin orientado a objetos.

Cmo crear un botn de macro


Una vez creada una macro tenemos inicialmente dos formas de ejecutarlas. Si hemos asignado un atajo de teclado, directamente pulsando la combinacin de teclas que hayamos elegido. O bien pulsando Alt+F8 ( o en su defecto Herramientas>Macro>Macros) . Bien otra posibilidad ms directa sera crear un botn de macro. Para ello: 1. 2. 3. 4. 5. 6. 1. 2. 3. Hacer clic con el botn derecho del ratn en la barra de herramientas y seleccionar Personalizar. Selecciona la pestaa Comandos. En Categoras, seleccionamos Macros. Seleccionar la carita sonriente amarilla Personalizar botn. Con Asignar macro seleccionamos nuestra macro y clic en Aceptar. Cerramos el cuadro Personalizar. Hacer clic botn derecho sobre el dibujo. Puede escoger otra imgen estndar con Cambiar imgen del botn. Alternativamente seleccione Modificar imgen del botn.

Tambin podemos personalizar la imagen mediante el pequeo editor de dibujo que incorpora Excel. Para ello:

3. VBA lenguaje orientado a objetos


El punto de partida de este modelo se fundamenta en la idea de que el entorno est formado por objetos. En este entorno, que en nuestro caso, sera el conjunto de aplicaciones de Office, podemos encontrar: Objeto. Entidad significativa existente en el entorno. En general, el entorno se concibe como el conjunto de Clase. Conjunto de objetos distintos del mismo tipo. Estado. Caractersticas o propiedades de un objeto en un momento dado. Comportamiento. Operaciones realizables por el objeto. relaciones entre los distintos objetos; adems, cada objeto puede estar compuesto de otros objetos (subobjetos).

Pensar en objetos es ms prximo a lo que hacemos en la vida real. Por ejemplo pensemos en un coche: el coche sera el objeto, las propiedades seran las caractersticas como el color o el modelo y los mtodos seran las funcionalidades asociadas como ponerse en marcha o parar. Las clases son declaraciones de objetos, tambin se podran definir como abstracciones de objetos. Esto quiere decir que la definicin de un objeto es la clase. Cuando programamos un objeto y definimos sus caractersticas y funcionalidades en realidad lo que estamos haciendo es programar una clase. En los ejemplos anteriores en realidad hablbamos de las clases coche o fraccin porque slo estuvimos definiendo, aunque por encima, sus formas. Las propiedades o atributos son las caractersticas de los objetos. Cuando definimos una propiedad normalmente especificamos su nombre y su tipo. Nos podemos hacer a la idea de que las propiedades son algo as como variables donde almacenamos datos relacionados con los objetos. Son las funcionalidades asociadas a los objetos. Cuando estamos programando las clases las llamamos mtodos. Los mtodos son como funciones que estn asociadas a un objeto.

Fundamentos del lenguaje VBA


Empecemos escribiendo nuestra primera macro. Abra el editor y desde la barra de mens vaya a Insertar>Mdulo. En la ventana de cdigo escriba lo siguiente: Sub hola_mundo() MsgBox (Hola Mundo) End Sub Para ejecutar la macro clic en el tringulo verde ejecutar. Como ver en Excel se presentar una ventana con el saludo estndar. Ya tenemos nuestra primera macro. Como puede observar el mdulo comienza con Sub (subprocedimiento) y termina con End Sub (fin de procedimiento). Si previamente y como se recomend hemos activado la casilla requerir declaracin de variables , nos aparecer al comienzo la leyenda Option explicit. Mdulos Como habr podido observar en el pequeo programa anterior, lo primero que hemos hecho es insertar un mdulo. Automticamente intellsense ha insertado las expresiones Sub y End Sub. Para comenzar Intellsense es la aplicacin de autocompletar que introduce Microsoft en su paquete de Visual Basic for Applcations, y en Visual Studio en general. Y qu es un mdulo? pues un archivo de cdigo que incluye una serie de funciones o procedimientos que realizan tareas similares o relacionadas lgicamente entre s. Cuando utilizamos un mdulo podemos definir tipos de datos abstractos, o sea, un tipo de datos declarado conjuntamente con una serie de operaciones que manipulan dicho tipo de datos. Para modularizar una aplicacin se puede usar un esquema de diseo arriba-abajo que, empezando por lo ms general, permita descender hasta lo ms particular. Este proceso se llama especializacin. Mediante este proceso se obtiene una jerarqua que muestra la relacin existente entre mdulos comunes.

La divisin de una aplicacin en una serie de mdulos independientes presenta varias ventajas:

Permiten encapsular partes del sistema mediante interfaces bien definidas. Facilita el desarrollo, ya que cada mdulo incluye una serie de tareas lgicamente relacionadas que pueden ser desarrolladas por distintos equipos de programadores. Cada uno de los mdulos puede compilarse y probarse por separado, lo que permite un cdigo ms fiable. Un mismo mdulo puede utilizarse en varias partes de un mismo programa, adems un mdulo se puede utilizar en programas distintos que requieran funcionalidad similar.

Veamos un ejemplo de cmo emplear el diseo descendente para resolver un problema. Supongamos que un profesor quiere crear un programa para gestionar las notas de sus alumnos. Quiere que dicho programa le permita realizar tareas tales como asignar notas, cambiar notas, ver las notas segn distintas calificaciones, etc.

Lista de propiedades y mtodos


Las propiedades definen la apariencia y el comportamiento de un objeto y los mtodos nos dicen qu podemos hacer con el objeto. Intellisense le mostrar una lista de las propiedades y metodos disponibles. Cuando inserte un mdulo en el editor. pruebe a escribir la palabra application seguido por un punto. Ver como se muestra un men emrgente, con las propiedades y mtodos disponibles para ese objeto. Cuando vea una especie de borrador verde se hace referencia a un evento, y las propiedades van acompaadas con un icono representando una mano con una tarjeta. Para acceder directamente a la lista de propiedades y mtodos selecione Edicin>Lista de propiedades y mtodos en su defecto pulse Ctrl-J. De manera similar Intellisense posee la funcionalidad de la Lista de constantes de manera similar a la de propiedades. Esta lista de constantes predefinidas surgen como un men emergente en el momento que accedemos a la propiedad de un objeto. Por ejemplo, si desea acceder a los diferentes estados de la ventana activa de Excel inserte un mdulo y esxcriba lo siguiente: Application.ActiveWindow.WindowState=[Aqu surge el men emergente de los tres estados posibles de la ventana activa]

Parmetros
Anteriormente hemos visto que una funcin definida por el usuario normalmente recibe uno o ms argumentos (o parmetros) para emplearlos en sus clculos internos. Para entenderlo mejor los parmetros se usan para mandar valores a las funciones. Una funcin trabajar con los parmetros para realizar las acciones. Por decirlo de otra manera, los parmetros son los valores de entrada que recibe una funcin. Por ejemplo una funcin resta necesitar como argumentos o parmetros dos nmeros y devolver como resultado el nmero diferencia. Una funcin y/o sentencia en VBA puede utilizar muchos parmetros lo que puede dar lugar a cometer errores. Si estamos escribiendo una de las funciones de VBA, IntelliSense nos ofrecer su ayuda mostrando los parmetros que soporta la funcin que estamos insertando.

El parmetro actual se presenta en negrita, una vez que pulsamos la coma se nos presentar el siguiente argumento en negrita. Los parmetros opcionales estrarn entre corchetes. Las diferentes sentencias que se nos presentan como As nos informa del tipo de dato de cada argumento. Para hacer desaparecer la ventana pulse escape.

El parmetro actual se presenta en negrita, una vez que pulsamos la coma se nos presentar el siguiente argumento en negrita. Los parmetros opcionales estrarn entre corchetes. Las diferentes sentencias que se nos presentan como As nos informa del tipo de dato de cada argumento. Para hacer desaparecer la ventana pulse escape.

Parmetros por valor y por referencia


Hay dos maneras de pasar parmetros a una funcin, por valor o por referencia. Para explicar esto y que se comprenda en profundidad, repasaremos conceptos de hardware Cuando se declara una variable, el sistema operativo reserva un espacio de memoria en la memoria RAM. Cuando pasamos una variable a una funcin por valor, el sistema operativo reserva otro espacio de memoria distinto, de modo que los cambios que sufra la variable en la funcin no afectarn a la variable de fuera de la funcin, aunque tengan el mismo nombre, ya que son variables distintas con espacios de memoria distintos. Por el contrario, cuando pasamos una variable a una funcin por referencia, realmente no estamos pasando el valor de la variable, sino la posicin del espacio de memoria de esa variable (a esto se le llama puntero). De acuerdo a esto, los cambios que sufra la variable dentro de la funcin afectarn a la variable fuera de la funcin, aunque tengan distintos nombres, ya que es la misma variable. A todo esto se le denomina mbito de las Variables.

En VBA los parmetros pasan por defecto por referencia, si deseamos que pasen por valor hay que indicarlo en la cabecera de la funcin o procedimiento. Paso por valor Public Sub pp (ByVal v as Integer) End Sub Paso por referencia Public Sub pp (ByRef v as Integer) End Sub o tambin Public Sub pp (v as Integer) End Sub

Mdulos, procedimientos, subrutinas y mdulos de clases


28 JULIO, 2011 DEJA UN COMENTARIO

Algo que normalmente me suelen preguntar mis alumnos es la diferencia entre mdulos y procedimientos en VBA. Un mdulo se utiliza para recopilar bajo un nombre un conjunto de declaraciones, instrucciones y/o procedimientos. Aplicado al ejemplo de nuestra primera macro Hola Mundo, el mdulo lo podamos titular Sub saludo() Sub de subrutina, el nombre de nuestro mdulo Dim saludo As String declaracin de nuestra variable saludo = MsgBox(Hola Mundo, vbCritical, Mi saludo) instruccin End Sub Ahora qu es un mdulo de clase? Es una plantilla con la que crear objetos. Definir todas las caractersticas que quisiramos que nuestro objeto final tuviera. Por ejemplo: podemos tener una clase llamada clsEmpleados en el cual deseamos tener todas las caractersticas con respecto a un empleado. Como propiedades podriamos definir: nombre, apellidos, domicilio, edad, casado, sueldo, fechaIngreso, Antiguedad, etc. Como mtodos podriamos tener: ActualizarDatos o GuardarCambios (donde cambios a las propiedades anteriores se grabaran fsicamente en una base de datos), ValidarDatos (donde se valida los datos siempre y cuando haya habido cambios en las propiedades segn una variable privada Cambios) Un mdulo de clase:

Es parecido a los tipos definidos por el usuario UDT. Cada mdulo define un tipo de objeto. En ejecucin creas una instancia (o objeto) de la clase. No tiene interfaz de usuario.

Los mdulos de clase no presentan una interfaz grfica al desarrollados tal y como lo hacen las formas o formularios. En los formularios puedes colocar visualmente un botn, una lista, un texto, etc. Los mdulos de clase solo contiene cdigo que definen las caractersticas del objeto. Si se desea presentar una ventana informativa (como un Acerca de) u otro formulario, este puede pertenecer a un proyecto ActiveX DLL y mandarlo llamar mediante un mtodo (como MostraAcercaDe) que expone alguna clase dentro del proyecto.
Se pueden crear mltiples instancias en ejecucin.

De acuerdo a la configuracin de las propiedades de la clase se pueden crear varias instancias u objetos de una misma clase. Esto es, la propiedad Instancing de un mdulo de clase indica como se trataran los objetos creados utilizando un mdulo de clase determinado. Tenemos la opcin de que sea una clase Privada lo cual significa que no se puede instanciar directamente por otro programa, solo el proyecto ActiveX DLL o ActiveX Exe que lo contiene una copia u objeto de este tipo de clase.

Proporciona mtodos y propiedades.

Eventos de un mdulo de clase: Initialize y Terminate


Los mdulos de clase presenta dos eventos:

Initialize: ocurre cuando se crea una instancia de una clase. Se usa, generalmente para inicializar cualquier dato usado por la instancia de una clase en el cdigo. Terminate: ocurre cuando toda referencia a una instancia de una clase son removidas de memoria al establecer todas las variables que la refieren a un objeto a Nothing o cuando la ultima referencia al el objeto se encuentra fuera de alcance. Usado generalmente para limpiar la memoria de objetos creados dentro de esta instancia y generar un error si hay alguna anomala o guardar alguna informacin del objeto, etc.

Diferencias con los mdulos estndar

Deben ser creadas explcitamente (crear instancia) antes de usarlas. No se puede utilizar el metodo o la propiedad de una clase si no se tiene una instancia de la misma o una referencia al componente que la contiene si la clase esta configurada como Instancing = PublicNoCreatable.

1. 2. 3.

Puedes crear mltiples instancias de la clase. Con este cdigo crearemos un nuevo libro: Private Sub MiAplicacion_NuevoLibro(ByVal wb As Workbook) Dim numhojas, numactual, diferencia As Integer por cada nuevo libro solicitamos al usuario el nmero de hojas caso necesario se agregan o eliminan hojas Do numhojas = Application.InputBox(Cuntas hojas va a necesitar?, Type:=1) Loop While numhojas = False numactual = Sheets.Count diferencia = numactual numhojas eliminamos las hojas de sobra y desactivamos alertas Do While diferencia > 0 Application.DisplayAlerts = False Sheets.Item(diferencia).Select ActiveWindow.SelectedSheets.Delete diferencia = diferencia 1 Loop Application.EnableEvents = True Application.DisplayAlerts = True End Sub Por ltimo vamos a conectar el mdulo de clase con el objeto Aplicacin: Option Explicit Dim app As New ObjAplicacion Sub Inicializa_MiAplicacion() Set app.MiAplicacion = Application End Sub Inicie VBA y vaya a Men>Insertar>Mdulo de clase. Dele un nombre por ejemplo ObAplicacion Inserte el siguiente cdigo con el que crearemos un objeto Aplicacion:

Veamos un ejemplo:

Public WithEvents MiAplicacion as Application Si pulsa ahora F2 y despliega la lista de objetos encontrar el objeto recin creado. A continuacin crearemos dos procedimientos para nuestro objeto recin creado. El primero se encargar de insertar una nueva hoja en el libro: Private Sub MiAplicacion_NuevaHoja(ByVal wb As Workbook, ByVal sh As Object) Dim nombrehoja As String nombrehoja = InputBox(Introduzca un nombre para la hoja) ActiveSheet.Name = nombrehoja ActiveSheet.Move After:=Sheets(Sheets.Count) End Sub

Mdulos, propiedades y eventos


28 JULIO, 2011 DEJA UN COMENTARIO

El cdigo que escriba en un proyecto de Visual Basic aparecer siempre en un mdulo. Un mdulo es un archivo de proyecto, pudiendo ser un mdulo de formulario, de clase o de carcter general como vimos en el captulo anterior. En cada mdulo, el cdigo se divide en dos secciones: declaraciones y procedimientos. Los procedimientos son unidades de cdigo como pequeos programas, escritos para realizar funciones determinadas, con un propsito bien definido. En cualquier mdulo, el programador dispone de una seccin especial llamada general en las que se sitan las declaraciones y en la que se puede incluir otros procedimientos creados por el programador En el apartado declaraciones se puede introducir las constantes, variables y tipos de datos que necesite en su aplicacin. (Todos estos conceptos sern tratados a lo largo del curso). Los procedimientos pueden tener parmetros, especificados entre partentesis que le permiten comunicar al procedimiento alguna informacin que necesite o que sea el propio procedimiento quien devuelva algn valor. En un mdulo de formulario el cdigo que se sita se refiere tanto a dicho formulario como al resto de objetos que estn dibujados en l. En este tipo de mdulos cabe destacar los procedimientos de evento que se encargan de dar una respuesta programada a los eventos que ocurren en la aplicacin. Si has escrito cdigo para algn procedimiento de evento, ste aparece en negrita en la lista de procedimiento de la ventana de cdigo. El cdigo de carcter general o que puede compartir en ms de un proyecto, se sita en un mdulo general. El cdigo que aparece en este tipo de mdulos no se relaciona con un objeto determinado, sino que tiene carcter general. En los mdulos generales no se pueden incluir procedimientos de evento como en el caso de los mdulos de formulario. Es conveniente aadir comentarios a las lneas de cdigo que escribas, de esta forma podrs entender los programas aunque haga tiempo que los escribiste. Para aadir un comentario en una lnea se utiliz a el carcter (apstrofe). Objetos en Visual Basic Un objeto en Visual Basic se caracteriza por tres componentes: propiedades, mtodos y eventos. Las propiedades son aquellas caractersticas o atributos que permiten establecer el htmlecto de un objeto como el color, tamao, posicin, etc O el estado del mismo: activo, maximizado, etc Existen propiedades que slo estn disponibles en tiempo de diseo y otras que slo estn disponibles en tiempo de ejecucin. Los mtodos son pequeos programas que actan sobre un determinado objeto y que establecen su comportamiento. As un objeto puede moverse, ocultarse, etc Puedes utilizar cualquier mtodo que forme parte del objeto. Los eventos son las situaciones que se producen y que nos interesan identificar para establecer algn tipo de de respuesta por parte del objeto. As, puedes hacer click sobre un determinado objeto, creando de esta forma un evento reconocible por el objeto. Que suceda algo o no como respuesta a este evento depender de que hayas programado alguna accin en el correspondiente procedimiento de evento. Establecer propiedades Cuando insertas objetos en un formulario tienes que establecer algunas propiedades que presenta. Las propiedades son aquellas caractersticas propias del objeto que hacen que se distingan de otro objeto. En una aplicacin Windows podemos distinguir diversos tipos de ventanas, aunque lo normal es identificar una ventana inicial que se puede maximizar o minimizar y uno o ms cuadros de dilogo cuyo tamao suele ser fijo. Sin embargo, debes darte cuenta que las barras de herramientas tambin son ventanas de una aplicacin. . Normalmente la ventana inicial o de arranque ser la que presente el men principal, formado por mens desplegables en uno o ms de un nivel. El resto de ventanas no deberan contener mens desplegables, aunque puede darse el caso.

Algunas propiedades de los formularios que se pueden establecer en tiempo de diseo son:

BorderSytle: Establece el estilo del borde del formulario. Caption: Establece el texto que aparece en la barra de ttulo del formulario. ControlBox: Permite mostrar o no el men de control de las ventanas de Windows. Enabled: Establece si el formulario puede responder o no a los eventos que generes. Font: Establece las caractersticas de los objetos de texto que se siten en el formulario. Icon: Cambia el icono que representa el formulario. Left, Top, Height, Width: Establecen la posicin del formulario en la pantalla as como las dimensiones. MaxButton y MinButton: Establece si se podr maximizar o minimizar el formulario. MousePointer: Modificar el puntero del ratn. Visible: Establece si el formulario se mostrar visible en tiempo de ejecucin. WindowState: Establece el modo en que se carga inicialmente el formulario, normal, maximizado o minimizado.

Todas esta propiedas estn disponibles en tiempo de diseo travs de la ventana de propiedades. En tiempo de ejecucin se puede cambiar o consultar el valor de algunas propiedades que slo tienen sentido en el tiempo de desarrollo.

Una vez se ha establecido la parte estructural del formulario, se pasa a programar el comportamiento que debe seguir, de forma que cumpla con el objetivo para el que desees crearlo, utilizando los mtodos. Un mtodo es un componente ms de del objeto, que puede ser utilizado directamente. Para ello debes llamar al mtodo e indicarle sobre qu objeto deseas aplicarlo, que deber admitirlo. La sintaxis en este caso debe ser: NombreObjeto.NombreMetodo[par1,...,parn], donde la lista de parmetros [par1...,parn] es opcional de cada mtodo. Un ejemplo es: Si quieres mostrar un formulario llamado frmPrimero la sintaxis ser:

frmPrimero.Show 1
El valor 1 nos indica que aparecer de forma modal y si el valor es 0 aparecer de forma no modal. Entender los eventos El conjunto de eventos est predefinido en Visual Basic por lo cual no puedes crear nuevos eventos para los objetos. El conjunto de evento reconocibles por un objeto est ligado con los procedimientos de evento. Estos procedimientos son unidades de cdigo que le permiten especificar la respuesta que debe dar un objeto ante la ocurrencia de un evento que puede reconocer. La definicin del procedimiento de evento tiene la siguiente forma:

Private Sub NombreObjeto_NombreEvento([Lista de parametros]) ...instrucciones... End Sub

Convencin para nombrar objetos en Visual Basic

OBJETO Form CheckBox ComboBox Data-bound combobox Command Button Data Directory list box Drive List Box File List Box Frame Grid Data-bound grid Horizontal scrollbar Image Label Line OLE Container PictureBox Shape Text Box Timer Vertical scroll bar

OBJETO ESPAOL Formulario Casilla de verificacin Cuadro combinado Cuadro combinado enlazado a datos Botn de comando Control de datos Cuadro lista de directorios Cuadro lista de unidades Cuadro lista de archivos Marco Rejilla Rejilla enlazada a datos Barra de desplazamiento horizontal Imagen Etiqueta Linea Contenedor OLE Cuadro de imagen Forma Cuadro de texto Temporizador Barra de desplazamiento vertical

PREFIJO frm chk cbo dbc cmd dat dir drv fil frm grd dbg hsb img lbl lin ole pic shp txt tmr vsb

Ya mencion en otro post que podemos utilizar cualquier nombre para definir nuestras variables o mdulos, con la nica excepcin de no utilizar aquellas que son propias de la sintxis de VBA.

4. Los datos en VBA (variables y constantes)


Es corriente que en programacin precisemos trabajar con datos que necesitamos guardar en memoria, para poder emplearlos despus en nuestros mdulos o subrutinas. Estos datos pueden variar de una ocasin a otra, imaginemos el ejemplo de la funcin suma en la que precisamos guardar en dos variables los nmeros con los que deseamos operar. Para ello por lo tanto precisamos de las variables. Su empleo debe seguir unas reglas determinadas:

La denominacin de nuestra variable debe empezar con una letra y no con un nmero. No debe de tener ms de 250 caracteres. No puede emplearse las palabras reservadas para la sintxis de la propia Excel. Por ejmplo no podemos llamar a una variable con el nombre de WorkSheet etc. Debe de consistir en una cadena continua de caracteres. Por ejemplo no puedo emplear como nombre mi variable pero s mi_variable.

En VBA existen los siguientes tipos de variables, dependiendo del uso que vayamos darles:

Para establecer la declaracin de una variable antes de ser utilizada en el cdigo, se puede hacer en la ficha entorno del cuadro de dilogo opciones. Al activar la casilla Declaracin de las variables requerida, Visual Basic introduce la instruccin Option Explicit en la seccin de declaraciones de cada mdulo nuevo que se cree, no de los ya existentes donde hay que introducirlos manualmente. Esta instruccin obliga a declarar las variables antes de utilizarlas, lo que es muy recomendable. La forma de declara una variable es a travs de la instruccin Dim. En la lnea se declara la variable de nombre Variable y al mismo tiempo Visual Basic guarda espacio en memoria para poder utilizarla.

Veamos un ejemplo del uso de variables. Usaremos para el siguiente ejemplo un InputBox y un MsgBox , la primera son esas cajas de texto que nos permite introducir la informacin requerida por teclado. Ms adelante veremos con ms detalle su uso, por el momento analice el empleo de la misma en nuestro ejemplo: Sub ejemplo() Dim strNombre As String strNombre = InputBox(Cmo te llamas?, Saludos) MsgBox (Hola & strNombre) End Sub A continuacin insertaremos el siguiente mdulo, para analizar el uso correcto de variables: Sub ejemplo2() Dim numero1, numero2, producto As Integer Dim respuesta As String numero1 = InputBox(Introduzca el primer nmero, PRODUCTO) numero2 = InputBox(Introduzca el segundo nmero, PRODUCTO) producto = numero1 * numero2 respuesta = MsgBox(numero1 & X & numero2 & = & producto) End Sub Si introduce cualquier nmero entero le dar un resultado correcto, pero pruebe a introducir una letra, un nmero decimal o deje sin introducir un nmero. Observar que arroja un error. Esto es as porque hemos declarado variables de tipo entero, por tanto la variable resultado no espera que se introduzca letras o campos vacos. Analizaremos ms adelante como depurar el cdigo para que slo se introduzca nmeros o no se dejase la caja de texto vaca. Las constantes almacenan valores que, como su nombre indica, permanecen constantes durante la ejecucin de una aplicacin. La instruccin Const se utiliza para declarar una constante y establecer su valor. Al declarar una constante, puede asignar un nombre significativo a un valor. Una vez que se declara una constante, no se puede modificar ni se le puede asignar un nuevo valor.

Creando tipos definidos por el usuario


Con los tipos de variables ya comentados tenemos cubierto un amplio espectro suficiente para la mayora de situaciones que se pueden presentar. No obstante podemos establecer tipos de datos definidos por nosotros mismos. Esto nos facilita trabajar con elementos que estn relacionados en una misma estructura. Supongamos que nuestro programa trabaja con una cartera de valores. En este caso puede que nos interese trabajar con tipo de valor (acciones, bonos, obligaciones,),empresa emisora, ao de emisin o compra y valor de mercado. En ese caso definiramos los tipos de la siguiente forma: Dim tipovalor as Sring Dim empresaemisora as String Dim ao as Date Dim valormercado as Integer El problema se plateara si quisiramos trabajar con datos de varias empresas a la vez. Podramos definir varias variables para cada una de las empresas. Pero esto sera muy tedioso con lo que se hace mejor definir un tipo de datos Valorempresa que guarde toda la informacin que precisemos. Para ello escribiramos el cdigo que sigue a continuacin: Type Valorempresa tipovalor As String empresaemisora as String ao as Date valormercado as Integer End Type A partir de aqu podemos utilizar este tipo de datos como cualquier otro. Por ejemplo: Dim mivalor as Valorempresa mivalor.Valorempresa=Telefonica mivalor.tipovalor=Acciones mivalor.empresaemisora=Telefonica mivalor.ao=2010 mivalor.valormercado=8.75

mbito de las variables


El mbito de una variable es el contexto dentro del que la variable est definida. Esto implica los sitios en donde dicha variable puede ser empleada y por tanto reconocida. Las variables globales o pblicas se pueden acceder en cualquier lugar de la pgina, mientras que las variables locales o privadas slo tienen validez dentro de la funcin donde han sido creadas. De modo que una variable global la podemos acceder dentro de cualquier parte del cdigo, mientras que si intentamos acceder a una variable local fuera de la funcin donde fue creada, nos encontraremos con que esa variable no tiene contenido alguno. Para entenderlo mejor vamos a realizar el siguiente ejemplo. Abra el editor e inserte el siguiente mdulo: Sub ejemplo3() variable local Dim pregunta As String pregunta = InputBox(Usuario?) Cells(1, 1) = pregunta End Sub El ejercicio nos pregunta que insertemos un nombre de usuario, que posteriormente se inserta en la celda A1. Hemos declarado la variable de forma local a nivel de mdulo o procedimiento. Si a continuacin insertramos otro mdulo exactamente igual pero sin la definicin de la variable nos dara lugar a un error: Sub ejemplo4() pregunta = InputBox(Usuario?) Cells(1, 1) = pregunta End Sub Por lo tanto para remediar esto y poder hacer uso de la variable que hemos definido a lo largo de todos los procedimientos del presente proyecto hemos de definir la variable con la palabra Public inmediatamente debajo de la frase Option Explicit: Option Explicit Public pregunta As String Hgalo y ejecute el cdigo anterior, ver que desaparece el error y funciona correctamente.

5. OPERADORES
Tienen una finalidad bsica en cualquier lenguaje de programacin y ms an en VBA. Nos van a permitir realizar operaciones aritmticas, lgicas, de concatenacin y de comparacin. Haz clic para ver la presentacin.

operadores.pps

6. FUNCIONES (funciones de comprobacin)


Podemos utilizar innumerables funciones dentro de VBA. Tambin se pueden usar las propias de Excel, llamndolas desde un procedimiento o funcin. Por ltimo podemos crear nuestras propias funciones. Una posible agrupacin sera la siguiente:

Funciones de comprobacin. Funciones de cadenas. Funciones matemticas. Funciones de conversin de tipos. Funciones MsgBox e InputBox. Definidas por el usuario.

Funciones de comprobacin
Las funciones tienen la particularidad de que nos devuelven un valor. Las funciones de comprobacin, que son las primeras que voy a abordar son muy tiles al permitirnos validad o comprobar los tipos de datos, bien los insertados en una celda o los introducidos por teclado. Lista de Funciones de Comprobacin: IsNumeric(Expresin). Comprueba si expresin tiene un valor que se puede interpretar como numrico. IsDate(Expresin). Comprueba si expresin tiene un valor que se puede interpretar como tipo fecha. IsEmpty(Expresin). Comprueba que expresin tenga algn valor, que se haya inicializado. IsError(Expresin). Comprueba si expresin devuelve algn valor de error. IsArray(Expresin). Comprueba si expresin (una variable) es un array o no. IsObject(Expresin). Comprueba si expresin (una variable) representa una variable tipo objeto. IsNull(Expresin). Comprueba si expresin contiene un valor nulo debido a datos no vlidos. IsEmpty(Expresion). Nos comprueba si una celda o rango est vaco, no hay datos. El argumento expresin requerido es un tipo de datos Variant que contiene una expresin de cadena o una expresin numrica. Sin embargo, ya que la funcin IsEmpty se utiliza para determinar si las variables individuales estn inicializadas, el argumento expresin es generalmente un nico nombre de variable.

Ejemplo: Comprobamos si en la celda B1 de la hoja activa hay datos: Sub ejemplo() Dim mensaje As String If IsEmpty(ActiveSheet.Range(B1)) Then MsgBox Prompt:=la casilla B1 est vaca, Title:=ERROR Else mensaje = ActiveSheet.Range(B1) MsgBox En la casila B1 hay este dato : & mensaje End If End Sub Es complicado utilizar IsEmpty con datos recogidos por teclado mediante la funcin InputBox. Y ello es as porque esta funcin devuelve datos de tipo variant o sea cualquier expresin que se pueda evaluar a datos numricos, de cadena o de fecha. Para entenderlo mejor modifique el cdigo anterior por este otro: Sub ejemplo2() Dim mensaje mensaje = InputBox(Usuario) If IsEmpty(mensaje) Then MsgBox Prompt:=usuario?, Title:=ERROR Else MsgBox Hola & mensaje End If End Sub Como vemos, la funcin IsEmpty no evala la cadena vaca, ya que InputBox en ese caso devolvera un cero. Funcin IsNumeric/Funcin IsDate Nos comprueba si una expresin se evala como un nmero, para IsNumeric o fecha para IsDate Por ejemplo evaluamos si en la celda activa hay valores numricos: Sub comprueba() If Not IsNumeric(ActiveCell.Value) Then MsgBox Error Else MsgBox Los valores son numricos End If End Sub

Funcin IsObject La funcin IsObject es til solamente para determinar si un tipo de datos Variant es de VarType vbObject. Ejemplo: Sub Obj() Dim R As Range Si la variable R es Nothing es que no ha sido asignada, no se puede trabajar con ella If R Is Nothing Then MsgBox Prompt:=La variable Objeto no ha sido asignada, Buttons:=vbOK, _ Title:=Error Else R.Value = Hola End If End Sub Aqu un ejemplo resumen: Sub comprueba() Dim cadena As Variant cadena = ActiveCell.Value If IsEmpty(cadena) Then MsgBox La celda no contiene datos ElseIf IsNumeric(cadena) Then MsgBox La celda contiene datos numricos ElseIf IsDate(cadena) Then MsgBox La celda contiene datos tipo fecha ElseIf Not IsArray(cadena) Then MsgBox La celda no es un array Else MsgBox No hay nada para evaluar End If End Sub

Funciones matemticas de VBA


VBA cuenta con funciones matemticas propias que podemos utilizar en nuestros procedimientos: Abs(nmero)>Valor absoluto Atn(nmero)>Arcotangente de un nmero Cos(nmero)>Coseno Exp(nmero)>nmero e como base de los logaritmos naturales Fix(nmero)>La pasrte entera de un nmero decimal* Hex(nmero)>El valor hexadecimal de un nmero Int(nmero)>Parte entera del nmero* Oct(nmero)>El valor octal de un nmero Rnd(nmero)>Nmero aleatorio ente 0 y 1. Sgn(nmero)>El signo del nmero Sqr(nmero)>Raiz cuadrada Sin(nmero)>Seno Tan(nmero)>Tangente

(*) La funcin Fix(n) nos devuelve la porcin entera del nmero. Si este es negativo, Fix devuelve el primer entero negativo que es mayor que ese nmero. La funcin Int(n) nos devuelve el primer entero negativo que es menor o igual que el nmero. La funcin Rnd(nmero) genera un nmero aleatorio entre 0 y 1 con las opciones siguientes: si nmero <0 Repite el mismo nmero cada vez si nmero=0 El nmero generado ms reciente si nmero>0 El siguiente nmero aleatorio en la secuencia. Le inserto aqu un cdigo para que compruebe los resultados. Sub prueba() Dim i As Byte Dim j As Integer principio: j = Int(Val(InputBox(Escoja un nmero positivo , Funcin Random))) If j < 0 Then MsgBox Error debe escoger un nmero positivo GoTo principio Exit Sub Else For i = 1 To 15 Cells(i, 1) = Rnd(-j) Cells(i, 2) = Rnd(0) Cells(i, 3) = Rnd(j) Next End If End Sub La necesidad de trabajar con nmeros aleatorios surge muy a menudo. A veces necesitamos trabajar con un abanico ms amplio que de 0 a9. Aqu le expongo la frmula que ha de emplear en tal caso: Int((superior-inferior)*Rnd + inferior Ejemplo nmero aleatorio entre 25 y 100 Sub prueba2() Cells(1, 1) = Int((100 25) * Rnd + 25) End Sub

Funciones de cadenas
Una expresin de cadena devuelve un valor de datos de tipo String. A continuacin veremos la mayora de las funciones que trabajan con cadenas, previamente aqu tenemos un cuadro de las funciones de cadenas en Excel. Asc(string) = Cdigo de carcter ANSI correspondiente a la primera letra de la cadena. Chr(cdigo char)= Carcter que corresponde al cdigo ASCII CStr(expresin)= Convierte una expresin a String. Format(expresin,formato)= La expresin en el formato especificado Ejemplos: Sub prueba() Dim a As String a = InputBox(Introduzca una palabra, Funciones de texto) Cells(1, 1) = Asc(a) Cells(1, 2) = Chr(Cells(1, 1)) Cells(1, 3) = Format(Date, dd / mmm /yyyy) Cells(1, 5).NumberFormat = #,##0.00 End Sub (NOTA: Cuando quiera insertar el smbolo euro presione alt gr+ 5) Tambin tenemos las siguientes expresiones para formatear expresiones: FormatCurrency(expresin)=Expresin con formato de moneda. FormatdateTime(expresin)=Id con formato de fecha y hora. FormatPercent(expresin)=Id formato de porcentaje. InStr(comienzo,posicin1,posicin2) Ejemplo: en la celda 1,1 previamente he insertado mi nombre completo, despus ejecuto el siguiente cdigo. Sub prueba_dos() Dim c, b As String Dim i As Byte b = Cells(1, 1) c = InputBox(Inserte la letra a buscar) MsgBox La letra & c & que Vd busca se encuentra en la posicin & InStr(1, b, c) End Sub

LCase(expresin)= Convierte a minsculas y Ucase a maysculas. Para poner la primera letra en maysculas y el resto minsculas usamos StrConv(cadena,vbPoperCase). Ejemplo: Sub letras() Dim b As String b = InputBox(Inserte su nombre) Cells(1, 1) = b Cells(2, 1) = LCase(b) Cells(3, 1) = UCase(b) Cells(4, 1) = StrConv(b, vbProperCase) End Sub Otras funciones de cadenas: Left(texto,Nchart)>devuelve los primeros caracteres de una cadena Right(id)>nos devuelve los ltimos Midt(texto, Init, NChar)>permite extraer del texto una serie de carcteres a partir de Init. Ejemplo: Sub funciones_cadenas() Dim palabra As String palabra = InputBox(Introduzca una palabra, Funciones de cadenas) If Len(palabra) = 0 Then MsgBox ERROR GoTo salida Else [A1] = La palabra que ha introducido ha sido & palabra [A2] = La funcin left a partir de la 2 letra devuelve el carcter : & Left(palabra, 2) [A3] = La funcin right a partir de la 2 letra devuelve el carcter : & Right(palabra, 2) [A4] = La funcin Mid(palabra, 1, 2) devuelve : & Mid(palabra, 1, 2) [A5] = Su palabra tiene & Len(palabra) & caracteres. End If salida: End Sub

Funciones Financieras
VBA tiene una serie de funciones financieras adems de las que ya tiene Excel, que nos ofrece la oportunidad de crear potentes aplicaciones para finanzas empresariales o personales. Si desea repasar las funciones financieras de Excel aqu tiene un documento que tal vez pueda ayudarle. Para estudiar las propias de VBA volvamos al examinador de objetos. Pulse F2 y en el cuadro de bsqueda inserte FINANCIAL. Inmediatamente podr ver los miembros de Financial:

Las ms usuales son: rate: tasa fija de inters. nper: Numero de perodos pmt: pagos o depsitos peridicos. pv: valor actual del prstamo fv: valor futuro del prstamo o inversin. type: tipo de pago o depsito. El siguiente ejemplo muestra el clculo de la cuota para un prstamo francs (Calculando la Tasa anual de Inters): Sub otro() Dim Fmt, FVal, PVal, APR, TotPmts, Tipopago, Pago Const PERIODFIN = 0, PERIODINI = 1 Fmt = ###,###,##0.00 FVal = 0 Normalmente 0 (crdito). Momento de los pagos. Define el formato.

PVal = InputBox(Cunto dinero desea solicitar?) APR = InputBox(Cul es la tasa anual porcentual del crdito?) If APR > 1 Then APR = APR / 100 Asegura la forma correcta. TotPmts = InputBox(Cuantos pagos mensuales va a realizar?) Tipopago = MsgBox(Realiza los pagos al final del mes?, vbYesNo) If Tipopago = vbNo Then Tipopago = PERIODINI Else Tipopago = PERIODFIN Pago = Pmt(APR / 12, TotPmts, -PVal, FVal, Tipopago) MsgBox El importe del pago ser & Format(Pago, Fmt) & al mes. End Sub

En la prctica que aqu se expone, se ha realizado el clculo de las cuotas de un prstamo tipo francs mediante Excel:

En F10 se inserta la frmula siguiente:=(Va*i/q)/(1-(1+i/q)^-(n*q)) Si quisiramos hacerlo mediante VBA el cdigo asociado sera el siguiente: Sub prestamo_dos() Dim cuantia, cuota, tipo, periodos, i, r Const k = 0.25 / 100 tipo = (Cells(4, 4).Value) / 100 periodos = Cells(5, 4).Value cuantia = Cells(3, 4).Value Cells(9, 2) = Cells(4, 4) / 100 For i = 9 To 15 Cells(i, 2).Value = (Cells(i 1, 2).Value) + k r = Cells(i, 2).Value Cells(i, 6) = Abs(Pmt(r, periodos, cuantia)) Cells(i, 5) = Abs(Pmt(r / 2, periodos * 2, cuantia)) Cells(i, 4) = Abs(Pmt(r / 4, periodos * 4, cuantia)) Cells(i, 3) = Abs(Pmt(r / 12, periodos * 12, cuantia)) Next End Sub

Funciones de conversin de tipos


Existen una gran variedad de funciones de conversin en VBA aunque en la mayora de casos se hace de forma automtica. Las funciones de conversin se utilizan para cambiar el tipo de dato, de una expresin a fin de poder operar con ella.

Funcin

Tipo

Valor que devuelve la funcin

CBool

Boolean

Cualquier cadena o expresin numrica vlida

CByte

Byte

0 a 255

CCur

Currency

922 337 203 685 477,5808 a 922 337 203 685 477,5807

CDate

Date

Cualquier expresin de fecha vlida

-1.79769313486231E308 a -4,94065645841247E-324 para los valores CDbl Double negativos ; 4,94065645841247E-324 a 1,79769313486232E308 para los valores positivos

+/-79 228 162 514 264 337 593 543 950 335 para los nmero sin dcimales. CDec Decimal El rango de numeros para 28 dcimales +/7,9228162514264337593543950335. El nmero ms pequeo es diferente de cero 0,0000000000000000000000000001

CInt

Integer

-32 768 a 32 767 , las fracciones se redondean. Las partes decimales se redondean a 0.5 y el nmero par ms cercano

CLng

Long

2 147 483 648 a 2 147 483 647 , las fracciones son redondeadas. Las partes decimales se redondean a 0.5 y el nmero par ms cercano

CSng

Single

-3,402823E38 a -1,401298E-45 para los valores negativos, 1,401298E-45 3,402823E38 para los valores positivos

CStr

String

Los valores devueltos por la funcin Cstr de la expresin dependiente

CVar

Variant

Mismo rango de valores para los nmeros de tipo doble y el tipo de cadenas no nmericas.

En el siguiente ejemplo puede ver una forma de convertir datos de tipo numrico a tipo fecha y viceversa: Sub convierte() Dim x As Integer Dim y As Date x = Cells(1, 1) Cells(1, 2) = CDate(x) y = Date Cells(3, 1) = y Cells(3, 2) = CLng(y) End Sub

Las funciones ImputBox y MsgBox


29 AGOSTO, 2011 DEJA UN COMENTARIO

A lo largo de los diferentes ejemplos que he ido insertando, he ido adelantando en la prctica algunos conceptos que, no he expuesto en profundidad. En el presente post, tratar de explicar las posibles configuraciones que tiene los cuadros de entrada (inputbox) y de mensajes (message-box/MsgBox). Los primeros permiten introducir datos por teclado. Su sintxis es la siguiente: InputBox([prompt],[Title],[Default],{xpos],[ypos],[help file,context]) Prompt : Es el texto mostrado en el cuadro de dialogo Title :(opcional)Texto de titulo para el cuadro de dialogo Default :Valor por defecto mostrado en el cuadro de dialogo Xpos,Ypos :La pantalla se ubicar segn las coordenadas Helpfile ,context (opcional).el archivo de ayuda Type :Opcional. Expresin numrica que es el nmero de contexto de Ayuda asignado por el autor al tema de Ayuda correspondiente.El tipo de dato devuelto como se ve en la siguiente tabla. codigo > SIGNIFICADO 0 > Una frmula 1 > Un numero 2 > Una cadena(texto) 4 > Un valor logico(True o False) 8 > Una celda de referencia ,como un objeto de rango 16 > Un error de valor,como #N/A

El MsgBox es el cuadro de respuesta de la API de Windows. Su sintxis es la siguiente: Muestra un mensaje en un cuadro de dilogo, espera a que el usuario haga clic en un botn y devuelve un tipoInteger correspondiente al botn elegido por el usuario. MsgBox(prompt[, buttons][, title][, helpfile, context]) La sintaxis de la funcin MsgBox consta de estos argumentos con nombre: prompt Requerido. Expresin de cadena que representa el prompt 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)) o un carcter de avance de lnea (Chr(10)), o una combinacin de caracteres de retorno de carro avance de lnea (Chr(13)y Chr(10)) entre cada lnea y la siguiente.

buttons

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 predeterminado para buttons es 0.

title

Opcional. Expresin de cadena que se muestra en la barra de ttulo del cuadro de dilogo. Si se omite title, en la barra de ttulo se coloca el nombre de la aplicacin.

helpfile

Opcional. Expresin de cadena que identifica el archivo de Ayuda que se utiliza para proporcionar ayuda interactiva en el cuadro de dilogo. Si se especifica helpfile, tambin se debe especificar context.

context

Opcional. Expresin numrica que es igual al nmero de contexto de Ayuda asignado por el autor al tema de Ayuda correspondiente. Si se especifica context, tambin se debe especificar helpfile.

Valores El argumento buttons tiene estos valores:

VbOKOnly VbOKCancel VbAbortRetryIgnore

0 1 2

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.

VbYesNoCancel VbYesNo VbRetryCancel

3 4 5

VbCritical VbQuestion

16 32

VbExclamation

48

VbInformation

64

VbDefaultButton1 VbDefaultButton2 VbDefaultButton3 VbDefaultButton4

0 256 512 768

VbApplicationModal

Aplicacin modal; el usuario debe responder al cuadro de mensajes antes de poder seguir trabajando en la aplicacin actual. Sistema modal; se suspenden todas las aplicaciones hasta que el usuario responda al cuadro de mensajes. Agrega el botn Ayuda al cuadro de mensaje. Especifica la ventana del cuadro de mensaje como la ventana de primer plano. El texto se alnea a la derecha. Especifica que el texto debe aparecer para ser ledo de derecha a izquierda en sistemas hebreo y rabe.

VbSystemModal

4096

VbMsgBoxHelpButton

16384

VbMsgBoxSetForeground

65536

VbMsgBoxRight VbMsgBoxRtlReading

524288 1048576

Ejemplo: Sub ejemplo() Dim pregunta, res1, res2, res3 As String pregunta = InputBox(Cmo te llamas?, Bienvenido) res1 = MsgBox(Hola & pregunta, vbExclamation, Bienvenido) res2 = MsgBox(Hola & pregunta, 64, Bienvenido) res3 = MsgBox(Hola & pregunta, 64 + vbMsgBoxRight, Bienvenido) End Sub Pruebe con las diferentes combinaciones a la hora de programar sus cuadros. Lo interesante es preparar unos cuantos que fcilmente puede implementar en sus programas.

7. Estructuras de Decisin

Estructuras de decisin if_then_else


Los pequeos programas que hemos escrito hasta ahora, se han limitado a ejecutar una serie de instrucciones de forma secuencial, una detrs de otra. En este post vamos a abordar el estudio de las estructuras de decisin, las cuales evalan si se cumplen o no una o varias condiciones antes de ejecutar la sentencia.Comenzamos con if__then__else: Veamos su estructura:

Por ejemplo evaluaremos la edad del usuario para que pueda acceder a la aplicacin:

El cdigo en VBA sera: Sub ejemplo7() Dim edad As Byte solicitamos la edad del usuario por teclado edad = InputBox(Qu edad tienes?, Edad) si es mayor de edad If edad >= 18 Then entonces bienvenido MsgBox Bienvenido en caso contrario Else mensaje y fin MsgBox Lo siento no puede acceder a la aplicacin cerramos Excel Application.Quit End If End Sub

Estructuras de decisin Select Case


Cuando tenemos que verificar muchas condiciones la estructura ifelse puede ser un tanto pesada. Con SelectCase podemos conseguir una estructura ms clara y legible. Su sintxis es la siguiente: Select [ Case ] testexpression [ Case expressionlist [ statements ] ] [ Case Else [ elsestatements ] ] End Select Ejemplo: Sub usuarios() Dim usuario As String usuario = InputBox(Ingrese su nombre) Select Case usuario Case Hugo MsgBox Bienvenido Hugo Case Luis MsgBox Bienvenido Luis Case Else MsgBox Lo siento no ests registrado End Select End Sub

Estructuras de decisin Select Case anidados


Me ha parecido interesante la explicacin y el ejemplo de las estructuras anidadas de Select Case y la reproduzco aqu al objeto de que vd pueda ver la potencialidad de esta estructura con un ejemplo que, a pesar de la presencia de varias condiciones, resulta bastante clara y as adems, aborda ejemplos ms desarrollados. El problema planteado es el siguiente:

En una base de datos de personas, el objetivo es que Excel diga la clasificacin del porcentaje de grasa de una persona, el cual se obtiene por un numero que da una balanza. El problema es que son muchas condicionales! Si es mujer de 18-39 aos: 0-21 bajo en grasa;22-33 normal;34-39 alto en grasa;ms de 39 obesidad. Si es mujer de 40-59 aos:0-23 bajo en grasa;24-34 normal;35-40 alto en grasa; ms de 40 obesidad. Si es mujer de 60-69 aos: 0-24 bajo en grasa;25-36 normal;37-42 alto en grasa; ms de 42 obesidad. Si es hombre de 18-39 aos: 0-8 bajo en grasa;9-20 normal;21-25 alto en grasa;ms de 25 obesidad Si es hombre de 40-59 aos: 0-11 bajo en grasa;12-22 normal;23-28 alto en grasa;ms de 28 obesidad Si es hombre de 60-99 aos: 0-13 bajo en grasa;13-25 saludable;26-30 alto en grasa; ms de 30 obesidad.

Si bien podramos optar por desarrollar la frmula anidando repetidamente la funcin SI condicional, es cierto que slo lo podramos implementar con versiones superiores a Excel 2003, ya que en esta o anteriores nuestro mximo de anidaciones era de siete

Recordemos que para crear una funcin personalizada o UDF debemos acceder al Editor de VBA presionando Alt+F11, y ya dentro del Editor insertar un modulo (Men Insertar > Modulo), haciendo doble clic en el mdulo copiaremos el siguiente cdigo:

creamos una funcin con tres variables Sexo, Edad y % grasa Public Function Grasa1(sexo, edad, Porcgra) Select Case sexo definimos categoras para mujeres Case Is = M Select Case edad Case 18 To 39 Select Case Porcgra Case 0 To 21: Grasa1 = bajo en grasa Case 22 To 33: Grasa1 = normal en grasa Case 34 To 39: Grasa1 = alto en grasa Case Is > 39: Grasa1 = obesidad End Select Case 40 To 59 Select Case Porcgra Case 0 To 23: Grasa1 = bajo en grasa Case 24 To 34: Grasa1 = normal en grasa Case 35 To 40: Grasa1 = alto en grasa Case Is > 40: Grasa1 = obesidad End Select Case 60 To 99 Select Case Porcgra Case 0 To 24: Grasa1 = bajo en grasa Case 25 To 36: Grasa1 = normal en grasa Case 37 To 42: Grasa1 = alto en grasa Case Is > 42: Grasa1 = obesidad End Select End Select lo mismo para hombres Case Is = H Select Case edad Case 18 To 39 Select Case Porcgra Case 0 To 8: Grasa1 = bajo en grasa Case 9 To 20: Grasa1 = normal en grasa Case 21 To 25: Grasa1 = alto en grasa Case Is > 25: Grasa1 = obesidad End Select Case 40 To 59 Select Case Porcgra Case 0 To 11: Grasa1 = bajo en grasa Case 12 To 22: Grasa1 = normal en grasa Case 23 To 28: Grasa1 = alto en grasa Case Is > 28: Grasa1 = obesidad End Select Case 60 To 99 Select Case Porcgra Case 0 To 13: Grasa1 = bajo en grasa Case 14 To 25: Grasa1 = normal en grasa Case 26 To 30: Grasa1 = alto en grasa Case Is > 30: Grasa1 = obesidad End Select End Select End Select End Function

Ya podremos utilizar nuestra funcin Grasa1 en nuestra Hoja de clculo, sobre tres celdas =GRASA1(sexo; edad; %grasa)

8. Bucles de repeticin:

Fornext
Los bucles de repeticin nos permite efectuar varias veces una serie de instrucciones incluidas en un procedimiento. El primero que vamos a analizar es el bucle Fornext. Su sintxis sera la siguiente: For variable = inicio To fin salto Next variable Ejemplo vamos a realizar un ejercicio que nos presente por pantalla los cuadrados de los nmeros 1 al 5. Sub cuadrado() Ejemplo de bucle for..next definimos la variable contador On Error Resume NextDim x, y As Byte Iniciamos el bucle desde 1 hasta 5 For x = 1 To 5 y=x*x MsgBox El cuadrado de & x & es & y Next End Sub Si no se dice nada, la variable comienza en el nmero que le hallamos maracado como inicio e ira recorriendo el bucle de 1 en 1. Si deseamos que lo haga por ejemplo de dos en dos, tenemos que especificarlo con la expresin step. En el ejemplo citado supongamos que deseamos hacer el mismo clculo pero con los nmeros pares del 1 al 12: Sub cuadrado_par() Dim x, y As Byte For x = 2 To 12 Step 2 y=x*x MsgBox El cuadrado de & x & es & yNext End Sub Por cierto se habr percatado de la presencia de una lnea de cdigo al comienzo del bucle On Error Resume Next. Con esta sentencia evitamos que el programa se cuelge ante la presencia de errores ms o menos viene a decir: en presencia de error salta al siguiente paso. En su momento trabajaremos el tema referente al tratamiento de errores.

Bucles de repeticin:DoLoop
15 AGOSTO, 2011

Este bucle comprueba que se ejecute una serie de instrucciones hasta que se cumpla una condicin determinada. Por ejemplo en el siguiente cdigo forzamos que se escriban los nmeros desde el 1 al 11, para ello usamos una variable contador que la inicializamos en 0 y a partir de aqu le sumamos 1 hasta que llegue al 11. Sub ejemplo_Do_Loop() Dim i As Byte i=0 Do Until i = 11 i=i+1 Cells(i, 1) = i Loop End Sub Una variante de este bucle sera Dowhileloop Sub ejemplo_Do_while_loop() Dim i As Byte i=0 Do While i < 20 i=i+1 Cells(i, 1) = i Loop End Sub

Condiciones dentro del bucle Fornext


17 AGOSTO, 2011 DEJA UN COMENTARIO

Podemos anidar condiciones una dentro de otras. En un bucle ift hen podemos insertar otro y, as tambin podemos hacerlo con Fornext. En l siguiente ejemplo vamos a sacar en las primeras 25 filas de forma aleatoria nmeros entre el 100 y el 999, despus vamos a insertar un bucle anidado que nos va a colorear en rojo y negrita la fuente, para aquellos valores que superen el valor 500. Observe el cdigo y vea cmo se generan los nmeros aleatorios: Sub ejemplo() declaro variables Dim numaleatorio As Integer Dim i As Byte desde la fila 1 a la 25 inserto nmeros aleatorios del 100 al 999 For i = 1 To 25 numaleatorio = Int((999 100 + 1) * Rnd + 100) Cells(i, 1) = numaleatorio Next voy a cambiar a rojo y negrita los valores que pasen de 500 For i = 1 To 25 If Cells(i, 1) > 500 Then Cells(i, 1).Font.ColorIndex = 3 Cells(i, 1).Font.Bold = True End If Next i

End Sub
He separado el cdigo para hacerlo ms comprensible, evidentemente se puede hacer de otra forma. Dentro del bucle ForNext se sita la estructura condicional. Si la condicin se cumple en una celda, esta cambia de color. El valor colorindex va del 1 al 56 y representa la paleta de colores en VBA. Aprovechando el tema intente hacer la prctica 6 puede serle de utilidad.

9. Arrays
Supongamos que precisamos referenciar los datos de una cartera de clientes. Tal vez precisemos almacenar informacin para cada uno de los clientes acerca de su nombre, apellidos, direccin, edad,etc. Esto implicara la declaracin de una variable por cada concepto y por cada cliente. Adems de la perdida de tiempo, es por tal motivo que recurrimos a las Matrices o Arrays. Un array es un conjunto de datos del mismo tipo ordenados en forman lneal uno despus de otro. Los componentes de un array se han de referenciar por medio del nombre del array y un ndice de desplazamiento para indicar el componente deseado. Como ejemplo prctico vamos a realizar este sencillo ejercicio que va a consistir en obtener los productos cruzados de los primeros 10 nmeros naturales. Para ello vamos a realizar una macro que nos escriba los 10 primeros nmeros en la fila 1 y en la columna A para despus efectar el producto. 1. 2. 3. 4. Abra un libro nuevo. Presione Alt+F11 para ejecutar el Editor de Visual Basic. En el men Insertar, haga clic en Mdulo. Escriba el siguiente cdigo en la hoja de mdulo: Dim i, j As Byte Dim myarray As Variant myarray = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) Range(a1:a10).Value = Application.WorksheetFunction.Transpose(myarray) Range(a1:j1).Value = myarray Range(a1:a10).Font.ColorIndex = 5 Range(a1:j1).Font.ColorIndex = 5 For i = 1 To 10 For j = 1 To 10 Cells(i, j) = Cells(1, j) * Cells(i, 1) Next j Next i End Sub Como se habr podido observar despus de declarar dos variables byte, la i y la j, hemos declarado nuestra matriz con el nombre de myarray y tipo Variant. En principio todos los elementos de un array deben ser del mismo tipo, el hecho de declararlos de tipo Variante nos facilita mezclar elementos de diferente tipo e incluso incluir otras arrays. Seguidamente hemos definido los elementos de nuestra matriz con la siguiente declaracin: myarray = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) Con la siguiente lnea invocamos una funcin de Excel la transposicin de matrices. O sea intercambiar filas por columnas: Range(a1:a10).Value = Application.WorksheetFunction.Transpose(myarray) Con ello conseguimos escribir en forma de columna nuestra matriz fila. A continuacin insertamos los valores de la misma matriz en la fila 1 Range(a1:j1).Value = myarray Formateamos un poco dndole color azul a la fuentes de la 1 fila y columna y despus insertamos un bucle para efectar los productos cruzados. No se preocupe por ese fragmento de cdigo lo entender cuando tratemos las estructuroas de decisin.

Sub tabla_multiplicar()

Arrays dinmicos
Ya he hablado anteriormente de los arrays. La mayora de los lenguajes de programacin utilizan los arrays que, recordemos es un conjunto de elementos que tienen en comn un nombre aunque entre ellos son diferentes. Por ejemplo el array dgitos estara compuesto por las cifras 0,1,2,3,4,5,6,7,8 y 9. Cada uno de ellos irn referidos con un ndice. As supongamos el array compuesto por los meses del ao:

Al tratarse de un nmero de elementos fijo estaramos hablando de un array esttico que, en este caso consta de 12 elementos. Antes de empezar a programar con ellos necesitamos declararlos Dim meses(11) as byte Podr observar que entre parntesis he colocado 11 y no 12, ya que, por defecto los subndices de los arrays de VBA empiezan en 0 (que es el lmite inferior de la matriz). Si deseamos que comience en 1 en vez de en 0, incluiremos antes del primer array y antes del primer procedimiento las expresin: Option Base 1

Ahora bien que haramos si no conociramos de antemano la dimensin de nuestra array? Para ello podemos declarar un array dinmico dejando el parntesis en blanco en la sentencia Dim: Dim miArray( ) as Double Una vez que conozcamos el nmero de elementos que necesitamos usaremos la sentencia Redim para sealar el nmero de subndices necesarios. Por ejemplo: Redim mi Array(102) Veamos un ejemplo sencillo para entender los conceptos mencionados: Vamos a declarar una matriz unidimensional de 3 elementos compuesto por los tres primeros dias de la semana, y haremos que no los presente por pantalla: Option Explicit Sub asignandoarray() Dim miArray(3) As String miArray(0) = lunes miArray(1) = martes miArray(2) = mircoles MsgBox miArray(0) & & miArray(1) & & miArray(2) End Sub Ahora redimensionaremos el array para introducir el jueves y el viernes: Sub redimarray() Voy a redimensionar la array anterior para incluir el jueves y el viernes ReDim miArray(5) miArray(0) = lunes miArray(1) = martes miArray(2) = mircoles miArray(3) = jueves miArray(4) = viernes MsgBox miArray(0) & & miArray(1) & & miArray(2) & & miArray(3) & & miArray(4) End Sub

Si deseamos no tener que volver a escribir el mismo procedimiento podemos incluir datos con la expresin Redim preserve(el nmero siguiente en el ndice) Sub asignandoarray2() ReDim miArray(3) miArray(0) = lunes miArray(1) = martes miArray(2) = mircoles ReDim Preserve miArray(3) miArray(3) = jueves MsgBox miArray(0) & & miArray(1) & & miArray(2) & & miArray(3) End Sub

10.

Trabajando con objetos

Tal vez haya escuchado hablar de programacin estructurada, modular,( algo menos ) lgica, funcional, concurrente, y la que vamos a tratar a continuacin la POO (programacin orientada a objetos). La programacin estructurada es un tipo de programacin que usa una lgica secuencial en su estructura, con estructuras de control, secuenciales y repetitivas. Es una forma de programar que tiene sus ventajas e inconvenientes, pero que, siendo profusamente utilizado en los aos 60 se ha quedado un pco corto a la hora de cubrir las necesidades de aplicaciones grficas. No es objeto de este post entrar a describir los otros tipos de programacin, ya que VBA es un lenguaje orientado a objetos, y por ello nos vamos a centrar en l. Un objeto, diccionario en mano, es cualquier cosa perceptible por uno o ms sentidos, especialmente algo que se puede ver y sentir. Para VBA entendamos que un objeto es cualquier cosa dentro de la aplicacin que puede manipularse de alguna forma. Al igual que un vehculo, que como tal es un objeto, dentro del mismo existen otros objetos tales como las ruedas, las puertas, los retrovisores. Tanto el objeto vehculo como sus objetos inherentes tienen una serie depropiedades, como modelo, color, motorLos mtodos del coche definen que podemos hacer con l: frenar, girar, Los eventos del vehculo nos dice las cosas que le ocurren, si dejamos las luces encendidas y salimos un pitido nos avisa del hecho, etc. Si analiza un poco lo descrito observar que existe una organizacin intrnseca en el modelo orientado a objetos. Es decir se da una jerarqua desde los niveles superiores (ms genricos) hasta los niveles inferiores ms especficos.

Algunas propiedades tambin realizan la funcin de objetos. Por ejemplo el objeto Application tiene una propiedad ActiveWindow (nombre de la ventana activa) que a su vez en s misma es un objeto. Esto puede dar lugar a confunsiones en la sintxis. Por ejemplo: Application.ActiveWindow.ActiveCell.Font.Italic Puede abreviarse y quedara as: ActiveCell.Font.Italic

El objeto Application representa la aplicacin completa Microsoft Excel. Como todo objeto tiene una serie depropiedades : Propiedad Devuelve

Application.

UserName

Nombre del usuario

OrganizationName

Nombre de la empresa

OperatingSystem

Sistema operativo

Version

Versin de MS Excel

ProductCode

Cdigo de MS Excel

StandardFont

Fuente por defecto

StandardFontSize

Tamao fuente por defecto

DecimalSeparator

Carcter separador de miles

ActivePrinter

Impresora por defecto

DefaultFilePath

Ruta de acceso por defecto

UserLibraryPath

Ruta a carpeta Add-Ins

Ejemplo de macros del objeto Application: en el siguiente ejemplo listamos algunas de las propiedades descritas.

Sub ejemplo() Dim i As Byte Dim primero, ultimo As Variant Dim uno, dos, tres, cuatro, cinco As String Dim matriz uno = Application.UserName dos = Application.OperatingSystem tres = Application.ActiveWorkbook.Name cuatro = Application.Version cinco = Application.LibraryPath matriz = Array(uno, dos, tres, cuatro, cinco) For i = 1 To 5 Cells(i, 1) = matriz(i) Next End Sub
Los eventos del objeto Application se suelen dar generlamente al crear o abrir un libro, cuando cambia una hoja, o se crea o modifica una tabla dinmica.

NewWorkbookSheetActivate SheetBeforeDoubleClick SheetBeforeRightClick SheetCalculate SheetChange SheetDeactivate SheetFollowHyperlink SheetSelectionChange SheetPivotTableUpdate WindowActivate WindowDeactivate

WindowResizeWorkbookActivate WorkbookAddinInstall WorkbookAddinUninstall WorkbookBeforeClose WorkbookBeforePrint WorkbookBeforeSave WorkbookDeactivate WorkbookNewSheet WorkbookOpen WorkbookPivotTableCloseConnection WorkbookPivotTableOpenConnection

Ejemplo: Crearemos un libor nuevo con ese nombre. Sub NuevoLibro() Workbooks.Add Application.ActiveWorkbook.SaveAs (Mi_nuevo_libro) End Sub Abrir un libro existente: para abrir un libro utilizaremos la siguiente Macro. Sub AbrirLibro() Workbooks.Open (C:\Mis documentos\Ejemplo.xls) End Sub

El objeto WorkSheet(hoja)
El objeto Worksheets representa a las hojas de un libro de Excel. El acceso al mismo puede ser:

La hoja activa> ActiveSheet Llamada a la hoja 1>WorkSheets(Hoja1) Llamada a la primera hoja de la coleccin>WorkSheets(1) Llamada a la ltima hoja de la coleccin.>WorkSheets(WorkSheets.Count) Llamada a una hoja de otro libro.>

Workbooks(Libro1).Worksheets(Hoja1) Workbooks(Libro2).Worksheets(Hoja1) Propiedades: a excepcin de name todas son de lectura.

.Name>Nombre de la hoja. .Index>Numero de la hoja dentro del ndice numrico de la coleccin. .Count>Devuelve el nmero de hojas dentro de la coleccin. .Next/previous>Devuelve la hoja siguiente/anterior. .Used Range>Devuelve un objeto range con el rango de la hoja que tiene datos.

Ejemplo: la siguiente macro devuelve el nombre de las hojas del libro. Sub Muestra_mis_hojas() Dim mihoja As Worksheet For Each mihoja In Worksheets MsgBox mihoja.Name Next mihoja End Sub Eventos:

.Activate>activa la hoja .calculate>reclacula la hoja especificada. .Delete>Borra la hoja. .Protect>Protege la hoja sealada.

Ejemplo: macro para proteger la hoja activa. Sub ProtectSheet() ActiveSheet.Protect End Sub

El objeto Range
Dentro de la colecin de objetos de Excel y tal como haba expuesto anteriormente Range es casi la unidad bsica con la que podemos trabajar. Y digo casi porque dentro de Range podemos encontrar un objeto como es Cells (celdas). A qu nos referimos cuando hablamos de Range:

A un conjunto de celdas. A una celda en concreto. A toda una fila / columna. A celdas de otras hojas. ActiveCell->representa la primera celda activa de la ventana activa (windowactive) o especificada. Areas->todos los rangos de una selecin mltiple. Cells->representa a una celda o cleccin de ellas. Columns->representa las columnas de la hoja activa,o especificada, o del rango especificado. Entire column/row->la columna/fila entera dentro del rango. End->la celda situada al final del rango especificado. Offset->la celda desplazada segn un n especfico de fila/columna.

Como propiedades el objeto Range tiene las siguientes:

Formas de seleccionar celdas con Range: Una celda slo: Range(A1).Select Un conjunto de celdas contiguas dentro de la misma hoja: Range(A1:G5).Select Para seleccionar celdas no contiguas: Range(A1,A5,B4).Select Para seleccionar celdas no contiguas mas un conjunto contiguo: Range(A1,A5,B4:B8).Select Otro ejemplo: La siguiente tabla muestra algunas referencias de estilo A1 utilizando el mtodo Range. Referencia Significado Range(A1) Celda A1 Range(A1:B5) Celdas de la A1 a la B5 Range(C5:D9,G9:H16) Seleccin de varias reas Range(A:A) Columna A Range(1:1) Fila uno Range(A:C) Columnas de la A a la C Range(1:5) Filas de la uno a la cinco Range(1:1,3:3,8:8) Filas uno, tres y ocho Range(A:A,C:C,F:F) Columnas A, C y F De todas las propiedades descritas tal vez una de las ms usadas sea Offset, que nos permite seleccionar celdas contiguas a la celda activa segn una determinada posicin de filas y clumnas: expresin.Offset(RowOffset, RowOffset) RowOffset ColumnOffset Variant opcional. El nmero de filas (positivo, negativo o cero) que indica el desplazamiento del rango. Los Variant opcional. El nmero de columnas (positivo, negativo o cero) que indica el desplazamiento del valores positivos desplazan hacia abajo y los negativos, hacia arriba. El valor predeterminado es 0. rango. Los valores positivos desplazan a la derecha y los negativos, hacia la izquierda. El valor predeterminado es 0. ActiveCell.Offset(0,0)->nos determina la posicin actual

Ejemplo: Sub ejemplo() ejemplos del empleo de range y cells escribo Hola en varias celdas de la hoja 2 Worksheets(Hoja2).Range(A1:B5) = Hola lo mismo pero en celdas discontinuas Worksheets(1).Range(F1, G5) = Hi ahora en la hoja 2 Worksheets(Hoja2).Range(J1, K3, H5) = AAA ActiveCell.Offset(2, 2) = Me desplazo End Sub Si establece una variable de objeto para un objeto Range, puede manipular fcilmente el rango utilizando el nombre de la variable. El siguiente procedimiento crea la variable de objeto miRango y, a continuacin, asigna la variable al rango A1:D5 de la Hoja1 del libro activo. Las instrucciones posteriores modifican las propiedades del rango, sustituyendo el nombre de la variable por el objeto del rango. Sub Aleatorio() Dim miRango As Range Set miRango = Worksheets(Hoja1).Range(A1:D5) miRango.Formula = =ALEATORIO() miRango.Font.Bold = True End Sub

Utilice la funcin Array para identificar un grupo de hojas. El siguiente ejemplo selecciona tres hojas del libro activo. Sub Varias() Worksheets(Array(Hoja1, Hoja2, Hoja4)).Select End Sub Utilice la propiedad Rows o Columns para trabajar con filas o columnas enteras. Estas propiedades devuelven un objeto Range que representa un rango de celdas. En el siguiente ejemplo, Rows(1) devuelve la fila uno de la Hoja1. A continuacin, la propiedad Bold del objeto Font del rango se establece en True. Sub FilaNegrita() Worksheets(Hoja1).Rows(1).Font.Bold = True End Sub

La siguiente tabla muestra algunas referencias de fila y columna, utilizando las propiedades Rows y Columns. Referencia Significado Rows(1) Fila uno Rows Todas las filas de la hoja de clculo Columns(1) Columna uno Columns(A) Columna uno Columns Todas las columnas de la hoja de clculo Para trabajar con varias filas o columnas al mismo tiempo, cree una variable de objeto y utilice el mtodo Union, combinando varias llamadas a la propiedad Rows o Columns. El siguiente ejemplo cambia a negrita el formato de las filas uno, tres y cinco de la hoja de clculo uno del libro activo. Sub VariasFilas() Worksheets(Hoja1).Activate Dim miUnin As Range Set miUnin = Union(Rows(1), Rows(3), Rows(5)) miUnin.Font.Bold = True End Sub Mtodo abreviado para hacer referencia a rangos Podemos utilizar tambin corchetes cuando hacemos referencias a rangos. Utilizando corchetes, as: En vez de Range(D5) podemos utilizar [D5] En vez de Range(A1:D5) podemos utilizar [A1:D5] Range(A1:D5,G6:I17) >[A1:D5,G6:I17]

Trabajando con varias propiedades


Dado que la mayora de objetos tienen diversas propiedades, a veces, necesitaremos efectuar varias acciones sobre un mismo objeto. Si tenemos un objeto con un nombre demasiado largo, a veces, resulta engorroso tener que escribir una y otra vez dicho nombre para asociarle el mtodo o propiedad que deseamos asignar. A fin de facilitar un poco las cosas VBA nos ofrece utilizar la estructura WithEnd With. Por ejemplo imagine que deseamos poner una fila entera en negrita, doble subrayado, fuente grande y color especial, el cdigo podra ser el siguiente: Range(A1:K1).Select Selection.Font.Bold=True Selection.Font.Size=12 Selection.Font.ColorIndex=5 Selection.Font.Underline=xlUnderlineStyleDoubleAccounting Podemos reescribirlo con la sintxis expuesta teniendo en cuenta que todo lo que hace referencia al objeto en s empieza con un punto: With Range (A1:K1).Font .Bold=True .Size=12 .ColorIndex=5 .Underline=xlUnderlineStyleDoubleAccounting End With

11.

Formularios

Los formularios en general son documentos impresos o en lnea diseados con un formato y estructura estndar que facilita la captura, la organizacin y la edicin de la informacin. Los formularios contienen controles, objetos que muestran datos o hacen que sea ms fcil para los usuarios entrar o editar los datos, realizar una accin o seleccionar una opcin. En general, los controles facilitan el uso de los formularios. Algunos ejemplos de controles comunes son los cuadros de lista, los botones de opcin y los botones de comando. Los controles tambin pueden ejecutar macros asignadas y responder a eventos, tales como clics del mouse, mediante la ejecucin de cdigo de VBA.

Resumen de controles de formulario


Nombre del botn Ejemplo Descripcin

Identifica el propsito de una celda o Etiqueta un cuadro de texto, o muestra texto descriptivo (como ttulos, leyendas, imgenes) o breves instrucciones.

Agrupa controles relacionados en una unidad visual en un rectngulo Cuadro de grupo con una etiqueta opcional. Generalmente, se agrupan botones de opcin, casillas de verificacin o contenido estrechamente relacionado.

Ejecuta una macro que realiza una Botn accin cuando un usuario hace clic en l. Los botones tambin se conocen como botones de comando.

Activa o desactiva un valor que representa una seleccin inequvoca entre opuestos. Puede seleccionar ms de una casilla de verificacin en una hoja de clculo o en un cuadro Casilla de verificacin de grupo. Una casilla de verificacin puede tener uno de tres estados: activada, desactivada y mixta, lo que significa una combinacin de los estados activada y desactivada (como en una seleccin mltiple).

Permite una nica eleccin dentro de un conjunto limitado de opciones que se excluyen mutuamente; un botn de opcin generalmente est contenido en un cuadro de grupo o Botn de opcin un marco. Un botn de opcin puede tener uno de tres estados: activado, desactivado y mixto, lo que significa una combinacin de los estados activado y desactivado (como en una seleccin mltiple). Los botones de opcin tambin se conocen como botones de radio.

Muestra una lista de uno o ms elementos de texto de entre los cuales puede elegir el usuario. Use un cuadro de lista para mostrar grandes cantidades de opciones que varan en nmero o contenido. Existen tres tipos de cuadros de lista:

Un cuadro de lista de seleccin nica permite solamente una eleccin. En este caso, un cuadro de lista se asemeja a un

Cuadro de lista

grupo de botones de opcin, a excepcin de que un cuadro de lista puede controlar un gran nmero de elementos de manera ms eficiente.

Un cuadro de lista de seleccin mltiple permite una eleccin o elecciones contiguas (adyacentes).

Un cuadro de lista de seleccin extendida permite una eleccin, elecciones y no contiguas, o inconexas.

Combina un cuadro de texto con un cuadro de lista para crear un cuadro de lista desplegable. Un cuadro combinado es ms compacto que un cuadro de lista pero requiere que el usuario haga clic en la flecha abajo Cuadro combinado para mostrar una lista de elementos. Use un cuadro combinado para permitir que un usuario escriba una entrada o elija solamente un elemento de la lista. El control muestra el valor actual en el cuadro de texto, sin importar el modo en que dicho valor se haya proporcionado.

Se desplaza por un intervalo de valores cuando el usuario hace clic en las flechas de desplazamiento o arrastra el cuadro de desplazamiento. Adems, se puede mover por una pgina (en un Barra de desplazamiento intervalo preestablecido) de valores haciendo clic en el rea entre el cuadro de desplazamiento y cualquiera de las flechas de desplazamiento. Generalmente, el usuario tambin puede escribir un valor de texto directamente en un cuadro de texto o una celda asociados.

Aumenta o disminuye un valor, como un incremento numrico, una hora o una fecha. Para incrementar el valor, es necesario hacer clic en la Control de nmero flecha arriba; para disminuirlo, se debe hacer clic en la flecha abajo. Generalmente, el usuario tambin puede escribir un valor de texto directamente en un cuadro de texto o una celda asociados.

Crear un formulario
Para crear un formulario personalizado abriremos el editor VBA e iremos a insertar->UserForm. Ver como en la ventana de cdigo aparee ahora un pequeo formulario vaco y aparece el cuadro de herramientas.

A la derecha podr ver la ventana de propiedades. No obstante si no la visualiza pulse f4 o vaya a men->ver->ventana de propiedades. Tambin puede pulsar sobre el icono correspondiente en la barra de mens. En dicha ventana podr ver las propiedades inherentes al objeto form, siendo las que ms le interese las siguientes: Name->indica el nombre con el que vamos a identificar el objeto. Generalmente suele emplearse cualquier nombre significativo con el prefijo frm. Por ejemplo frmempleados Caption->el nombre que va a visualizar el objeto en el caso del formulario arriba a la izquierda. Border/ ->Back Color-> los colores de los bordes y el fondo. Font->con qu tipo de fuente se va a escribir en el formulario. Enable-> por defecto a true si inicialmente queremos programar que el objeto no se vea debemos cambiarlo a false. En el formulario podemos mediante arrastrar y soltar colocar diferentes controles desde la caja de herramientas o cuadro de controles. Aqu tenemos una lista de los principales controles:

Formularios: Check buttom / Option Buttom


El control CheckBox, o casilla de verificacin, permite elegir una opcin (activada/desactivada, True/False) que el usuario puede establecer o anular haciendo click. Si un control CheckBox es dependiente de un origen de datos, al cambiar el valor, ste cambia el valor de su origen. Un control CheckBox deshabilitado muestra el valor actual, pero est atenuado y no permite realizar cambios al valor desde la interfaz de usuario. La propiedad predeterminada de un control CheckBox es Value. El evento predeterminado de un control CheckBox es Clic. Control CheckBox. Ejemplo de las propiedades Enabled y Locked El siguiente ejemplo demuestra las propiedades Enabled y Locked y cmo se complementan entre s. Este ejemplo expone cada propiedad independientemente con un control CheckBox, para que observe los valores individuales y combinados. Este ejemplo tambin incluye un segundo control TextBox para que pueda cortar y pegar informacin entre los controles TextBox y comprueba las actividades admitidas por los valores de estas propiedades. Nota Puede copiar la seleccin al Portapapeles utilizando CTRL+C y pegar utilizando CTRL+V. Para utilizar este ejemplo, copie este cdigo de ejemplo en la parte Declaraciones de un formulario. Asegrese de que el formulario contiene:

Un control TextBox llamado TextBox1. Dos controles CheckBox llamados CheckBox1 y CheckBox2. Un segundo control TextBox llamado TextBox2.

Private Sub CheckBox1_Change() TextBox2.Text = TextBox2 TextBox1.Enabled = CheckBox1.Value End Sub Private Sub CheckBox2_Change() TextBox2.Text = TextBox2 TextBox1.Locked = CheckBox2.Value End Sub

Private Sub UserForm_Initialize() TextBox1.Text = TextBox1 TextBox1.Enabled = True TextBox1.Locked = False CheckBox1.Caption = Enabled CheckBox1.Value = True CheckBox2.Caption = Locked CheckBox2.Value = False TextBox2.Text = TextBox2 End Sub

Formularios: cuadro de lista y cuadro combinado


Un cuadro de lista y un cuadro combinado son controles similares pero con ligeras diferencias y sirven para permitir al usuario elegir entre varios elementos o insertar el valor que desee en una lista. Por ejemplo: Cuadro de lista. Muestra una lista de uno o ms elementos de texto de entre los cuales puede elegir el usuario.

Cuadro combinado. Combina un cuadro de texto con un cuadro de lista para crear un cuadro de lista desplegable.Un cuadro combinado es ms compacto que un cuadro de lista, pero requiere que el usuario haga clic en la flecha abajo para mostrar la lista de elementos. Utilice un cuadro combinado para permitir que el usuario escriba una entrada o elija un solo elemento de una lista. El control muestra el valor actual en el cuadro de texto, independientemente de cmo se haya insertado ese valor.

La propiedad predeterminada de un control ListBox es Value. El evento predeterminado de un control ListBox es Click. El siguiente ejemplo agrega y elimina el contenido de un control ListBox utilizando los mtodos AddItem yRemoveItem y las propiedades ListIndex y ListCount. Para utilizar este ejemplo, copie este cdigo de ejemplo en la parte Declaraciones de un formulario. Asegrese de que el formulario contiene:

Un control ListBox llamado ListBox1. Dos controles CommandButton llamados CommandButton1 y CommandButton2.

Ejemplo:

Private Sub Command1_Click() If Text1 = Then MsgBox Debe ingresar un nombre para poder agregar un elemento, vbQuestion + vbOKOnly, Datos incompletos Salimos de la rutina ya que no se ha ingresado nada en el control text1 Exit Sub End If Agregamos el contenido del Text1 en el control List1 List1.AddItem Text1 End Sub Private Sub Command2_Click() Si la lista no est vaca entonces podemos eliminar If List1.ListIndex <> -1 Then Eliminamos el elemento que se encuentra seleccionado List1.RemoveItem List1.ListIndex End If End Sub

Formularios (Frame)
Es un contenedor de otros controles. Los agrupa para que resulten facilmente identificables para el usuario. Para agrupar controles, en primer lugar trace el control Frame y, a continuacin, meta los controles dentro de Frame. De este modo podr mover al mismo tiempo el Frame y los controles que contiene. Si traza un control fuera del Frame y, a continuacin, intenta moverlo dentro de ste, el control se colocar sobre el Frame, pero no pertenecer a el. Es decir, si es un OptionButton este se comportar como si estuviese fuera del Frame, aunque fsicamente est dentro de l.

El evento predeterminado de un control Frame es Click.

Ejemplos de macros
En esta pgina iremos insertando macros y cdigos que pueden servirle de ayuda. Macro para solicitar confirmacin de salir de Excel. macro que solicita al usuario que confirme salir de Excel Private Sub salir() If msgbox(Desea salir de Excel?,vbQuestion+ vbYesNo)=vbYes Then Application.quit End If End Sub Macro para guardar archivo seleccionando ubicacin Sub guardar_archivo() Dim stArchivo stArchivo = Application.GetOpenFilename(Hoja de Excel , *.xls*, _ , Seleccione archivo ) End Sub Macro para guardar archivos en otro formato Sub guardar_archivo_otro() con esta macro guardamos el archivo con la fecha y hora actual y formato csv Dim nombre, nombrearch, hoja, ruta nombre = Format(Now, dd-mm-yy hh.mm.ss) ruta = ActiveWorkbook.Path nombrearch = ActiveWorkbook.Name hoja = ActiveSheet.Name ActiveWorkbook.SaveAs Filename:=ruta & \ & hoja & nombre & .csv, FileFormat:=xlCSV ActiveSheet.SaveAs ruta & \ & nombrearch & nombre & .xlsm End Sub Copiar rango de una hoja a otra Si queremos que se quiera copiar los rangos de la hoja activa de una hoja a otra ejecutariamos la macro siguiente: Option Explicit Dim f, c Public Sub CopiarRango() ActiveCell.CurrentRegion.Select f = ActiveCell.Row c = ActiveCell.Column Selection.Copy Sheets(Hoja2).Activate Cells(f, c).Activate ActiveSheet.Paste End Sub Cerrar libro Excel (guardar cambios) ActiveWorkbook.Close ActiveWorkbook.Close Savechanges:=True ActiveWorkbook.Close(True) Cerrar libro Excel (sin guardar cambios)

ActiveWorkbook.Close(False) ActiveWorkbook.Close Savechanges:=False Cerrar libro Excel (variable, sin guardar cambios) Application.DisplayAlerts = False Windows(Libro_mayor).Close Application.DisplayAlerts = True Abrir libro Excel (ruta fija) Workbooks.Open FileName:=C:\Trabajo\Informe.xls Desplazarnos a la ltima hoja del libro Sub ultima_hoja() Sheets(Sheets.Count).Select End Sub Desplazarnos a la primera hoja del libro Sub primera_hoja() Sheets(1).Select End Sub Copiar el contenido seleccionado en otra hoja Sub CopiaColumnas() Dim mirango As Range Dim col As Range Dim NuevaHoja As Worksheet Dim i As Integer Set mirango = Selection Worksheets.Add i=0 For Each col In mirango.Columns col.Copy ActiveSheet.Range(A1).Offset(, i) i=i+1 Next col End Sub Macro para crear ndices de hojas en libros Private Sub Worksheet_Activate() Dim cHoja As Worksheet Dim L As Long L=1 With Me .Columns(1).ClearContents .Cells(1, 1) = INDICE .Cells(1, 1).Name = Indice End With For Each cHoja In Worksheets

If cHoja.Name <> Me.Name Then L=L+1 With cHoja .Range(A1).Name = Inicio & cHoja.Index .Hyperlinks.Add Anchor:=.Range(A1), Address:= , SubAddress:=Indice, TextToDisplay:=Volver al ndice End With Me.Hyperlinks.Add Anchor:=Me.Cells(L, 1), Address:= , SubAddress:=Inicio & cHoja.Index, TextToDisplay:=cHoja.Name End If Next cHoja End Sub Macro para imprimir hoja activa con datos Sub macro imprimir_ha() Range(A1) = Lo que sea Imprimimos la hoja de excel con una sola copia ActiveWindow.SelectedSheets.PrintOut Copies:=1 End Sub Buscar la ltima fila vaca Sub ultimafila() variable donde almacenamos el nmero de fila Dim ultima As Long vamos subiendo por la columna A desde la ltima fila ultima = Range(A65536).End(xlUp).Row le sumamos una porque queremos la 1 fila vaca ultima = ultima + 1 seleccionamos si queremos otra columna cambiar el nmero Cells(ultima, 1).Select End Sub Encontrar ltima fila (en columna especificada) Dim intUltimaFila As Range If WorksheetFunction.CountA(Columns(1)) > 0 Then Set intUltimaFila = Range(65536).End(xlUp) MsgBox intUltimaFila.Address End If Suprimir filas vacas intLastRow = Columns(A:A).Range(A65536).End(xlUp).Row For r = intLastRow To 1 Step -1 If Application.CountA(Rows(r)) = 0 Then Rows(r).Delete Next r Suprimir filas vacas

Dim intNumDeFilas As Long Selection.SpecialCells(xlCellTypeLastCell).Select intNumDeFilas = Selection.Row For i = 1 To intNumDeFilas If Application.WorksheetFunction.CountA(Rows(i)) = 0 Then Rows(i).Delete End If Next Suprimir filas vacas intUltimaFila = ActiveSheet.UsedRange.Row 1 + ActiveSheet.UsedRange.Rows.Count For r = intUltimaFila To 1 Step -1 If Application.CountA(Rows(r)) = 0 Then Rows(r).Delete Next r Suprimir filas por condicin Dim rngString As Range Do Set rngString = Cells.Find(Aglis, MatchCase:=False, _ LookAt:=xlPart, LookIn:=xlValues) If Not rngString Is Nothing Then rngString.EntireRow.Delete End If Loop Until rngString Is Nothing Suprimir filas vacas por dos condicines X, Y For i = intUltimaFila To 1 Step -1 Let strTest= Application.Cells(i, 2) If strTest <> X And strTest <> Y Then Rows(i).Delete Next i

Mtodos abreviados de teclado en Excel

Lmites de Excel

Nmero total de columnas disponibles en Excel.



Lmite Excel 2003: 256 (2^8) Lmite Excel 2007: 16.384 (2^14)

Nmero total de filas disponibles en Excel.


Lmite Excel 2003: 65.536 (2^16) Lmite Excel 2007: el 1.048.576 (2^20)

Las celdas por hoja es la multiplicacin de las filas por las columnas. Un libro puede tener un nmero variable de hojas, segn nuestras necesidades. El lmite estaba en 256 y est ahora en 1024.

Nmero total de hojas disponibles en Excel.



Lmite Excel 2003: 256 (2^8) Lmite Excel 2007: 1.024 (2^10)

Cantidad total de memoria del PC que Excel puede utilizar.


Lmite Excel 2003: 1GB. Lmite Excel 2007: 2 GB.

Nmero de colores nicos permitido en un solo libro de trabajo.


Lmite Excel 2003: 56 (color puesto en un ndice)

Lmite Excel 2007: 4.294.967.296 (casi 4300 millones, color 32-bit)

Nmero de condiciones condicionales del formato en una celda.


Lmite Excel 2003: 3 condiciones Lmite Excel 2007: Limitado por memoria disponible

Nmero de niveles para ordenar en una lista o una tabla.


Lmite Excel 2003: 3 Lmite Excel 2007: 64

Nmero de datos mostrados en el Autofiltro.


Lmite Excel 2003: 1.000 Lmite Excel 2007: 10.000

Nmero total de caracteres que puede exhibir una celda.


Lmite Excel 2003: 1.024 (cuando se ajusta a formato el texto) Lmite Excel 2007: 32.768 o tanto como quepa en la celda (sin importar el formato)

Nmero de caracteres por celda que el Excel puede imprimir.


Lmite Excel 2003: 1.024 Lmite Excel 2007: 32.768

Nmero total de los estilos nicos de la celda en un libro de trabajo (combinaciones de todo el formato de la celda).

Lmite Excel 2003: 4000 Lmite Excel 2007: 65.536

Longitud mxima de frmulas (en caracteres).


Lmite Excel 2003: carcteres 1.024 Lmite Excel 2007: carcteres 8.192

Nmero de niveles de anidacin que Excel permite en frmulas.


Lmite Excel 2003: 7 Lmite Excel 2007: 64

Nmero mximo de discusiones a una funcin.


Lmite Excel 2003: 30 Lmite Excel 2007: 255

Nmero mximo de artculos que encuentra el comando buscar todos.


Lmite Excel 2003: ~64k (65472) Lmite Excel 2007: ~2 mil millones

Nmero de filas permitidos en una tabla dinmica.


Lmite Excel 2003: 65.536 Lmite Excel 2007: 1.048.576

Nmero de columnas permitidoen una tabla dinmica.


Lmite Excel 2003: 255 Lmite Excel 2007: 16.384

Nmero mximo de artculos nicos dentro de un solo campo de una tabla dinmica.

Lmite Excel 2003: 32.768 Lmite Excel 2007: 1.048.576

Longitud del nombre de MDX para un artculo de una tabla dinmica; tambin la longitud de la secuencia para una tabla dinmica emparentada.

Lmite Excel 2003: 255 caracteres Lmite Excel 2007: 32.768

Longitud a la cual se truncan los campos que etiquetan una tabla dinmica; esto tambin incluye limitaciones de la longitud del subttulo.

Lmite Excel 2003: 255 Lmite Excel 2007: 32.768

El nmero de campos (segn lo visto en la lista del campo) que una sola tabla dinmica puede tener.

Lmite Excel 2003: 255 Lmite Excel 2007: 16.384

Nmero de celdas que pueden depender de un solo rango antes que Excel necesite hacer clculos completos en vez de clculos parciales (porque no puede seguir las dependencias requeridas para hacer clculos parciales).

Lmite Excel 2003: 8.192 Lmite Excel 2007: Limitado por memoria disponible

El nmero de rangos diversos en una hoja que pueden tener dependencias antes de que Excel necesite hacer clculos completos en vez de clculos parciales (porque no puede seguir las dependencias requeridas para hacer clculos parciales).

Lmite Excel 2003: 65.536 Lmite Excel 2007: Limitado por memoria disponible

Nmero de frmulas en conjunto en una hoja de trabajo que pueden referir a otra hoja de trabajo.

Lmite Excel 2003: 65.536 Lmite Excel 2007: Limitado por memoria disponible

Nmero de categoras que las funciones personalizadas pueden encapsular.


Lmite Excel 2003: 32 Lmite Excel 2007: 255

Nmero de caracteres que se pueden actualizar en una referencia externa que no pertenece al libro de trabajo.

Lmite Excel 2003: 255 Lmite Excel 2007: 32.768

Nmero de filas de una o varias columnas que se pueden referir en una frmula matricial (array formula).

Lmite Excel 2003: 65.335 Lmite Excel 2007: No hay lmites.

Nmero de caracteres que se pueden almacenar y exhibir en una celda ajustada a formato de texto.

Lmite Excel 2003: 255 Lmite Excel 2007: 32.768

Macro que elimina las barras de desplazamiento

Sub elimina_barra() With ActiveWindow .DisplayHorizontalScrollBar = False .DisplayVerticalScrollBar = False End With End Sub Macro que protege el libro y la hoja Sub proteger() ActiveWorkbook.Protect Password:=1234 Sheets(Hoja1).Protect Password:=1234 End Sub Calculo del NIF Esta funcin calcula el NIF (Nmero de Identificacin Fiscal). Function nif(dni As Long) As String nif = Mid(TRWAGMYFPDXBNJZSQVHLCKE, (dni Mod 23) + 1, 1) End Function

You might also like