VBA de Excel Basico

58
Introducción a VBA de Excel VBA (Visual Basic for Applications) es un lenguaje de macros utilizado para programar pequeñas aplicaciones dentro de un documento Excel, permitiendo la ampliación de la funcionalidad del mismo. ¡Aprende a programar macros Excel! VBA es una modalidad adaptada del conocido lenguaje de programación Visual Basic, incluida en la mayoría de las aplicaciones MS Office como Excel, Word y Access. Una diferencia entre VBA y Visual Basic es que el programa VBA no se puede separar del documento Excel, sino queda totalmente integrado dentro del libro de trabajo. Esta introducción a Excel VBA te enseñará como empezar a desarrollar tus propias macros Excel. VBA Excel y sus macros constituyen una ayuda potente para particulares y pequeñas y medianas empresas. Excel, y sobre todo la aplicación de macros VBA, mejora prácticamente cualquier proceso de trabajo, desde sencillos cálculos sobre la economía familiar hasta complejos modelos empresariales de Excel para crear informes, presupuestos y demás documentos financieros. ¿Todo el mundo puede aprender a programar macros? Si, sin duda. Mucha gente empieza por la grabación de macros, es decir grabar una secuencia de comandos, para luego reutilizarla. Un buen ejemplo es "Pegar - Valores", uno de los comandos VBA más utilizados. Luego se pasa a una programación VBA mas compleja para buscar soluciones más íntegras. ¿Qué es VBA? VBA significa Visual Basic for Applications. Es un lenguage de programación que surge de Visual Basic (VB). Se podría decir que es un dialecto de VB. VBA de Excel está adaptado a Excel, para trabajar con celdas, hojas, autofiltro etc (es decir, los objetos de la aplicación Excel). ¿Puedo acceder a VBA? Sí. VBA está incluido en el Excel 'normal y corriente'. Se instala con Excel por defecto.

Transcript of VBA de Excel Basico

Page 1: VBA de Excel Basico

Introducción a VBA de Excel

VBA (Visual Basic for Applications) es un lenguaje de macros utilizado para programar pequeñas aplicaciones dentro de un documento Excel, permitiendo la ampliación de la funcionalidad del mismo.

¡Aprende a programar macros Excel!

VBA es una modalidad adaptada del conocido lenguaje de programación Visual Basic, incluida en la mayoría de las aplicaciones MS Office como Excel, Word y Access. Una diferencia entre VBA y Visual Basic es que el programa VBA no se puede separar del documento Excel, sino queda totalmente integrado dentro del libro de trabajo.

Esta introducción a Excel VBA te enseñará como empezar a desarrollar tus propias macros Excel. VBA Excel y sus macros constituyen una ayuda potente para particulares y pequeñas y medianas empresas.

Excel, y sobre todo la aplicación de macros VBA, mejora prácticamente cualquier proceso de trabajo, desde sencillos cálculos sobre la economía familiar hasta complejos modelos empresariales de Excel para crear informes, presupuestos y demás documentos financieros.

¿Todo el mundo puede aprender a programar macros?

Si, sin duda. Mucha gente empieza por la grabación de macros, es decir grabar una secuencia de comandos, para luego reutilizarla. Un buen ejemplo es "Pegar - Valores", uno de los comandos VBA más utilizados. Luego se pasa a una programación VBA mas compleja para buscar soluciones más íntegras.

¿Qué es VBA?

VBA significa Visual Basic for Applications. Es un lenguage de programación que surge de Visual Basic (VB). Se podría decir que es un dialecto de VB. VBA de Excel está adaptado a Excel, para trabajar con celdas, hojas, autofiltro etc (es decir, los objetos de la aplicación Excel).¿Puedo acceder a VBA?Sí. VBA está incluido en el Excel 'normal y corriente'. Se instala con Excel por defecto.

¿Porqué VBA?VBA sirve para muchas cosas. Imagínate todas las tareas repetitivas que tienes que ejecutar todos los días. Un ejemplo - siempre vas aplicando el mismo formato a un grupo de celdas de un libro que te mandan todos los días. En vez de hacer un monton de clicks para obtener este formato, puedes automatizar el proceso, a un boton, o un atajo de teclado.

También puedes crear aplicaciones que importan datos desde el libro mayor, reorganizan los datos, y crean informes personalizados para cada departamento. Casi no hay límites.

Page 2: VBA de Excel Basico

VBA de Excel te permite interactuar no solo con otros libros Excel, sino con todos los programas Office, como Access, Word etc (menos InfoPath que forma parte del Office 2003).

Origen de VBAEs de Microsoft, y surge de BASIC (Beginner´s All-purpose Symbolic Instruction Code, o Código de Instrucciones Simbólicas de Uso General para Principiantes), el cual en su turno es un lenguage que tiene muchos años ya (desde los años sesenta).

¿Existen varios VBAs?VBA existe para todas las aplicaciones de Microsoft Office, y estas se llaman 'host aplicacions'. Así que hay VBA para Excel, otro para Word etc. Cada VBA se parece al resto, pero también tienen diferencias, por servir distintos 'host aplications'. Excel utiliza, por supuesto, VBA para Excel.El editor VBA de Excel

El editor VBA sirve para controlar y manipular tu código VBA, tanto de macros como de completas aplicaciones VBA y add-ins. Todo parece mucho a Visual Basic, con la diferencia de que VBA tiene otros objetos (hoja, celda etc)/métodos/eventos.

Contenido de un proyectoEn la columna de izquierda tenemos las piezas que forman parte del proyecto. En este ejemplo tenemos dos libros abiertos:

Libro1.xls y Personal add-ins.xla (este segundo es un Add-in/Complemento).Excel

ObjetosEste Libro y las hojas del libro

Módulos Contenedores para el código del proyectoFormularios Tus propios formularios, con controles (botones, menús... +

código

A la derecha vemos el marcado del Objetos/Módulos/Formularios.

Page 3: VBA de Excel Basico

Qué es una macro

Definiciones

La definición más común de una macro es que se trata de un pequeño programa que sirve para automatizar tareas repetitivas. Normalmente se guarda en el mismo libro Excel en cual se va a ejecutar, pero se puede guardar en otros libros Exel, tanto como en libros Add-in.

Cuando ese programa crezca, podrá empezar a llamarse programa. Pero si hablamos de un programita que sirve para ejecutar sencillas, repetitivas tareas, debemos llamarlo macro.

El nombre macro vendrá de 'macro-instrucciones' que así se llamaban antes. Supongo que se referirían a 'instrucciones que iban más allá de los menús'.

¿Para qué sirven las macros?Para cualquier trabajo realizado en Excel, prácticamente. Puedes automatizar procesos, importaciones de Access, dar un formato predefinido (por ti) a las celdas seleccionadas, atajo para mandar el último Pívot de Excel a Outlook...Cómo grabar una macro Excel VBA

Para aprender a programar VBA de Excel la mejor manera de empezar es probablemente la grabación de macros en Excel. Es fácil grabar tus propias macros. Y con un ligero retoque, salen todavía mejor.

Preparar la grabaciónEntra Herramientas - Macro - Grabar nueva macro.

Nombre de la macro

Pon un nombre descriptivo, por ejemplo DosDecimales. Si quieres espacio entre palabras, pon Dos_Decimales.

Método abreviado

(atajo)

Si quieres que la macro se active desde el teclado, pon la combinación, por ejemplo CTRL + L. Presionando

MAYUSCULA te darán todavía más combinaciones. Guardar macro

enO se guarda en Este Libro, o en Libro de Macros

Personales. Si eliges Libro de Macros Personales, la macro

Page 4: VBA de Excel Basico

va a estar disponible desde cualquier libro de Excel. Descripción Si quieres puedes poner un texto explicativo el cual se

incluirá en el código de la macro.Presiona OK. Ahora la macro grabará todo lo que pase a tu libro de Excel. Si seleccionas celda H1, esa misma acción se grabará. Después, al ejecutar la macro, esa celda se seleccionará (¡sorpresa...!). Entonces, mientras grabas, selecciona celda H1, cambia el formato a Número - 2 decimales. Paramos la grabación.

Editar la macro grabadaEntra el VBA editor (Herramientas- Macro - Visual Basic Editor).

Entra Módulos - Módulo 1. A la derecha se ve lo que VBA te ha grabado. El código hace que Excel selecione celda H1, y que luego aplique un formato de número de dos decimales. Es decir, la macro solo actuará sobre la celda H1.

Al cambiar el código un poco podremos hacer que VBA cambie el formato a cualquier celda que tengas seleccionada. Limpia el código para que quede el siguiente marcado.

Selection.NumberFormat = "0.00"Ejecutar la macroAhora, vuelve a la hoja, y prueba tú nueva macro. Selecciona un rango de celdas, aplica el atajo (CTRL+L). También puedes ejecutar la macro desde Herramientas - Macro - Macros.Macros personales en Excel

¿Qué son las macros personales?Son macros que están accesibles desde cualquier libro Excel. Estas macros se guardan en un libro especial llamado Personal.xls (Libro de Macros Personales).

Al abrir Excel, este libro se cargará, ocultamente. De este modo, las macros que grabes allí siempre estarán accesibles. Ideal para tus propios atajos, cómo por ejemplo Separador de miles, Pegar valor etc.

Sobre el libro Personal.xlsEs un libro Excel normal y corriente, pero con unas características especiales.

»  Tiene el nombre de Personal.xls»  Contiene código VBA para tus macros, funciones etc.»  Se carga automáticamente al iniciar Excel

Page 5: VBA de Excel Basico

»  Tiene el atributo Hidden (escondido) activado (Ventana - Mostrar)»  Se guarda en uno de estos sitios (normalmente)

c:\Program Files\Microsoft Office\Office\InicioXL (XLStart)

c:\Documents and Settings\ -user name- \Application Data\Microsoft\Excel\InicioXL

¿Cómo se crea el libro Personal.xls?Hay dos maneras de crear este libro.

1. Por tu cuenta:Crea un libro nuevo, guardalo en la carpeta InicioXL indicado arriba, vuelves a Excel para luego ocultarlo (Ventana - Ocultar). Luego, para colocar macros dentro de tu nuevo libro, puedes introducirlas manualmente (editor VBA) o grabar una macro nuevo y guardarla dentro del Libro de Macros personales. Para grabar una macro ver Grabar una macro.

2. Dejar que Excel te ayude:Al grabar una macro indicas donde guardarla. Si eliges Libro de macros personales, Excel creará el libro Personal.xls en la carpeta InicioXL. Para grabar una macro ver Grabar una macro.

Alternativas a macros personalesEn vez de colocar tus macros en el Libro de Macros Personales, puedes crear un Add-in (Complemento). Este es un libro [.xla] que se carga cada vez que abres Excel (igual que el Libro de Macros Personales), que no está ocultado pero tampoco visible.

Page 6: VBA de Excel Basico

VBA Variables

Enlace DescripciónTipos de variables Referencia de variablesDeclarar variables La importancia de declarar las

variables.Tipos de variables

Abajo presentamos los más frecuentes tipos de variable de Excel VBA.Tipo Bytes Descripción ComentarioByte 1 0-255 Integrales

positivosBoolean 1 True/False Valores discretosInteger 2 -32.768 hasta + ... Integrales

Long (long int.) 4 -2.147.483.648 hasta + ... IntegralesSingle 4 -3,402823 E38 hasta + ... DecimalesDouble 8 -1,79769313486232 E308 hasta

+ ... Decimales

Currency 8 15 díg. + 4 decimales Número, 4 dec.Date 8 1-ene-100 hasta 31-dic-9999 Fechas

Object 4 referencia a objetos Ej. "Workbook"String 10+ carácteres Ascii (texto) Texto

String (long. fija)

1+ carácteres Ascii, longitud predef. Texto

Variant 16+ cualquier tipo de datos Cubre la mayoría

Declarar variables

¿Porqué declarar variables?

El código saldrá más estructuradoSi no declaras un variable, no sabrás que tipo de datos contendrá.

Es más seguro - evitarás errores tipográficosVBA te ayudará a poner los nombres correctos. Si no, un error tipográfico puede parar el programa.

El código trabajará más eficazVariables no declaradas serán tratatos como Variants, las cuales ocupan mucha más memoria.

Te ayudará a programarVBA te ayuda a elegir propiedades/métodos que corresponden a esa variable.

Declarar variablesUna variable se declara empleando el comando DIM. DIM significa Dimension, y viene del antiguo BASIC. Al declarar, puedes indicar el número de dimensiones que la variable va a tener (ej. guardar números dentro de una variable, en 3 dimensiones).

Page 7: VBA de Excel Basico

Para que sea más fácil leer el código, pon un indicador en el nombre de la variable. Así basta con leer el nombre de la variable para saber de que tipo es. Puede ser str para String, int para Integer etc.

Una alternativa al DIM es Public. La variable será accesible desde todas partes de tú proyecto VBA.

Poner nombres explicativosIntenta poner nombres explicativos a las variables.

Dim strCodigoPostal as StringDim datFechaRecogida as DateEl nombre puede tener hasta 254 carácteres (por supuesto demasiado...). No puede empezar con una cifra. Algunos nombres son reservados para VBA/Excel, la cual te notificará al ejecutar.

¿Donde poner las declaraciones?VBA te deja declarar casi en cualquier sitio del código. No obstante, la posición puede dar resultados distintos. Por eso es recomendable seguir unas normas.

Tipo de declaración

Ubicación Accesible

Dim Encima del procedimiento (antes del primer Sub)

Todos los procedimientos del módulo.

Dim Antes de un procedimiento específico.

Ese procedimiento .

Dim Dentro de un procedimiento. Resto de ese procedimiento.Public Encima del procedimiento

(antes del primer Sub)Todos los procedimientos (de

todos los módulos).

Page 8: VBA de Excel Basico

VBA bucles Intro

Para qué sirven los buclesLos bucles sirven para repetir instrucciones varias veces. A lo mejor tienes una columna en Excel con 25.000 nombres, y quieres sacar las personas cuyos apellidos empieza con "Lo". En este caso se puede emplear un bucle que evalua todos estos nombres según el criterio "Lo", uno por uno.

Hay dos tipos generales de bucles:

Bucles Do... LoopRepite las instrucciones mientras/hasta etc. una condición es TRUE/VERDADERO.

Do while... LoopRepite las instrucciones mientras una condición es TRUE/VERDADERO.

Do until... LoopRepite las instrucciones hasta que una condición se convierta en TRUE/VERDADERO.

While... WendIgual al bucle Do while... Loop.

Bucles For... NextRepite las instrucciones un número especificado de veces.

For i... NextRepite las instrucciones i veces.Do While... Loop /While... Wend

Instrucción que repite las instrucciones mientras una condición es TRUE/VERDADERO.

EjemploExcel tiene valores en las celdas B1:B100. Quieres buscar la primera celda que tenga un valor más alto/igual que 1,50.

i = 1

Do While Cells(i, 2) <> "" f Cells(i, 1) >= 1.5 Then Exit Do i = i + 1Loop

MsgBox "El valor se encontró en fila no. " & i

Page 9: VBA de Excel Basico

i = la línea donde empezamos el bucle. Ponemos i = 1. Cells(i, 2) significará línea i (=1), columna 2. Es decir celda B1. Al final del bucle, i nos dará la línea que buscamos.

Do While Cells(i, 2) <> "" significa que queremos que un bucle siga hasta que no hayan más celdas con valores en esta columna.

Aplicamos la condición a cada celda, para luego salir del bucle (Exit Do) si encuentra un valor igual a ó más alto que 1,50 (VBA utiliza punto en vez de coma para decimales).

Al final devolvemos un Messagebox para presentar el resultado.Do until... Loop

Instrucción que repite las instrucciones hasta que una condición se convierta en TRUE/VERDADERO.

EjemploUna hoja Excel tiene datos (en este caso nombres) en las celdas A1:A5. Queremos que el bucle pare en "Alexis".  A B1 Alberto  2 Alejandro  3 Alex  4 Alexis  5 Allain  6    

i = 1

Do Until Cells(i, 1) = "Alexis" i = i + 1Loop

MsgBox "El nombre Alexis se encontró en la línea " & ii = la línea donde empezamos el bucle. Ponemos i = 1. Cells(i, 1) significará línea i (=1), columna 1.

Es decir celda A1. Al final del bucle, i nos dará la línea que buscamos.

Do Until Cells(i, 1) = "Alexis" significa que queremos que un bucle que siga hasta que se encuentre el texto "Alexis".

Al final presentamos una caja de diálogo para presentar el resultado, cual en este caso sería 4.For i... Next

Esta instrucción se repite el número de veces (i) que tú indicas.

Page 10: VBA de Excel Basico

EjemploCreamos un bucle sencillo. Queremos que se repita 4 veces, y que la variable intValor (al empezar = 1) se incremente con 2 cada vuelta. Este nos da el resultado intValor = 9 (1+2+2+2+2).

Observa que el bucle tiene step 1. Esto significa que i se incrementa con 1 cada vuelta. Esto es, que si queremos un bucle que vaya para atrás, pondríamos step -1.

intValor = 1For i = 1 to 4 step 1intValor = intValor + 2Next i

Inicio VBA Bucles For Each... Next

For Each... Next

Instrucción que repite las instrucciones según el número de objetos especificados. Por ejemplo, For each Cell de un rango en Excel.

EjemploEn este ejemplo vamos a construir un bucle que evalua cada celda de un rango. El rango será celdas A1:A5, que se escribe como Range(Cells(1, 1), Cells(5, 1). Con el Exit For salimos del bucle al cumplir la condición.

Dim rngArea

rngArea = Range(Cells(1, 1), Cells(5, 1))

For Each Cell In rngArea If Cell = "Alexis" Then MsgBox "¡Encontró Alexis" Exit For End IfNext

Page 11: VBA de Excel Basico

VBA Excel - ejemplos prácticos de macros

Una de las utilidades principales de VBA es la de automatizar tareas cotidianas, como por ejemplo crear un atajo (del teclado) para la función de 'Pegar como valor' en Excel. Estas pequeñas aplicaciones suelen denominarse 'macros', pero Excel VBA también sirve para la programación de aplicaciones más complejas, como servicios de bases de datos y la manipulación de archivos.

Ejemplos de macros VBA de ExcelEsta lista de ejemplos VBA de Excel recopila algunas pequeñas aplicaciones de código VBA. Recuerda - haz una copia de seguridad antes de aplicar código VBA a tus archivos.

Excel y otros programas

Abrir Excel desde VB Método para abrir-copiar-modificar-cerrar Excel desde VB.

Marcador de teléfono Cómo marcar el teléfono desde Excel (API).Importar texto de Word a Excel Aplicamos la función 'Create Object' de VBA

para importar textos desde Word.Macro para pegar celdas Excel

en tabla WordMandar celdas Excel a una tabla nuevo de

Word.Importar celdas de Excel a

ExcelADO de Excel VBA nos deja conectar con

otro libro Excel para importar datos.

Excel y bases de datos

Access a Excel (ADO) Importar (ADO) una tabla Access a Excel.Crear/modificar archivo de

textoCódigo VBA - archivo de texto como base de

datos.Importar dBase IV a Excel Importar una base de datos dBase IV a una

hoja Excel.Abrir archivo de texto en Excel Ejemplo VBA cómo abrir archivos planos en

Excel.

Excel y Outlook

Excel por e-mail Mandar hoja Excel por e-mail.Importar datos de Outlook a

ExcelImportar datos de Outlook a Excel. (VBA)

Libros y hojas Excel

Libros Libros, hojas etc.Hojas Código para insertar y ordenar las hojas

Excel .Formatos Formatear celdas en Excel (VBA).

Filas VBA: Trabajar con filas.Columnas VBA: Trabajar con columnas.

Page 12: VBA de Excel Basico

Repasar archivos/carpeta Método VBA Excel para repasar varios archivos de una carpeta.

Exportar Excel a Visual BasicExcel permite la exportación de datos a un montón de aplicaciones como de Visual Basic, bases de datos, XML etc. Es este ejemplo Excel presentamos una solución para pasar datos desde celdas Excel a una variable Visual Basic.

En concreto vamos a hacer lo siguiente:

Abrimos un archivo Excel desde VB

Leemos el contenido del archivo Excel

Pasamos el contenido Excel a una variable Visual Basic

Por último Cerramos la hoja de cálculo

Configuraciones Excel/Visual BasicPara que esto funcione, Visual Basic necesitará cargar los objetos de Excel. Por eso, no olvides marcar Microsoft Excel x.xx Object Library en tu Visual Basic - Proyecto/Referencias

Código Visual Basic para importar datos Excel

Private Sub LeerExcel()

'dimensionesDim xlApp As Excel.ApplicationDim xlLibro As Excel.WorkbookDim xlHoja As Excel.WorksheetDim varMatriz As VariantDim lngUltimaFila As Long

'abrir programa ExcelSet xlApp = New Excel.Application'xl.Visible = True

'abrir el archivo Excel(archivo en otra carpeta)Set xlLibro = xlApp.Workbooks.Open _("c:\Fax2.xls", True, True, , "")

'abrir el archivo Excel(archivo en la misma carpeta)Set xlLibro = xlApp.Workbooks.Open(App.Path & _"\Fax2.xls", True, True, , "")Set xlHoja = xlApp.Worksheets("Hoja1")

Page 13: VBA de Excel Basico

'1. Si conoces el rango a leer'varMatriz = xlHoja.Range("A1:C10").Value

'2. Si no conoces el rangolngUltimaFila = _Columns("A:A").Range("A65536").End(xlUp).Row

varMatriz = xlHoja.Range(Cells(1, 1), _Cells(lngUltimaFila, 1))

'utilizamos los datos...Text1.Text = varMatriz(27, 1)

'cerramos el archivo ExcelxlLibro.Close SaveChanges:=FalsexlApp.Quit

'reset variables de los objetosSet xlHoja = NothingSet xlLibro = NothingSet xlApp = Nothing

End Sub

Marcar el teléfono desde Excel

Resumen

Si tu pc está equipado con módem podrás realizar llamadas desde Excel, teniendo el número en una

lista.

A través de una API (instrucción Windows) podemos hacer que Excel arranque el Marcador

Telefónico.

Para usar tienes que marcar la celda con el nº, y luego dar marcar.

Page 14: VBA de Excel Basico

ConfiguracionesHay una parte del código, que se puede configurar, por si alguien quiere llamar desde un lugar

donde se trabaja con una central telefonica. Generalmente para tomar una linea te pide que

marques el (0).

PhoneCall "0" + strNumero, strNombre

Si tienes linea diecta, debes quitar "0".

PhoneCall strNumero, strNombre

El código

'

Option ExplicitPrivate Declare Function tapiRequestMakeCall _Lib "TAPI32.DLL" _(ByVal Dest As String, _ByVal AppName As String, _ByVal CalledParty As String, _ByVal Comment As String) As Long

Private Sub PhoneCall(sNumber As String, sName As String)Dim lRetVal As LonglRetVal = tapiRequestMakeCall(Trim$(sNumber), _"Marcando", Trim$(sName), "")If lRetVal <> 0 ThenEnd IfEnd Sub

Public Sub MarcarTelefono()Dim strNumero As StringDim strNombre As StringstrNombre = ActiveCell.ValuestrNumero = ActiveCell.Offset(0, 1).Value

PhoneCall "0" + strNumero, strNombre

End Sub

Page 15: VBA de Excel Basico

Objecto Application de Excel VBAEl objeto Application de VBA nos da información del usuario/máquina. En este artículo

presentaremos unas aplicaciones del un objeto muy básico de Excel/VBA: Application. Este

representa todo el conjunto del programa Excel y sus libros de trabajo.

Unos ejemplos de propiedades del objeto ApplicationEl objeto Application tiene muchas propiedades. Hay unas que pueden ser interesantes para el programador de macros VBA de Excel.

Objeto Propiedad DevuelveApplication. UserName Nombre del usuario

OrganizationName Nombre de la empresaOperatingSystem Sistema operativo

Version Versión de MS ExcelProductCode Código de MS ExcelStandardFont Fuente por defecto

StandardFontSize Tamaño fuente por defectoDecimalSeparator Carácter separador de miles

ActivePrinter Impresora por defectoDefaultFilePath Ruta de acceso por defectoUserLibraryPath Ruta a carpeta Add-ins

Sobre la versión de MS Excel arriba:Nº Versión12 Excel 200711 Excel 200310 Excel 2002 ("XP")9 Excel 20008 Excel 977 Excel 95

Determinar idioma del usuario desde

Excel VBA

[a partir de Excel 2000]

Este marcado sirve para averiguar el idioma de Excel del usuario. La función

Application.International de Excel VBA nos ayuda.

Lo único es que hay que saber los marcadores de telefonía de los países para descodificar la

respuesta de la función. Ver por ejemplo esta lista aquí.

El código

Sub DeterminarPais()CodigoPais = Application.International(xlCountryCode)If CodigoPais = 1 Then MsgBox ("Hello")ElseIf CodigoPais = 34 Then MsgBox ("Hola")End IfEnd Sub

Page 16: VBA de Excel Basico

VBA y libros Excel

Cerrar libro Excel (guardar cambios)

ActiveWorkbook.CloseActiveWorkbook.Close Savechanges:=TrueActiveWorkbook.Close(True)

Cerrar libro Excel (sin guardar cambios)

ActiveWorkbook.Close(False)ActiveWorkbook.Close Savechanges:=False

Cerrar libro Excel (variable, sin guardar cambios)

Application.DisplayAlerts = FalseWindows(Libro_mayor).CloseApplication.DisplayAlerts = True

Abrir libro Excel (ruta fija)

Workbooks.Open FileName:="C:\Trabajo\Informe.xls"

Abrir libro Excel (diálogo)

Msg = MsgBox("Elija archivo para abrir.", vbOKOnly, (""))strArchivo = Application.GetOpenFilenameOn Error GoTo 99Workbooks.OpenText Filename:=strArchivoIf strArchivo = "" Then Exit SubstrArchivo = ActiveWindow.Caption99:Exit sub

Devolver nombre del libro Excel

strNombre = ActiveSheet.Parent.FullNameMsgBox ActiveWorkbook.FullName

VBA y hojas Excel

Nombre de la hoja (variable)

'asigna nombre variable a la hoja a variablestrHoja = ActiveWindow.CaptionWindows(strHoja).Activate 'para activar el libro del nombre asignado

Insertar hoja nueva (elegir posición)

ActiveWorkbook.Sheets.Add Before:=Worksheets("Informe1")

Insertar hoja nueva (primera posición)

Sheets("Informe1").Copy After:=Worksheets(Worksheets.Count)

Mover hoja

Worksheets("informe5").Move After:=Worksheets("Informe4")

Ordenar hojas (orden alfabético)

Page 17: VBA de Excel Basico

intNumeroHojas = ActiveWorkbook.Worksheets.CountFor i = 1 To intNumeroHojasFor j = i To intNumeroHojasIf LCase(Worksheets(j).Name) < LCase(Worksheets(i).Name) ThenWorksheets(j).Move Before:=Worksheets(i)End IfNext jNext i

Suprimir una hoja 'Informe'

Application.DisplayAlerts = FalseFor i = 1 To Sheets.CountSheets(i).Activatexxx = ActiveCell.Worksheet.NameIf xxx = "Informe" ThenActiveWindow.SelectedSheets.DeleteEnd IfNextApplication.DisplayAlerts = True

Seleccionar primera hoja

ActiveWindow.ScrollWorkbookTabs Position:=xlFirst

Seleccionar última hoja

ActiveWindow.ScrollWorkbookTabs Position:=xlLast

Scrollrow - Imagen fija a un costado de la

pantalla

Si queremos que el usuario vea una imagen en el costado superior izquierdo de la pantalla, esté

donde esté en la hoja, podemos aplicar el siguiente código.

Trata de utilizar la propiedad SCROLLROW, que nos da la celda superior izquierdo de la pantalla

visible. Y SCROLLCOLUMN de la columna por supuesto. Luego insertamos un comentario, en la

cual ponemos una imagen y un poco de texto.

El resultado será algo como

El código

Page 18: VBA de Excel Basico

Private Sub Worksheet_SelectionChange(ByVal Target As Range)Dim strRuta As StringDim intRowActual, intColumnActual As DoubleDim intRow, intColumn As Double

'ruta a imagenstrRuta = "C:\imagen.jpg"

'fila/columna actualintRowActual = ActiveCell.RowintColumnActual = ActiveCell.Column

'fila/columna de scrollRowintRow = ActiveWindow.ScrollRow + 1intColumn = ActiveWindow.ScrollColumn

'insertamos comentarioCells.ClearCommentsWith Cells(intRow, intColumn).AddComment.Comment.Text Text:="Hola".Comment.Visible = TrueEnd With

'añadimos imagen al comentarioCells(intRow, intColumn).Comment.Shape.Select TrueSelection.ShapeRange.Fill.UserPicture strRuta

'aparcamos en celda actualCells(intRowActual, intColumnActual).Select

End Sub

VBA para proteger ciertas hojas de un

libro ExcelCon la ayuda de un truco de VBA de Excel puedes permitir que el usuario solo pueda abrir

por ejemplo la primera hoja (sin palabra de paso) - pero no las otras (cuales requieren palabra de

paso). Esta función no está integrada en Excel (sorprendentemente), por eso hay que recurrir a

VBA.

Eventos empleados para la protecciónPara esto vamos a utilizar el evento Workbook_SheetActivate, un evento que salta cada vez que

alguna hoja se active. Es decir, el evento se activará cuando el usuario hace click sobre una etiqueta

de una hoja. Si la hoja forma parte de las restringidas, Excel pedirá palabra de paso. Al introducir

una palabra de paso erronea, se queda en la hoja anterior.

Grado de seguridad de la macro para proteger hojasCualquier persona puede entrar al código VBA para ver la palabra de paso. Por eso debes proteger

el codigo (VBA editor - Click derecho sobre EsteLibro - Propiedades).

Este método no da 100% de seguridad. Si activamos la protección de los módulos VBA tenemos

bastante seguridad, pero hay que tener en cuenta que existen varios programas comerciales para

resolver el tema de palabras de paso de Excel.

Los procedimientos

Page 19: VBA de Excel Basico

Pon este código en el contenedor 'EsteLibro' del editor VBA (Herramientas - Macro - Editor VBA).

Luego tienes que poner que hojas/palabra de paso (ver 'Preparar modelo' del código).

Código VBA para proteger hojas Excel

Dim strStartHoja As StringDim strSegundaHoja As StringPrivate Sub Workbook_SheetActivate(ByVal Sh As Object)Dim z As IntegerDim i As IntegerDim x As BooleanDim varHoja As VariantDim varPaso As VariantDim varInput As Variant

'preparar modelo [admin. input]varHoja = Array("Sheet2", "Sheet3") 'las hojas a proteger...varPaso = "gofio" 'palabra de paso... [letras/números]

'desconectar otros Events (evitar un tipo de bucle)Application.EnableEvents = False

'comprobar hojasstrSegundaHoja = Sh.NameFor i = LBound(varHoja) To UBound(varHoja)If varHoja(i) = strSegundaHoja Then x = TrueNext iIf x = False Then GoTo 99

'ocultar la hoja temporalmentez = ActiveWindow.IndexWindows(z).Visible = False

'comparar palabra de pasovarInput = InputBox("Palabra de paso:")If varInput <> varPaso Then Sheets(strStartHoja).Select

'volver a mostrar la hojaWindows(z).Visible = True

99:

'conectar EventsApplication.EnableEvents = True

End Sub

'*************************************************

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)'recordar hoja inicialstrStartHoja = Sh.NameEnd Sub

Inicio VBA Ejemplos

Page 20: VBA de Excel Basico

Crear enlaces a las hojas ExcelSi nuestro libro Excel contiene muchas hojas (hasta 256) convendría hacer una lista de enlaces a

cada hoja. Esto puede ayudar mucho a los 'navegantes' de nuestros libros.

Y como siempre, esta lista se puede crear manualmente. O se puede recurrir a una macro de VBA,

cual tardará al máximo un par de segundos para concluir el trabajo.

ProcedimientoEmpezamos con un libro Excel cualquier, pero que tenga por lo menos dos hojas. Luego vamos a

crear un módulo dentro de este libro. En este módulo escribimos el código.

Crear el móduloEntra a Herramientas - Macros - Editor VBA. A la izquierda ves (si no lo ves CTRL+R) algo como

"ProyectoVBA (Tu libro). Marca ese proyecto. Insertar - Módulo.

Doble click en el módulo nuevo, y a la derecha sale un espacio blanco, es para el código.

Herramientas - Referencias. Marca Microsoft ActiveX DataObjects x.x Library.

Ahora cierras el editor VBA, vuelves a Excel. Guardamos el libro.

El código

Sub Links_hojas()

Dim wrbLibro As WorkbookDim wrsHojaActiva As Worksheet, wsHoja As WorksheetDim intFila, intColumna As Integer

Set wrbLibro = ActiveWorkbookSet wrsHojaActiva = ActiveSheet

'en que fila/columna empezar la listaintFila = 4intColumna = 1

'el bucle repasa todas las hojasFor Each wsHoja In wrbLibro.Worksheets

'para excluir hoja de los linksIf wsHoja.Name = "Hoja4" Then GoTo ProxHoja

'crear linksIf wsHoja.Name <> wrsHojaActiva.Name Then

wrsHojaActiva.HyperLinks.Add wrsHojaActiva.Cells(intFila, intColumna), _"", SubAddress:="'" & wsHoja.Name & "'!A1", _>TextToDisplay:=wsHoja.Name

intFila = intFila + 1End If

ProxHoja:Next wsHoja

End Sub

Ejecutar macroPara ejecutar esta macro entras a Herramientas - Macros. Allí encontrarás la macro

"Conectar_Excel_ADO". Marca esta, y "Ejecutar".

Page 21: VBA de Excel Basico

Macro VBA para eliminar vínculos Excel

Con esta macro podrás eliminar vínculos a otras hojas/libros.

»  Elimina vínculos a otras hojas/libros

»  Referencias dentro de la hoja se mantienen.

»  Los vínculos se convierten en valores.

»  Antes de todo, ¡recuerda hacer una copia de seguridad!

Copia de seguridadGuarda una copia de seguridad de tu libro. Hazlo porque nunca sabes.

Crear el móduloEntra a Herramientas - Macros - Editor VBA. A la izquierda ves (si no lo ves CTRL+R) algo como

"ProyectoVBA (Tu libro). Marca ese proyecto. Insertar - Módulo.

Doble click en el módulo nuevo, y a la derecha sale un espacio blanco, es para el código.

Herramientas - Referencias. Marca Microsoft ActiveX DataObjects x.x Library.

Ahora cierras el editor VBA, vuelves a Excel. Guardamos el libro.

El código

Sub QuitarVinculos()

Dim varVinculo As VariantDim wrsHoja As WorksheetDim objCelda As ObjectDim varMsg As Variant

'(0) Un pequeño controlvarMsg = MsgBox("¿Ha guardado una copia de seguridad?", vbYesNo)If varMsg = 7 Then Exit Sub

'(1) Quitar vínculos externos (a otros libros)varLink = ActiveWorkbook.LinkSources(Type:=xlLinkTypeExcelLinks)If Not IsEmpty(varLink) Then

i = 1Do Until IsEmpty(varLink)On Error GoTo 9ActiveWorkbook.BreakLink Name:=varLink(i), _Type:=xlLinkTypeExcelLinksi = i + 1LoopEnd If9:

'(2) Quitar vínculos internos (a otras hojas)On Error Resume NextFor Each wrsHoja In ActiveWorkbook.Worksheets

For Each objCelda In wrsHoja.UsedRange.SpecialCells(xlCellTypeFormulas, 23)If InStr(objCelda.Formula, "!") Then objCelda.Value = objCelda.ValueNextNext

End Sub

Ejecutar macro

Page 22: VBA de Excel Basico

Para ejecutar esta macro entras a Herramientas - Macros. Allí encontrarás la macro

"Conectar_Excel_ADO". Marca esta, y "Ejecutar".

Macro VBA para crear archivos de cada hoja ExcelCon un mínimo de código vamos a crear archivos independientes de las hojas de un libro. Un

ejemplo sería un libro con 124 hojas, una hoja por empleado, y ahora queremos separar las hojas de

cada colega y crear libros independientes.

ProcedimientoEmpezamos con el libro de una o varias hojas. Luego vamos a crear un módulo dentro de este libro.

En este módulo escribimos el código.

Crear el móduloEntra a Herramientas - Macros - Editor VBA. A la izquierda ves (si no lo ves CTRL+R) algo como

"ProyectoVBA (Tu libro). Marca ese proyecto. Insertar - Módulo.

Doble click en el módulo nuevo, y a la derecha sale un espacio blanco, es para el código.

Herramientas - Referencias. Marca Microsoft ActiveX DataObjects x.x Library.

Ahora cierras el editor VBA, vuelves a Excel. Guardamos el libro.

Código

Sub Crear_archivos_de_hojas()

Dim strHoja, strStartHoja, strRuta As StringDim i As Integer

Application.ScreenUpdating = FalsestrStartHoja = ActiveCell.Worksheet.Name

'bucle todas hojasFor i = 1 To Sheets.Count

'copia la hoja a libro nuevoSheets(i).ActivatestrHoja = ActiveCell.Worksheet.NameSheets(strHoja).Copy

'donde guardar los archivos creadosstrRuta = "C:\excel\vba\ejemplos"

'guarda el libro nuevoActiveWorkbook.SaveAs Filename:=strRuta & "\" & strHoja, _FileFormat:=xlNormal, Password:="", WriteResPassword:="", _ReadOnlyRecommended:=False, CreateBackup:=FalseActiveWindow.Close Savechanges:=True

'repetir bucle'Next

Sheets(strStartHoja).ActivateApplication.ScreenUpdating = True

End Sub

Ejecutar macro

Page 23: VBA de Excel Basico

Para ejecutar esta macro entras a Herramientas - Macros. Allí encontrarás la macro

"Conectar_Excel_ADO". Marca esta, y "Ejecutar".

Columnas de Excel y VBA

Presentamos unas macros para trabajar con columnas Excel desde Excel VBA.

Encontrar última columna (buscar al revés)

Sub EncontrarUltimaColumna()Dim intUltimaCol As Integer

If WorksheetFunction.CountA(Cells) > 0 Then intUltimaCol = Cells.Find(What:="*", After:=[A1], _ SearchOrder:=xlByColumns, _ SearchDirection:=xlPrevious).Column MsgBox intUltimaColEnd IfEnd Sub

Encontrar última columna (en fila especificada)

Sub EncontrarUltimaColumna()Dim intUltimaCol As Range

If WorksheetFunction.CountA(Rows(1)) > 0 Then Set intUltimaCol = Range("IV1").End(xlToLeft) MsgBox intUltimaCol.AddressEnd IfEnd Sub

Suprimir columnas vacías en el rango

Sub SuprimirColumnas()Dim cCount As Integer, c As IntegerDim DeleteRange as Range

DeleteRange =("A1:B10")

If DeleteRange Is Nothing Then Exit Sub'Ejemplo: DeleteEmptyColumns Range("A1:Z1")If DeleteRange.Areas.Count > 1 Then Exit Sub

With DeleteRange cCount = .Columns.Count For c = cCount To 1 Step -1 If Application.CountA(.Columns(c)) = 0 _ Then .Columns(c).EntireColumn.DeleteNext cEnd WithEnd Sub

Suprimir cada n-columnas

Sub SuprimirColumnas()Dim rCount As Long, r As LongDim DeleteRange as range

DeleteRange =("A1:B10")

Page 24: VBA de Excel Basico

If DeleteRange Is Nothing Then Exit SubIf DeleteRange.Areas.Count > 1 Then Exit SubIf n < 2 Then Exit Sub

With DeleteRange cCount = .Columns.Count For c = n To cCount Step n - 1 .Columns(c).EntireColumn.Delete Next cEnd WithEnd Sub

Filtrar con colores en Excel

Marcar encabezado de columnas filtradasEste ejemplo Excel VBA surge en base a que si uno filtra con mucho criterios, pasa que a veces nos

perdemos que columnas tenemos filtrado.

En este caso se utiliza una macro, para que resalte el encabezado de las columnas filtradas.

El usuario tiene la posibilidad de elegir el color que prefiere. En este caso tiene unos ejemplos pero

se puede agregar más colores.

Contenedor del códigoEl código debe ir en el módulo VBA correspondiente a la hoja para filtrar, por utilizar el suceso

Worksheet_Calculate(). Ver ejemplo.

El código

Option Explicit''ayudaexcel@ yahoo.com.ar

Private Sub Worksheet_Calculate()Dim af As AutoFilterDim fFilter As Filter

Page 25: VBA de Excel Basico

Dim iFilterCount As Integer

If ActiveSheet.AutoFilterMode Then Set af = ActiveSheet.AutoFilter iFilterCount = 1 For Each fFilter In af.Filters If fFilter.On Then af.Range.Cells(1, iFilterCount) _ .Interior.ColorIndex = Range("color")Else af.Range.Cells(1, iFilterCount) _ .Interior.ColorIndex = xlNoneEnd If

iFilterCount = iFilterCount + 1 Next fFilterElse Rows(1).EntireRow.Interior.ColorIndex = xlNone End IfEnd Sub

Page 26: VBA de Excel Basico

Filas Excel - macros VBA

Encontrar última fila

intUltimaFila = _ Columns("A:A").Range("A65536").End(xlUp).Row

Encontrar última fila

intUltimaFila = _ ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count

Encontrar última fila

MaxRow = Cells.SpecialCells(xlLastCell).RowMaxCol = Cells.SpecialCells(xlLastCell).Column

Encontrar última celda (buscar al revés)

Dim lngUltimaCelda As LongIf WorksheetFunction.CountA(Cells) > 0 Then lngUltimaCelda = Cells.Find(What:="*", After:=[A1], _ SearchOrder:=xlByRows, _ SearchDirection:=xlPrevious).Row MsgBox lngUltimaCeldaEnd If

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.AddressEnd If

Suprimir filas vacías

intLastRow = Columns("A:A").Range("A65536").End(xlUp).RowFor r = intLastRow To 1 Step -1 If Application.CountA(Rows(r)) = 0 Then Rows(r).DeleteNext r

Suprimir filas vacías

Dim intNumDeFilas As Long

Selection.SpecialCells(xlCellTypeLastCell).SelectintNumDeFilas = Selection.RowFor i = 1 To intNumDeFilas If Application.WorksheetFunction.CountA(Rows(i)) = 0 Then Rows(i).Delete End IfNext

Suprimir filas vacías

Page 27: VBA de Excel Basico

intUltimaFila = _ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.CountFor r = intUltimaFila To 1 Step -1If Application.CountA(Rows(r)) = 0 Then Rows(r).DeleteNext r

Suprimir filas por condición

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 IfLoop Until rngString Is Nothing

Suprimir filas vacías por dos condiciónes X, Y

For i = intUltimaFila To 1 Step -1 Let strTest= Application.Cells(i, 2) If strTest <> "X" And strTest <> "Y" Then Rows(i).DeleteNext i

Page 28: VBA de Excel Basico

El temporizador de Excel VBASi queremos que una instrucción se haga automáticamente, a intervalos fijos, podemos

recurrir al método Application.OnTime.

ProcedimientosVamos a necesitar tres sencillas macros.

1. StartTemporizador - Iniciar el temporizador

2. Tu_Sub - Cualquier instrucción

3. StopTemporizador - Cerrar el temporizador

Luego hacen falta dos botones en la hoja, uno para la macro StartTemporizador, y otro para la

StopTemporizador.

DeclaracionesPor encima de las macros descritas abajo, hacemos las declaraciones.

Public datHora As DatePublic Const conIntervalo = 60 'un minutoPublic Const conRunMacro = "Tu_Sub" 'tu proced.

Iniciar temporizadorLa primera macro inicia el temporizador.

Sub StartTemporizador()datHora = Now + TimeSerial(0, 0, conIntervalo)'iniciar el temporizadorApplication.OnTime _Earliesttime:=datHora, _Procedure:=conRunMacro, _Schedule:=TrueEnd Sub

Tu procedimientoAquí pones lo que quieres que Excel haga periodicamente.

Sub Tu_Sub()MsgBox datHora 'o cualquier instrucción'reiniciar el temporizadorStartTemporizadorEnd Sub

Cerrar temporizadorEl temporizador hay que cerrarlo 'manualmente'.

Sub StopTemporizador()On Error Resume Next'desactivar el temporizadorApplication.OnTime _Earliesttime:=datHora, _Procedure:=conRunMacro, _Schedule:=FalseEnd Sub

Todo el códigoAhora, el módulo de las macros descritas arriba debe tener el siguiente aspecto.

Page 29: VBA de Excel Basico

Public datHora As DatePublic Const conIntervalo = 60 'un minutoPublic Const conRunMacro = "Tu_Sub" 'tu proced.

Sub StartTemporizador()datHora = Now + TimeSerial(0, 0, conIntervalo)'iniciar el temporizadorApplication.OnTime _Earliesttime:=datHora, _Procedure:=conRunMacro, _Schedule:=TrueEnd Sub

Sub Tu_Sub()MsgBox datHora 'o cualquier instrucción'reiniciar el temporizadorStartTemporizadorEnd Sub

Sub StopTemporizador()On Error Resume Next'desactivar el temporizadorApplication.OnTime _Earliesttime:=datHora, _Procedure:=conRunMacro, _Schedule:=FalseEnd Sub

Page 30: VBA de Excel Basico

WAIT - Mostrar un formulario VBA

durante un tiempo predeterminado

Con el método WAIT puedes hacer que un formulario se cierre después de un tiempo determinado.

Esto puede ser útil para presentar información al usuario ('La importación ha terminado con éxito', 'El

archivo está guardado' etc). El truco está en utilizar el método WAIT de VBA.

ProcedimientoCrea un formulario 'frmMensaje' con el mensaje que quieres que aparezca. Añade este código al

formulario. El ejemplo nos dice que la rutina se va a esperar ('Wait') hasta la hora

Now + TimeValue("00:00:04")

Es decir la hora actual más 4 segundos.

Sub Importar_Access()Private Sub UserForm_Activate()Application.Wait Now + TimeValue("00:00:04")frmMensaje.HideEnd Sub

Luego, para mostrar el formulario en cualquier parte de tu programa, aplicas este código.

frmMensaje.Show

En el ejemplo de abajo, el formulario se mostrará al abrir el libro (ponemos el código en el

contenedor de código VBA 'EsteLibro'.

Private Sub Workbook_Open()frmMensaje.ShowEnd Sub

Crear una barra de progreso en Excel

Un ejemplo de una macro VBA de como crear una barra de progreso (progress bar) para incluir en

nuestras aplicaciones y plantillas Excel.

De esta forma podemos añadir un medidor de progreso gráfico a la barra de estado de Excel.

El código

Option Explicit

Sub BarraDeProgreso()

Page 31: VBA de Excel Basico

Dim R As IntegerDim MT As DoubleFor R = 1 To 180 MT = Timer Do Loop While Timer - MT < 0.05 Application.StatusBar = "Progress: " & R & " de 180: " & _ Format(R / 180, "Percent") & " --- " & "Cumplimiento" DoEventsNext RApplication.StatusBar = False

End Sub

Como armar un reloj en Excel (método

OnTime).

Sobre el método de Excel VBA "OnTime"El método OnTime de Excel ejecuta una macro en una hora designada o en intervalos fijos.

Código VBA empleado para el método OnTime

Sub Reloj() Range("A1").Formula = "=NOW()" Application.OnTime Now + TimeValue("00:00:01"), "reloj"End Sub

Sub auto_Open() Call RelojEnd Sub

Imprimir la hora en la hoja ExcelSegún el código VBA descrito arriba, Excel pondrá el tiempo en la celda A1. Para devolver

fragmentos (hora/minuto/segundo), emplea formulas como

= HORA("A1")

= MINUTO("A1")

= SEGUNDO("A1")

Page 32: VBA de Excel Basico

Formatos Excel y VBARedondear celdas

Set Area = SelectionFor Each Cell In Areaz = Round(Cell, 2)Cell.Value = zCell.NumberFormat = "#,##0.00"Next Cell

Formatear fuente

Cells.SelectWith Selection.Font.Name = "MS Sans Serif".Size = 10End With

Líneas de división

ActiveWindow.DisplayGridlines = False

Indice de colores

ActiveWorkbook.Colors(44) = RGB(236, 235, 194) 'verde

Colorear rango

Range("A1:B10").Interior.ColorIndex = 44

Cambiar entre estilos A1 / RC

Application.ReferenceStyle = xlA1Application.ReferenceStyle = xlR1C1

Excel VBA y la paleta de colores

Excel emplea una paleta de 56 colores predefinidos. Puedes cambiar estos colores desde

Herramientas - Opciones - Color o desde código VBA. Abajo presentamos unos ejemplos de código

VBA para modificar la paleta de colores del libro Excel.

Por desgracia, a muchos de nosotros los colores de la hoja Excel predefinidos por Microsoft parecen

bastante fuertes, y a veces hacen que la hoja sea difícil de leer.

Los colores forman parte del diseño del libro, son importantes para una buena presentación de un

informe. Pero por regla general tampoco se debe pasar utilizando demasiado color.

Excel y Colores RGBExcel expresa colores del formato RGB (Red, Green, Blue). Red, Green, Blue son variables cuales

expresan el grado de estos colores, valores entre 1 y 255. Tambien podemos expresar el color en

formato HEX (hexadecimal).

KfmDesign presenta una buena página de Colores RGB y HEX.

Para cambiar entre RGB y HEX necesitamos un Conversor RGB <> HEX.

Page 33: VBA de Excel Basico

Cambiar colores de la paleta ExcelEntonces, ¿qué podemos hacer para que Excel siempre tenga los colores definidos por ti? Una

solución sería crear una plantilla con nuestros formatos. Excel llamará esta plantilla al crear un libro

nuevo.

Otra solución es crear una macro cual nosotros podemos llamar cuando nos convenga. Esto nos da

un poco más de control. En este ejemplo cambiaremos los colores 40 y 41 (de los 56) de la paleta.

ActiveWorkbook.Colors(40) = RGB(234, 234, 234)ActiveWorkbook.Colors(41) = RGB(236, 235, 194)

Código VBA para cambiar colores de celdas ExcelPara cambiar los colores aplicados a una celda ejecutamos una de las siguientes instrucciones.

Selection.Interior.ColorIndex = 40

Selection.Interior.ColorIndex = _xlNone/xlColorIndexAutomatic/xlColorIndexNone

Selection.Interior.Color = RGB(234, 234, 234)

Selection.Interior.Color = ?000066? 'hexadecimal

Resetear paleta de coloresPara resetear los colores a los predefinidos de Excel, aplicamos el método ResetColors.

ActiveWorkbook.ResetColors

Copiar colores de otro libro ExcelTambién se puede copiar (importar) la paleta de otro libro Excel. Para esto cambiamos la propiedad

Colors del libro.

ActiveWorkbook.Colors = Workbooks("C:\MiLibroDeColores.xls").Colors

Devolver colores del libro Excel actualA lo mejor nos interesa saber que color tiene una celda. La propiedad ColorIndex nos ayuda.

i = Cells(1, 1).Interior.ColorIndexMsgBox i

Aplicar colores por condiciones en Excel VBAPodemos colorear celdas por condiciones, evaluando una cadena de texto, por ejemplo.

For Each Item In Intersect(ActiveSheet.UsedRange, Selection.Cells) If Item.Text = "ColaCao" Then Item.Interior.ColorIndex = 44 End IfNext

Buscar fragmento de texto en una lista

La función INSTR nos permite buscar un fragmento de texto en una lista de cadenas de texto. Nos

devuelve la posición dentro de la cadena. Esta cifra es clave: 0 = no coincide, >0 = sí que coincide.

En este ejemplo buscaremos en una lista de apellidos. En el ejemplo abajo, "Aban" nos devuelve

dos apellidos. Otro ejemplo sería 'queiro", c ual nos devolvería Abanquiero.

Page 34: VBA de Excel Basico

Preparamos la hojaEn celdas C5:C12 tenemos la lista en que buscar (celdas D5:D12 también pertenecen a la matriz.

En celda G2 introducimos el criterio.

En celdas G5:H5 el programa pondrá la lista "filtrada", allí no tienes que introducir nada.

Crear el móduloEntra a Herramientas - Macros - Editor VBA. A la izquierda ves (si no lo ves CTRL+R) algo como

"ProyectoVBA (Tu libro). Marca ese proyecto. Insertar - Módulo.

Doble click en el módulo nuevo, y a la derecha sale un espacio blanco, es para el código.

Ejecutar macroPara ejecutar esta macro entras a Herramientas - Macros. Allí encontrarás la macro

"Buscar_Texto_En_Lista()". Marca esta, y "Ejecutar".

Código

Sub Buscar_Texto_En_Lista()

'dimensionesDim lngUltimaFila As LongDim strObjetoBuscar As StringDim lngResultado As LongDim lngColumna As Long, lngFila As LongDim lngPegarColumna As Long, lngPegarFila As LongDim x As Integer, n As Integer

'quitar resultados anterioresRange("G5:H4000").ClearContents

'columna + fila donde empezar/terminar búsquedalngColumna = 2lngFila = 5lngUltimaFila = Columns(lngColumna). _ Range("A65536").End(xlUp).Row

'columna + fila donde empezar a pegar resultadoslngPegarColumna = 6lngPegarFila = 5

Page 35: VBA de Excel Basico

'objeto a buscarstrObjetoBuscar = Range("G2").TextIf strObjetoBuscar = "" Then GoTo 99'minúsculasstrObjetoBuscar = LCase(strObjetoBuscar)

'bucle: realizar búsquedaFor n = lngFila To lngUltimaFila

'evaluación lngResultado = InStr(1, Cells(n, 3), _ strObjetoBuscar, vbTextCompare)

'copiar/pegar If lngResultado > 0 Then Range(Cells(n, 2), Cells(n, 4)).Copy Range( _ Cells(lngPegarFila, lngPegarColumna), _ Cells(lngPegarFila, lngPegarColumna + 2)) _ .Select ActiveSheet.Paste lngPegarFila = lngPegarFila + 1 End If

Next n

'aparcarApplication.CutCopyMode = FalseRange("G2").Select

99:End Sub

Sumar rango variable con VBA ExcelSumar un rango en Excel es fácil. Sumar un rango expresado por una variable en VBA es un

poco más complicado (pero sigue siendo fácil).

No siempre se sabe de antemano que celdas formarán parte del rango a sumar. Entonces tenemos

que expresar el rango de forma variable.

En Excel es fácil sumar este rango mediante una sencilla fórmula. Pero VBA no contiene ninguna

función igual. Entonces hay que hacer que VBA utilice las funciones de Excel.

Utilizar funciones Excel en VBATenemos un rango varSuma, el rango a sumar. Para sumar las celdas de este rango tenemos que

llamar a la función SUM de Excel.

Application.WorksheetFunction.Sum(varSuma)

De esta manera puedes aplicar cualquier fórmula de Excel en VBA, con tal de que empieces la línea

de código con

Application.WorksheetFunction...

Nuestro ejemploEn este ejemplo el rango que nos interesa sumar son los valores correspondientes a "BB", es decir

C8:C13.

Page 36: VBA de Excel Basico

Escribir la suma (en celda)

'el rango a sumarvarSuma = Range(Cells(8, 3), Cells(13, 3))'sumar el rangoCells(1, 1) = Application.WorksheetFunction.Sum(varSuma)

Escribir la suma (variable)

'el rango a sumarvarSuma = Range(Cells(8, 3), Cells(13, 3))'sumar el rangoSUMA = Application.WorksheetFunction.Sum(varSuma)

Messagebox y Excel VBALas messagebox son muy útiles (y fáciles de usar), y crea una interfaz entre el usuario y el

programa. Sirven para

Mostrar información al usuario Recibir información del usuario Devolver información del usuario

Construcción sintáctica de la messagebox

Msgbox "Mensaje", Botones/íconos, "Título"

o en el caso de devolver información

Respuesta = Msgbox("Mensaje", _ Botones/íconos, "Título")

Nota los paréntesis en la segunda construcción.

MensajeCualquier tipo de texto. Para crear un salto de línea empleamos el carácter vbCrLf.

Actualización terminada:" & vbCrLf & _ "- Importación de datos de venta.

Botones

Si quieres puedes añadir cualquier de estos cuatro botones (si no pones nada Excel te pondrá

vbOkOnly por defecto).

Page 37: VBA de Excel Basico

vbOkOnly

vbOkCancel

vbYesNoCancel

vbAbortRetryIgnore

Íconos

Puedes elegir entre los siguientes.

vbCritical

vbQuestion

vbExclamation

vbInformation

Título

Cualquier texto.

Devolver información

Si quieres que el programa utilice la respuesta del usuario, estas son las cifras que te devuelve.

Ok = 1

Cancel = 2

Abort = 3

Retry = 4

Ignore = 5

Yes = 6

No = 7

EjemplosTe ponemos unos ejemplos módelo para que te vayas acostumbrando a las diferentes messagebox.

Sub MessageBox()msgbox "Actualización terminada:", _ vbOKOnly, "Información"End Sub

Sub MessageBox()msgbox "¿Quieres seguir?", vbYesNo, _ "Información importante"End Sub

Page 38: VBA de Excel Basico

Sub MessageBox()Dim intRespuesta As IntegerintRespuesta = msgbox("¿Quieres seguir?", _ vbQuestion + vbYesNo, "Información importante")If intRespuesta = 6 Thenmsgbox "Seguimos"Elsemsgbox "Terminamos"End IfEnd Sub

Sub MessageBox()msgbox "Actualización terminada:" & _ vbCrLf & vbCrLf & _"- Importación de datos de venta." & vbCrLf & _"- Cálculos de impuestos." & vbCrLf & _"- Venta por proveedor." & vbCrLf _, vbOKOnly, "Actualización terminada."End Sub

Sub MessageBox()msgbox "Actualización terminada:" & vbCrLf & _vbCrLf & _"- Importación de datos de venta." & vbCrLf & _"- Cálculos de impuestos." & vbCrLf & _"- Venta por proveedor." & vbCrLf _, vbExclamation + vbOKOnly, _"Actualización terminada."End Sub

Page 39: VBA de Excel Basico
Page 40: VBA de Excel Basico

Calcular los Dígitos de control desde

Excel VBA

En este ejemplo presentamos un ejemplo de marcado VBA para calcular los dígitos de control de

una cuenta bancaria española

¿Qué son los dígitos de control?Las cuentas bancarias españolas consisten de 4 grupos de dígitos. Los dígitos de control verifican

los códigos de Entidad y Oficina (el primer dígito), y el Número de Cuenta (el segundo dígito). El

algoritmo para calcular los dígitos de control se define en Norma bancaria 34 de AEB (Asociación

Española de Banca).

TareaQueremos un programa que nos calcule los dígitos de control de una cuenta.

Un ejemplo de cuenta0123 - 4567 - xx - 0123456789

Entidad 0123Oficina 4567

Dígitos de control XxCuenta 0123456789

En el ejemplo arriba, los dígitos de control serían 81.

EmpezamosAbrimos un libro nuevo. Formateamos las celdas B3:E3 a TEXTO.

Crear el móduloEntra a Herramientas - Macros - Editor VBA. A la izquierda ves (si no lo ves CTRL+R) algo como

"ProyectoVBA (Tu libro). Marca ese proyecto. Insertar - Módulo.

Doble click en el módulo nuevo, y a la derecha sale un espacio blanco, es para el código.

Herramientas - Referencias. Marca Microsoft ActiveX DataObjects x.x Library.

Ahora cierras el editor VBA, vuelves a Excel. Guardamos el libro.

El código

Sub DC_check()

Dim Bank As StringDim Office As StringDim DC As StringDim Account As StringDim BankOffice As String

Page 41: VBA de Excel Basico

Dim Valor1, Valor2, Valor3, Valor4, Valor5DIm Valor6, Valor7, Valor8, Valor9, Valor10Dim TestValue1 As IntegerDim TestValue2 As IntegerDim TestValueDC As Integer'---------------------------------------------------'recoger el número de cuentaBank = Range("B3").TextOffice = Range("C3").TextDC = Range("D3").TextAccount = Range("E3").TextBankOffice = Bank & Office'---------------------------------------------------'evaluar DC (1)Valor1 = (Mid(BankOffice, 1, 1) * 4)Valor2 = (Mid(BankOffice, 2, 1) * 8)Valor3 = (Mid(BankOffice, 3, 1) * 5)Valor4 = (Mid(BankOffice, 4, 1) * 10)Valor5 = (Mid(BankOffice, 5, 1) * 9)Valor6 = (Mid(BankOffice, 6, 1) * 7)Valor7 = (Mid(BankOffice, 7, 1) * 3)Valor8 = (Mid(BankOffice, 8, 1) * 6)

TestValue1 = Valor1 + Valor2 + Valor3 + Valor4 + _Valor5 + Valor6 + Valor7 + Valor8

TestValue1 = (TestValue1 Mod 11)TestValue1 = 11 - TestValue1

If TestValue1 = 10 Then TestValue1 = 1If TestValue1 = 11 Then TestValue1 = 0'---------------------------------------------------'evaluar DC (2)Valor1 = (Mid(Account, 1, 1) * 1)Valor2 = (Mid(Account, 2, 1) * 2)Valor3 = (Mid(Account, 3, 1) * 4)Valor4 = (Mid(Account, 4, 1) * 8)Valor5 = (Mid(Account, 5, 1) * 5)Valor6 = (Mid(Account, 6, 1) * 10)Valor7 = (Mid(Account, 7, 1) * 9)Valor8 = (Mid(Account, 8, 1) * 7)Valor9 = (Mid(Account, 9, 1) * 3)Valor10 = (Mid(Account, 10, 1) * 6)

TestValue2 = Valor1 + Valor2 + Valor3 + Valor4 + Valor5 + _Valor6 + Valor7 + Valor8 + Valor9 + Valor10

TestValue2 = (TestValue2 Mod 11)TestValue2 = 11 - TestValue2

If TestValue2 = 10 Then TestValue2 = 1If TestValue2 = 11 Then TestValue2 = 0'---------------------------------------------------'reconstituir las dos cifras del DCTestValueDC = TestValue1 & TestValue2

'evaluar DC completoIf TestValueDC = DC ThenTest = TrueMsgBox "Correcto."ElseTest = FalseMsgBox "DC no corresponde a esta cuenta." & vbCrLf & _"[en este caso DC sería " & TestValueDC & ".]", vbOKOnly, vbInformationEnd If'---------------------------------------------------

Page 42: VBA de Excel Basico

End Sub

Ejecutar macroPara ejecutar esta macro entras a Herramientas - Macros. Allí encontrarás la macro

"Conectar_Excel_ADO". Marca esta, y "Ejecutar".

Casilla de Verificación (evento Change)

ResumenSe usa el evento change para simular una casilla de verificación, en la columna A, y luego

combinamos con una suma condicional, que que solamente SUMA los meses que se encuentran

tildados.

Un ejemplo realAl hacer clic sobre la columna A, tilda la celda.

Luego se puede aplicar una fórmula matricial y condicional para sumar los meses tildados.

{=SUMA(SI($A$2:$A$13<>"";$C$2:$C$13;0))}

El código

El código debe escribirse en la misma hoja Excel, ver imagen.

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)

Dim aOffset As IntegerOn Error GoTo err_handlerApplication.EnableEvents = False

If Not Application.Intersect _(Target, Columns("A")) Is Nothing Then

Page 43: VBA de Excel Basico

If Target.Column = 4 Then  aOffset = 3Else  aOffset = 2End If

If IsEmpty(Target.Value) Then  With Target   .Font.Name = "Wingdings"   .Value = Chr(252)  End With  Target.Offset(0, iOffset).SelectElse  Target.Value = ""  Target.Offset(0, iOffset).SelectEnd If

End If

err_handler:Application.EnableEvents = True

End Sub

ComentariosPara evitar confusiones (sobre todo si estamos preparando una plantilla para otras colegas),

podríamos optar por la fórmula SUMAPRODUCTO, que además permite aplicar varias condiciones

de una manera fácil.  / Anders J.

=SUMAPRODUCTO((A2:A13<>"")*C2:C13)

Explorador de informes

Resumen de este ejemplo de "Explorador de informes"Este ejemplo nos nuestra, de cómo armar un explorador de informes en Excel, manejándonos desde

un Panel Principal. Esto nos permite dar una mejor estética a cualquier aplicación desarrollada en

Excel.

La importancia del formato Excel de presentación

Como hemos ido comentando en otros ejemplos de Excel y VBA de este sitio, la presentación de los

libros Excel es algo muy importante, sobre todo si trata de informes para distribuir.

Captura de pantalla de esta plantilla Excel

Instrucciones

Page 44: VBA de Excel Basico

Encontrarás un ejemplo real del

Explorador de archivos Excel en la carpeta de este curso en el servidor de UGA

Para ver el código utilizado, combine las siguientes Teclas:ALT + F11.

Page 45: VBA de Excel Basico

Importar tabla Access a Excel

Aquí explicamos cómo importar una tabla de una base de datos Access, a una hoja Excel.

Esta maniobra también puede realizarse desde los menús del propio programa Access. ¿Pero qué

pasa si tenemos que acceder a un archivo Access, y no tenemos el programa Access instalado?

Entonces podemos recurrir al código VBA, y programar una macro.

Además, esta importación tarda poquísimo - muy interesante si importamos muchas tablas al día.

El código

Sub Importar_Access()

'dimensionesDim datConnection As ADODB.ConnectionDim recSet As ADODB.RecordsetDim strDB, strSQL As StringDim strTabla As StringDim lngTablas As LongDim i As Long

'elegir uno de estas dos rutas al archivo AccessstrDB = ThisWorkbook.Path & "\" & "db.mdb"'strDB = "C:\vba\db.mdb" 'si en otra carpeta

'nombre de la tabla del archivo AccessstrTabla = "salarios_2003"

'crear la conexiónSet datConnection = New ADODB.ConnectionSet recSet = New ADODB.RecordsetdatConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _"Data Source =" & strDB & ";"

'consulta SQLstrSQL = "SELECT * FROM " & strTabla & ""recSet.Open strSQL, datConnection'copiar datos a la hojaActiveSheet.Cells(2, 1).CopyFromRecordset recSet

'copiar rótuloslngCampos = recSet.Fields.Count For i = 0 To lngCampos - 1 ActiveSheet.Cells(1, i + 1).Value = recSet.Fields(i).Name Next

'desconectarrecSet.Close: Set recSet = NothingdatConnection.Close: Set datConnection = Nothing

End Sub

Page 46: VBA de Excel Basico

Importar datos de Outlook a Excel

Con VBA de Excel podemos contactar con Outlook para devolver datos. En este ejemplo vamos a

importar algunos datos de los Contactos.

Objetos utilizadosPara contactar con Outlook desde Excel podemos utilizar el objeto GetNameSpace de la MAPI -

Messaging Application Programming Interface.

Luego, el método GetDefaultFolder nos deja acceder a las carpetas de Outlook, por ejemplo el de los Contactos.Parámetro Carpeta

3 Deleted Items (Elementos elimindos)4 Outbox (Bandeja de salida)5 Sent Items (Elementos enviados)6 Inbox (Bandeja de entrada)9 Calendar (Calendario)

10 Contacts (Contactos)11 Journal (Diario)12 Notes (Notas)13 Tasks (Tareas)16 Drafts (Borrador)

El código

Sub ImportarContactos()

Dim olApp As Outlook.ApplicationDim olContacts As Outlook.MAPIFolderDim olContact As Outlook.ContactItemDim i As Integer

Set olApp = New Outlook.ApplicationSet olContacts = olApp.GetNamespace("MAPI").GetDefaultFolder(olFolderContacts)

'rotulosCells(1, 1) = "Nombre"Cells(1, 2) = "E-mail"Cells(1, 3) = "Título"Cells(1, 4) = "Empresa"Cells(1, 5) = "Tel (casa)"Cells(1, 6) = "Tel (móbil)"Cells(1, 7) = "Tel (trabajo)"Cells(1, 8) = "Fax (trabajo)"Cells(1, 9) = "Dir. (empresa)"Cells(1, 10) = "Postal (empresa)"Cells(1, 11) = "Ciudad (empresa)"Cells(1, 12) = "País (empresa)"Cells(1, 13) = "Dir. (casa)"Cells(1, 14) = "Postal (casa)"Cells(1, 15) = "Ciudad (casa)"Cells(1, 16) = "País (Casa)"

'importar contact itemsFor i = 2 To olContacts.Items.CountIf TypeOf olContacts.Items.Item(i) Is _Outlook.ContactItem ThenSet olContact = olContacts.Items.Item(i)Cells(i, 1) = olContact.FullNameCells(i, 2) = olContact.Email1AddressCells(i, 3) = olContact.JobTitle

Page 47: VBA de Excel Basico

Cells(i, 4) = olContact.CompanyNameCells(i, 5) = olContact.HomeTelephoneNumberCells(i, 6) = olContact.MobileTelephoneNumberCells(i, 7) = olContact.BusinessTelephoneNumberCells(i, 8) = olContact.BusinessFaxNumberCells(i, 9) = olContact.BusinessAddressStreetCells(i, 10) = olContact.BusinessAddressPostalCodeCells(i, 11) = olContact.BusinessAddressCityCells(i, 12) = olContact.BusinessAddressCountryCells(i, 13) = olContact.HomeAddressStreetCells(i, 14) = olContact.HomeAddressPostalCodeCells(i, 15) = olContact.HomeAddressCityCells(i, 16) = olContact.HomeAddressCountryEnd IfNext

'eliminar variables de los objetosSet olContact = NothingSet olContacts = NothingSet olApp = Nothing

'ordenar lista por NombreCells.Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlGuess

End Sub

Enviar hoja Excel por correo electrónico (Outlook etc.)ResumenEste truco sirve para enviar una hoja Excel por mail, utilizando Outlook u otro sistema de correo

instalado en el ordenador del usuario.

El código

'

Sub Mail_ActiveSheet()Dim wb As WorkbookDim strdate As StringDim stEmail As Stringstrdate = Format(Now, "dd-mm-yy h-mm-ss")strEmail = "[email protected]"Application.ScreenUpdating = FalseActiveSheet.CopySet wb = ActiveWorkbookWith wb  .SaveAs ThisWorkbook.Name & " " & strdate & ".xls"  .SendMail strEmail, "Archivo Adjunto"  .ChangeFileAccess xlReadOnly  Kill .FullName  .Close FalseEnd WithApplication.ScreenUpdating = TrueEnd Sub

Configuraciones Hay que indicar la dirección a utilizar.

strEmail = "[email protected]"