Beruflich Dokumente
Kultur Dokumente
dentro de un documento Excel, permitiendo la ampliacin de la funcionalidad del mismo. Aprende a programar macros Excel! VBA es una modalidad adaptada del conocido lenguaje de programacin Visual Basic, incluida en la mayora 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 introduccin a Excel VBA te ensear como empezar a desarrollar tus propias macros Excel. VBA Excel y sus macros constituyen una ayuda potente para particulares y pequeas y medianas empresas. Excel, y sobre todo la aplicacin de macros VBA, mejora prcticamente cualquier proceso de trabajo, desde sencillos clculos sobre la economa familiar hasta complejos modelos empresariales de Excel para crear informes, presupuestos y dems documentos financieros. Todo el mundo puede aprender a programar macros? Si, sin duda. Mucha gente empieza por la grabacin de macros, es decir grabar una secuencia de comandos, para luego reutilizarla. Un buen ejemplo es "Pegar - Valores", uno de los comandos VBA ms utilizados. Luego se pasa a una programacin VBA mas compleja para buscar soluciones ms ntegras. Qu es VBA? VBA significa Visual Basic for Applications. Es un lenguage de programacin que surge de Visual Basic (VB). Se podra 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 aplicacin 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. Imagnate todas las tareas repetitivas que tienes que ejecutar todos los das. Un ejemplo - siempre vas aplicando el mismo formato a un grupo de celdas de un libro que te mandan todos los das. En vez de hacer un monton de clicks para obtener este formato, puedes automatizar el proceso, a un boton, o un atajo de teclado. Tambin puedes crear aplicaciones que importan datos desde el libro mayor, reorganizan los datos, y crean informes personalizados para cada departamento. Casi no hay lmites.
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 VBA Es de Microsoft, y surge de BASIC (Beginners All-purpose Symbolic Instruction Code, o Cdigo de Instrucciones Simblicas de Uso General para Principiantes), el cual en su turno es un lenguage que tiene muchos aos ya (desde los aos 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 tambin 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 cdigo 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)/mtodos/eventos. Contenido de un proyecto En 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). Este Libro y las hojas del libro Excel Objetos Contenedores para el cdigo del proyecto Mdulos Tus propios formularios, con controles (botones, mens... + Formularios cdigo
Qu es una macro Definiciones La definicin ms comn de una macro es que se trata de un pequeo 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 referiran a 'instrucciones que iban ms all de los mens'. Para qu sirven las macros? Para cualquier trabajo realizado en Excel, prcticamente. Puedes automatizar procesos, importaciones de Access, dar un formato predefinido (por ti) a las celdas seleccionadas, atajo para mandar el ltimo Pvot de Excel a Outlook... Cmo grabar una macro Excel VBA Para aprender a programar VBA de Excel la mejor manera de empezar es probablemente la grabacin de macros en Excel. Es fcil grabar tus propias macros. Y con un ligero retoque, salen todava mejor. Preparar la grabacin Entra Herramientas - Macro - Grabar nueva macro.
Pon un nombre descriptivo, por ejemplo DosDecimales. Si quieres espacio entre palabras, pon Dos_Decimales. Si quieres que la macro se active desde el teclado, pon la combinacin, por ejemplo CTRL + L. Presionando MAYUSCULA te darn todava ms combinaciones. O se guarda en Este Libro, o en Libro de Macros Personales. Si eliges Libro de Macros Personales, la macro va a estar
disponible desde cualquier libro de Excel. Descripcin Si quieres puedes poner un texto explicativo el cual se incluir en el cdigo de la macro. Presiona OK. Ahora la macro grabar todo lo que pase a tu libro de Excel. Si seleccionas celda H1, esa misma accin se grabar. Despus, al ejecutar la macro, esa celda se seleccionar (sorpresa...!). Entonces, mientras grabas, selecciona celda H1, cambia el formato a Nmero - 2 decimales. Paramos la grabacin. Editar la macro grabada Entra el VBA editor (Herramientas- Macro - Visual Basic Editor).
Entra Mdulos - Mdulo 1. A la derecha se ve lo que VBA te ha grabado. El cdigo hace que Excel selecione celda H1, y que luego aplique un formato de nmero de dos decimales. Es decir, la macro solo actuar sobre la celda H1. Al cambiar el cdigo un poco podremos hacer que VBA cambie el formato a cualquier celda que tengas seleccionada. Limpia el cdigo para que quede el siguiente marcado. Selection.NumberFormat = "0.00" Ejecutar la macro Ahora, vuelve a la hoja, y prueba t nueva macro. Selecciona un rango de celdas, aplica el atajo (CTRL+L). Tambin puedes ejecutar la macro desde Herramientas - Macro - Macros. Macros personales en Excel Qu son las macros personales? Son macros que estn 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 estarn accesibles. Ideal para tus propios atajos, cmo por ejemplo Separador de miles, Pegar valor etc. Sobre el libro Personal.xls Es un libro Excel normal y corriente, pero con unas caractersticas especiales. Tiene el nombre de Personal.xls Contiene cdigo VBA para tus macros, funciones etc. Se carga automticamente al iniciar Excel
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 Cmo 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 personales En 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.
VBA Variables Enlace Descripcin Tipos de Referencia de variables variables Declarar variables La importancia de declarar las variables. Tipos de variables Abajo presentamos los ms frecuentes tipos de variable de Excel VBA. Tipo Bytes Descripcin Comentario 1 0-255 Integrales Byte positivos 1 True/False Valores discretos Boolean 2 -32.768 hasta + ... Integrales Integer 4 -2.147.483.648 hasta + ... Integrales Long (long int.) 4 -3,402823 E38 hasta + ... Decimales Single 8 -1,79769313486232 E308 hasta + Decimales Double ... 8 15 dg. + 4 decimales Nmero, 4 dec. Currency 8 1-ene-100 hasta 31-dic-9999 Fechas Date 4 referencia a objetos Ej. "Workbook" Object 10+ carcteres Ascii (texto) Texto String 1+ carcteres Ascii, longitud predef. Texto String (long. fija) 16+ cualquier tipo de datos Cubre la mayora Variant Declarar variables Porqu declarar variables? El cdigo saldr ms estructurado Si no declaras un variable, no sabrs que tipo de datos contendr. Es ms seguro - evitars errores tipogrficos VBA te ayudar a poner los nombres correctos. Si no, un error tipogrfico puede parar el programa. El cdigo trabajar ms eficaz Variables no declaradas sern tratatos como Variants, las cuales ocupan mucha ms memoria. Te ayudar a programar VBA te ayuda a elegir propiedades/mtodos que corresponden a esa variable. Declarar variables Una variable se declara empleando el comando DIM. DIM significa Dimension, y viene del antiguo BASIC. Al declarar, puedes indicar el nmero de
dimensiones que la variable va a tener (ej. guardar nmeros dentro de una variable, en 3 dimensiones). Para que sea ms fcil leer el cdigo, 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 explicativos Intenta poner nombres explicativos a las variables. Dim strCodigoPostal as String Dim datFechaRecogida as Date El nombre puede tener hasta 254 carcteres (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 cdigo. No obstante, la posicin puede dar resultados distintos. Por eso es recomendable seguir unas normas. Tipo de Ubicacin Accesible declaracin Encima del procedimiento Todos los procedimientos del Dim (antes del primer Sub) mdulo. Antes de un procedimiento Ese procedimiento . Dim especfico. Dentro de un procedimiento. Resto de ese procedimiento. Dim Encima del procedimiento Todos los procedimientos (de Public (antes del primer Sub) todos los mdulos).
Para qu sirven los bucles Los 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 segn el criterio "Lo", uno por uno. Hay dos tipos generales de bucles: Bucles Do... Loop Repite las instrucciones mientras/hasta etc. una condicin es TRUE/VERDADERO. Do while... Loop Repite las instrucciones mientras una condicin es TRUE/VERDADERO. Do until... Loop Repite las instrucciones hasta que una condicin se convierta en TRUE/VERDADERO. While... Wend Igual al bucle Do while... Loop. Bucles For... Next Repite las instrucciones un nmero especificado de veces. For i... Next Repite las instrucciones i veces. Do While... Loop /While... Wend
Instruccin que repite las instrucciones mientras una condicin es TRUE/VERDADERO. Ejemplo Excel tiene valores en las celdas B1:B100. Quieres buscar la primera celda que tenga un valor ms alto/igual que 1,50. i = 1 Do While Cells(i, 2) <> "" f Cells(i, 1) >= 1.5 Then Exit Do i = i + 1 Loop MsgBox "El valor se encontr en fila no. " & i
i = la lnea donde empezamos el bucle. Ponemos i = 1. Cells(i, 2) significar lnea i (=1), columna 2. Es decir celda B1. Al final del bucle, i nos dar la lnea que buscamos. Do While Cells(i, 2) <> "" significa que queremos que un bucle siga hasta que no hayan ms celdas con valores en esta columna. Aplicamos la condicin a cada celda, para luego salir del bucle (Exit Do) si encuentra un valor igual a ms 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
Instruccin que repite las instrucciones hasta que una condicin se convierta en TRUE/VERDADERO. Ejemplo Una hoja Excel tiene datos (en este caso nombres) en las celdas A1:A5. Queremos que el bucle pare en "Alexis". A B 1 Alberto 2 Alejandro 3 Alex 4 Alexis 5 Allain 6
i = 1 Do Until Cells(i, 1) = "Alexis" i = i + 1 Loop MsgBox "El nombre Alexis se encontr en la lnea " & i i = la lnea donde empezamos el bucle. Ponemos i = 1. Cells(i, 1) significar lnea i (=1), columna 1. Es decir celda A1. Al final del bucle, i nos dar la lnea 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 dilogo para presentar el resultado, cual en este caso sera 4. For i... Next Esta instruccin se repite el nmero de veces (i) que t indicas.
Ejemplo Creamos 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 atrs, pondramos step -1.
intValor = 1 For i = 1 to 4 step 1 intValor = intValor + 2 Next i Inicio VBA Bucles For Each... Next For Each... Next
Instruccin que repite las instrucciones segn el nmero de objetos especificados. Por ejemplo, For each Cell de un rango en Excel. Ejemplo En 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 condicin. 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 If Next
VBA Excel - ejemplos prcticos 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 funcin de 'Pegar como valor' en Excel. Estas pequeas aplicaciones suelen denominarse 'macros', pero Excel VBA tambin sirve para la programacin de aplicaciones ms complejas, como servicios de bases de datos y la manipulacin de archivos. Ejemplos de macros VBA de Excel Esta lista de ejemplos VBA de Excel recopila algunas pequeas aplicaciones de cdigo VBA. Recuerda - haz una copia de seguridad antes de aplicar cdigo VBA a tus archivos. Excel y otros programas Mtodo para abrir-copiar-modificar-cerrar Excel desde VB. Marcador de telfono Cmo marcar el telfono desde Excel (API). Importar texto de Word a Excel Aplicamos la funcin 'Create Object' de VBA para importar textos desde Word. Macro para pegar celdas Excel Mandar celdas Excel a una tabla nuevo de en tabla Word Word. Importar celdas de Excel a ADO de Excel VBA nos deja conectar con otro Excel libro Excel para importar datos. Excel y bases de datos Access a Excel (ADO) Crear/modificar archivo de texto Importar dBase IV a Excel Abrir archivo de texto en Excel Importar (ADO) una tabla Access a Excel. Cdigo VBA - archivo de texto como base de datos. Importar una base de datos dBase IV a una hoja Excel. Ejemplo VBA cmo abrir archivos planos en Excel. Excel y Outlook Excel por e-mail Importar datos de Outlook a Excel Mandar hoja Excel por e-mail. Importar datos de Outlook a Excel. (VBA) Abrir Excel desde VB
Libros y hojas Excel Libros Hojas Formatos Filas Columnas Libros, hojas etc. Cdigo para insertar y ordenar las hojas Excel . Formatear celdas en Excel (VBA). VBA: Trabajar con filas. VBA: Trabajar con columnas.
Repasar archivos/carpeta
Exportar Excel a Visual Basic Excel permite la exportacin de datos a un montn de aplicaciones como de Visual Basic, bases de datos, XML etc. Es este ejemplo Excel presentamos una solucin 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 clculo
Configuraciones Excel/Visual Basic Para 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 Cdigo Visual Basic para importar datos Excel Private Sub LeerExcel() 'dimensiones Dim xlApp As Excel.Application Dim xlLibro As Excel.Workbook Dim xlHoja As Excel.Worksheet Dim varMatriz As Variant Dim lngUltimaFila As Long 'abrir programa Excel Set 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")
'1. Si conoces el rango a leer 'varMatriz = xlHoja.Range("A1:C10").Value '2. Si no conoces el rango lngUltimaFila = _ 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 Excel xlLibro.Close SaveChanges:=False xlApp.Quit 'reset variables de los objetos Set xlHoja = Nothing Set xlLibro = Nothing Set xlApp = Nothing End Sub
Configuraciones
Hay una parte del cdigo, 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
El cdigo
'
Option Explicit Private 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 Long lRetVal = tapiRequestMakeCall(Trim$(sNumber), _ "Marcando", Trim$(sName), "") If lRetVal <> 0 Then End If End Sub Public Sub MarcarTelefono() Dim strNumero As String Dim strNombre As String strNombre = ActiveCell.Value strNumero = ActiveCell.Offset(0, 1).Value PhoneCall "0" + strNumero, strNombre End Sub
El cdigo
Sub DeterminarPais() CodigoPais = Application.International(xlCountryCode) If CodigoPais = 1 Then MsgBox ("Hello") ElseIf CodigoPais = 34 Then MsgBox ("Hola") End If End Sub
Mover hoja
Worksheets("informe5").Move After:=Worksheets("Informe4")
intNumeroHojas = ActiveWorkbook.Worksheets.Count For i = 1 To intNumeroHojas For j = i To intNumeroHojas If LCase(Worksheets(j).Name) < LCase(Worksheets(i).Name) Then Worksheets(j).Move Before:=Worksheets(i) End If Next j Next i
El cdigo
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim strRuta As String Dim intRowActual, intColumnActual As Double Dim intRow, intColumn As Double 'ruta a imagen strRuta = "C:\imagen.jpg" 'fila/columna actual intRowActual = ActiveCell.Row intColumnActual = ActiveCell.Column 'fila/columna de scrollRow intRow = ActiveWindow.ScrollRow + 1 intColumn = ActiveWindow.ScrollColumn 'insertamos comentario Cells.ClearComments With Cells(intRow, intColumn) .AddComment .Comment.Text Text:="Hola" .Comment.Visible = True End With 'aadimos imagen al comentario Cells(intRow, intColumn).Comment.Shape.Select True Selection.ShapeRange.Fill.UserPicture strRuta 'aparcamos en celda actual Cells(intRowActual, intColumnActual).Select End Sub
Los procedimientos
Pon este cdigo en el contenedor 'EsteLibro' del editor VBA (Herramientas - Macro - Editor VBA). Luego tienes que poner que hojas/palabra de paso (ver 'Preparar modelo' del cdigo).
Dim strStartHoja As String Dim strSegundaHoja As String Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim z As Integer Dim i As Integer Dim x As Boolean Dim varHoja As Variant Dim varPaso As Variant Dim varInput As Variant 'preparar modelo [admin. input] varHoja = Array("Sheet2", "Sheet3") 'las hojas a proteger... varPaso = "gofio" 'palabra de paso... [letras/nmeros] 'desconectar otros Events (evitar un tipo de bucle) Application.EnableEvents = False 'comprobar hojas strSegundaHoja = Sh.Name For i = LBound(varHoja) To UBound(varHoja) If varHoja(i) = strSegundaHoja Then x = True Next i If x = False Then GoTo 99 'ocultar la hoja temporalmente z = ActiveWindow.Index Windows(z).Visible = False 'comparar palabra de paso varInput = InputBox("Palabra de paso:") If varInput <> varPaso Then Sheets(strStartHoja).Select 'volver a mostrar la hoja Windows(z).Visible = True 99: 'conectar Events Application.EnableEvents = True End Sub '************************************************* Private Sub Workbook_SheetDeactivate(ByVal Sh As Object) 'recordar hoja inicial strStartHoja = Sh.Name End Sub
Procedimiento
Empezamos con un libro Excel cualquier, pero que tenga por lo menos dos hojas. Luego vamos a crear un mdulo dentro de este libro. En este mdulo escribimos el cdigo.
Crear el mdulo
Entra a Herramientas - Macros - Editor VBA. A la izquierda ves (si no lo ves CTRL+R) algo como "ProyectoVBA (Tu libro). Marca ese proyecto. Insertar - Mdulo. Doble click en el mdulo nuevo, y a la derecha sale un espacio blanco, es para el cdigo.
Herramientas - Referencias. Marca Microsoft ActiveX DataObjects x.x Library.
El cdigo
Sub Links_hojas() Dim wrbLibro As Workbook Dim wrsHojaActiva As Worksheet, wsHoja As Worksheet Dim intFila, intColumna As Integer Set wrbLibro = ActiveWorkbook Set wrsHojaActiva = ActiveSheet 'en que fila/columna empezar la lista intFila = 4 intColumna = 1 'el bucle repasa todas las hojas For Each wsHoja In wrbLibro.Worksheets 'para excluir hoja de los links If wsHoja.Name = "Hoja4" Then GoTo ProxHoja 'crear links If wsHoja.Name <> wrsHojaActiva.Name Then wrsHojaActiva.HyperLinks.Add wrsHojaActiva.Cells(intFila, intColumna), _ "", SubAddress:="'" & wsHoja.Name & "'!A1", _> TextToDisplay:=wsHoja.Name intFila = intFila + 1 End If ProxHoja: Next wsHoja End Sub
Ejecutar macro
Para ejecutar esta macro entras a Herramientas - Macros. All encontrars la macro "Conectar_Excel_ADO". Marca esta, y "Ejecutar".
Copia de seguridad
Guarda una copia de seguridad de tu libro. Hazlo porque nunca sabes.
Crear el mdulo
Entra a Herramientas - Macros - Editor VBA. A la izquierda ves (si no lo ves CTRL+R) algo como "ProyectoVBA (Tu libro). Marca ese proyecto. Insertar - Mdulo. Doble click en el mdulo nuevo, y a la derecha sale un espacio blanco, es para el cdigo.
Herramientas - Referencias. Marca Microsoft ActiveX DataObjects x.x Library.
El cdigo
Sub QuitarVinculos() Dim Dim Dim Dim varVinculo As Variant wrsHoja As Worksheet objCelda As Object varMsg As Variant
'(0) Un pequeo control varMsg = MsgBox("Ha guardado una copia de seguridad?", vbYesNo) If varMsg = 7 Then Exit Sub '(1) Quitar vnculos externos (a otros libros) varLink = ActiveWorkbook.LinkSources(Type:=xlLinkTypeExcelLinks) If Not IsEmpty(varLink) Then i = 1 Do Until IsEmpty(varLink) On Error GoTo 9 ActiveWorkbook.BreakLink Name:=varLink(i), _ Type:=xlLinkTypeExcelLinks i = i + 1 Loop End If 9: '(2) Quitar vnculos internos (a otras hojas) On Error Resume Next For Each wrsHoja In ActiveWorkbook.Worksheets For Each objCelda In wrsHoja.UsedRange.SpecialCells(xlCellTypeFormulas, 23) If InStr(objCelda.Formula, "!") Then objCelda.Value = objCelda.Value Next Next End Sub
Ejecutar macro
Para ejecutar esta macro entras a Herramientas - Macros. All encontrars la macro "Conectar_Excel_ADO". Marca esta, y "Ejecutar".
Procedimiento
Empezamos con el libro de una o varias hojas. Luego vamos a crear un mdulo dentro de este libro. En este mdulo escribimos el cdigo.
Crear el mdulo
Entra a Herramientas - Macros - Editor VBA. A la izquierda ves (si no lo ves CTRL+R) algo como "ProyectoVBA (Tu libro). Marca ese proyecto. Insertar - Mdulo. Doble click en el mdulo nuevo, y a la derecha sale un espacio blanco, es para el cdigo.
Herramientas - Referencias. Marca Microsoft ActiveX DataObjects x.x Library.
Cdigo
Sub Crear_archivos_de_hojas() Dim strHoja, strStartHoja, strRuta As String Dim i As Integer Application.ScreenUpdating = False strStartHoja = ActiveCell.Worksheet.Name 'bucle todas hojas For i = 1 To Sheets.Count 'copia la hoja a libro nuevo Sheets(i).Activate strHoja = ActiveCell.Worksheet.Name Sheets(strHoja).Copy 'donde guardar los archivos creados strRuta = "C:\excel\vba\ejemplos" 'guarda el libro nuevo ActiveWorkbook.SaveAs Filename:=strRuta & "\" & strHoja, _ FileFormat:=xlNormal, Password:="", WriteResPassword:="", _ ReadOnlyRecommended:=False, CreateBackup:=False ActiveWindow.Close Savechanges:=True 'repetir bucle' Next Sheets(strStartHoja).Activate Application.ScreenUpdating = True End Sub
Ejecutar macro
Para ejecutar esta macro entras a Herramientas - Macros. All encontrars la macro "Conectar_Excel_ADO". Marca esta, y "Ejecutar".
Sub EncontrarUltimaColumna() Dim intUltimaCol As Integer If WorksheetFunction.CountA(Cells) > 0 Then intUltimaCol = Cells.Find(What:="*", After:=[A1], _ SearchOrder:=xlByColumns, _ SearchDirection:=xlPrevious).Column MsgBox intUltimaCol End If End Sub
If DeleteRange Is Nothing Then Exit Sub If DeleteRange.Areas.Count > 1 Then Exit Sub If n < 2 Then Exit Sub With DeleteRange cCount = .Columns.Count For c = n To cCount Step n - 1 .Columns(c).EntireColumn.Delete Next c End With End Sub
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 ms colores.
El cdigo
Option Explicit ' 'ayudaexcel@ yahoo.com.ar Private Sub Worksheet_Calculate() Dim af As AutoFilter Dim fFilter As Filter
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 = xlNone End If iFilterCount = iFilterCount + 1 Next fFilter Else Rows(1).EntireRow.Interior.ColorIndex = xlNone End If End Sub
intUltimaFila = _ Columns("A:A").Range("A65536").End(xlUp).Row
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
Procedimientos
Vamos a necesitar tres sencillas macros. 1. StartTemporizador - Iniciar el temporizador 2. Tu_Sub - Cualquier instruccin 3. StopTemporizador - Cerrar el temporizador Luego hacen falta dos botones en la hoja, uno para la macro StartTemporizador, y otro para la StopTemporizador.
Declaraciones
Por encima de las macros descritas abajo, hacemos las declaraciones.
Public datHora As Date Public Const conIntervalo = 60 'un minuto Public Const conRunMacro = "Tu_Sub" 'tu proced.
Iniciar temporizador
La primera macro inicia el temporizador.
Sub StartTemporizador() datHora = Now + TimeSerial(0, 0, conIntervalo) 'iniciar el temporizador Application.OnTime _ Earliesttime:=datHora, _ Procedure:=conRunMacro, _ Schedule:=True End Sub
Tu procedimiento
Aqu pones lo que quieres que Excel haga periodicamente.
Sub Tu_Sub() MsgBox datHora 'o cualquier instruccin 'reiniciar el temporizador StartTemporizador End Sub
Cerrar temporizador
El temporizador hay que cerrarlo 'manualmente'.
Sub StopTemporizador() On Error Resume Next 'desactivar el temporizador Application.OnTime _ Earliesttime:=datHora, _ Procedure:=conRunMacro, _ Schedule:=False End Sub
Todo el cdigo
Ahora, el mdulo de las macros descritas arriba debe tener el siguiente aspecto.
Public datHora As Date Public Const conIntervalo = 60 'un minuto Public Const conRunMacro = "Tu_Sub" 'tu proced. Sub StartTemporizador() datHora = Now + TimeSerial(0, 0, conIntervalo) 'iniciar el temporizador Application.OnTime _ Earliesttime:=datHora, _ Procedure:=conRunMacro, _ Schedule:=True End Sub Sub Tu_Sub() MsgBox datHora 'o cualquier instruccin 'reiniciar el temporizador StartTemporizador End Sub Sub StopTemporizador() On Error Resume Next 'desactivar el temporizador Application.OnTime _ Earliesttime:=datHora, _ Procedure:=conRunMacro, _ Schedule:=False End Sub
Procedimiento
Crea un formulario 'frmMensaje' con el mensaje que quieres que aparezca. Aade este cdigo 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 ms 4 segundos.
Sub Importar_Access() Private Sub UserForm_Activate() Application.Wait Now + TimeValue("00:00:04") frmMensaje.Hide End Sub
Luego, para mostrar el formulario en cualquier parte de tu programa, aplicas este cdigo.
frmMensaje.Show
En el ejemplo de abajo, el formulario se mostrar al abrir el libro (ponemos el cdigo en el contenedor de cdigo VBA 'EsteLibro'.
Private Sub Workbook_Open() frmMensaje.Show End Sub
De esta forma podemos aadir un medidor de progreso grfico a la barra de estado de Excel.
El cdigo
Option Explicit Sub BarraDeProgreso()
Dim R As Integer Dim MT As Double For R = 1 To 180 MT = Timer Do Loop While Timer - MT < 0.05 Application.StatusBar = "Progress: " & R & " de 180: " & _ Format(R / 180, "Percent") & " --- " & "Cumplimiento" DoEvents Next R Application.StatusBar = False End Sub
Formatear fuente
Cells.Select With Selection.Font .Name = "MS Sans Serif" .Size = 10 End With
Lneas de divisin
ActiveWindow.DisplayGridlines = False
Indice de colores
ActiveWorkbook.Colors(44) = RGB(236, 235, 194) 'verde
Colorear rango
Range("A1:B10").Interior.ColorIndex = 44
Preparamos la hoja
En celdas C5:C12 tenemos la lista en que buscar (celdas D5:D12 tambin 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 mdulo
Entra a Herramientas - Macros - Editor VBA. A la izquierda ves (si no lo ves CTRL+R) algo como "ProyectoVBA (Tu libro). Marca ese proyecto. Insertar - Mdulo. Doble click en el mdulo nuevo, y a la derecha sale un espacio blanco, es para el cdigo.
Ejecutar macro
Para ejecutar esta macro entras a Herramientas - Macros. All encontrars la macro "Buscar_Texto_En_Lista()". Marca esta, y "Ejecutar".
Cdigo
Sub Buscar_Texto_En_Lista()
'dimensiones
Dim Dim Dim Dim Dim Dim lngUltimaFila As Long strObjetoBuscar As String lngResultado As Long lngColumna As Long, lngFila As Long lngPegarColumna As Long, lngPegarFila As Long x As Integer, n As Integer
'objeto a buscar
strObjetoBuscar = Range("G2").Text If strObjetoBuscar = "" Then GoTo 99 'minsculas strObjetoBuscar = LCase(strObjetoBuscar)
'evaluacin
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
'aparcar
Application.CutCopyMode = False Range("G2").Select 99: End Sub
De esta manera puedes aplicar cualquier frmula de Excel en VBA, con tal de que empieces la lnea de cdigo con
Application.WorksheetFunction...
Nuestro ejemplo
En este ejemplo el rango que nos interesa sumar son los valores correspondientes a "BB", es decir C8:C13.
Mostrar informacin al usuario Recibir informacin del usuario Devolver informacin del usuario
Mensaje
Cualquier tipo de texto. Para crear un salto de lnea empleamos el carcter vbCrLf.
Actualizacin terminada:" & vbCrLf & _ "- Importacin de datos de venta.
Botones Si quieres puedes aadir cualquier de estos cuatro botones (si no pones nada Excel te pondr vbOkOnly por defecto).
vbOkOnly vbOkCancel vbYesNoCancel vbAbortRetryIgnore conos Puedes elegir entre los siguientes. vbCritical vbQuestion vbExclamation vbInformation Ttulo
Cualquier texto. Devolver informacin 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
Ejemplos
Te ponemos unos ejemplos mdelo para que te vayas acostumbrando a las diferentes messagebox.
Sub MessageBox() msgbox "Actualizacin terminada:", _ vbOKOnly, "Informacin" End Sub
Sub MessageBox() msgbox "Quieres seguir?", vbYesNo, _ "Informacin importante" End Sub
Sub MessageBox() Dim intRespuesta As Integer intRespuesta = msgbox("Quieres seguir?", _ vbQuestion + vbYesNo, "Informacin importante") If intRespuesta = 6 Then msgbox "Seguimos" Else msgbox "Terminamos" End If End Sub
Sub MessageBox() msgbox "Actualizacin terminada:" & _ vbCrLf & vbCrLf & _ "- Importacin de datos de venta." & vbCrLf & _ "- Clculos de impuestos." & vbCrLf & _ "- Venta por proveedor." & vbCrLf _ , vbOKOnly, "Actualizacin terminada." End Sub
Sub MessageBox() msgbox "Actualizacin terminada:" & vbCrLf & _ vbCrLf & _ "- Importacin de datos de venta." & vbCrLf & _ "- Clculos de impuestos." & vbCrLf & _ "- Venta por proveedor." & vbCrLf _ , vbExclamation + vbOKOnly, _ "Actualizacin terminada." End Sub
Tarea
Queremos un programa que nos calcule los dgitos de control de una cuenta.
Un ejemplo de cuenta
0123 - 4567 - xx - 0123456789 Entidad 0123 Oficina 4567 Dgitos de control Xx Cuenta 0123456789 En el ejemplo arriba, los dgitos de control seran 81.
Empezamos
Abrimos un libro nuevo. Formateamos las celdas B3:E3 a TEXTO.
Crear el mdulo
Entra a Herramientas - Macros - Editor VBA. A la izquierda ves (si no lo ves CTRL+R) algo como "ProyectoVBA (Tu libro). Marca ese proyecto. Insertar - Mdulo. Doble click en el mdulo nuevo, y a la derecha sale un espacio blanco, es para el cdigo.
Herramientas - Referencias. Marca Microsoft ActiveX DataObjects x.x Library.
El cdigo
Sub DC_check() Dim Dim Dim Dim Dim Dim Bank As String Office As String DC As String Account As String BankOffice As String Valor1, Valor2, Valor3, Valor4, Valor5
DIm Valor6, Valor7, Valor8, Valor9, Valor10 Dim TestValue1 As Integer Dim TestValue2 As Integer Dim TestValueDC As Integer '--------------------------------------------------'recoger el nmero de cuenta Bank = Range("B3").Text Office = Range("C3").Text DC = Range("D3").Text Account = Range("E3").Text BankOffice = 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 = 1 If 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 = 1 If TestValue2 = 11 Then TestValue2 = 0 '--------------------------------------------------'reconstituir las dos cifras del DC TestValueDC = TestValue1 & TestValue2 'evaluar DC completo If TestValueDC = DC Then Test = True MsgBox "Correcto." Else Test = False MsgBox "DC no corresponde a esta cuenta." & vbCrLf & _ "[en este caso DC sera " & TestValueDC & ".]", vbOKOnly, vbInformation End If '---------------------------------------------------
End Sub
Ejecutar macro
Para ejecutar esta macro entras a Herramientas - Macros. All encontrars la macro "Conectar_Excel_ADO". Marca esta, y "Ejecutar".
Un ejemplo real
Al hacer clic sobre la columna A, tilda la celda.
Luego se puede aplicar una frmula matricial y condicional para sumar los meses tildados.
{=SUMA(SI($A$2:$A$13<>"";$C$2:$C$13;0))}
El cdigo
El cdigo debe escribirse en la misma hoja Excel, ver imagen.
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) Dim aOffset As Integer On Error GoTo err_handler Application.EnableEvents = False If Not Application.Intersect _ (Target, Columns("A")) Is Nothing Then If Target.Column = 4 Then
aOffset = 3 Else aOffset = 2 End If If IsEmpty(Target.Value) Then With Target .Font.Name = "Wingdings" .Value = Chr(252) End With Target.Offset(0, iOffset).Select Else Target.Value = "" Target.Offset(0, iOffset).Select End If End If err_handler: Application.EnableEvents = True End Sub
Comentarios
Para evitar confusiones (sobre todo si estamos preparando una plantilla para otras colegas), podramos optar por la frmula SUMAPRODUCTO, que adems permite aplicar varias condiciones de una manera fcil. / Anders J.
=SUMAPRODUCTO((A2:A13<>"")*C2:C13)
Explorador de informes
Resumen de este ejemplo de "Explorador de informes"
Este ejemplo nos nuestra, de cmo armar un explorador de informes en Excel, manejndonos desde un Panel Principal. Esto nos permite dar una mejor esttica a cualquier aplicacin desarrollada en Excel. La importancia del formato Excel de presentacin Como hemos ido comentando en otros ejemplos de Excel y VBA de este sitio, la presentacin de los libros Excel es algo muy importante, sobre todo si trata de informes para distribuir. Captura de pantalla de esta plantilla Excel
Instrucciones
Encontrars un ejemplo real del Explorador de archivos Excel en la carpeta de este curso en el servidor de UGA Para ver el cdigo utilizado, combine las siguientes Teclas:ALT + F11.
El cdigo
Sub Importar_Access() 'dimensiones Dim datConnection As ADODB.Connection Dim recSet As ADODB.Recordset Dim strDB, strSQL As String Dim strTabla As String Dim lngTablas As Long Dim i As Long 'elegir uno de estas dos rutas al archivo Access strDB = ThisWorkbook.Path & "\" & "db.mdb" 'strDB = "C:\vba\db.mdb" 'si en otra carpeta 'nombre de la tabla del archivo Access strTabla = "salarios_2003" 'crear la conexin Set datConnection = New ADODB.Connection Set recSet = New ADODB.Recordset datConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source =" & strDB & ";" 'consulta SQL strSQL = "SELECT * FROM " & strTabla & "" recSet.Open strSQL, datConnection 'copiar datos a la hoja ActiveSheet.Cells(2, 1).CopyFromRecordset recSet 'copiar rtulos lngCampos = recSet.Fields.Count For i = 0 To lngCampos - 1 ActiveSheet.Cells(1, i + 1).Value = recSet.Fields(i).Name Next 'desconectar recSet.Close: Set recSet = Nothing datConnection.Close: Set datConnection = Nothing End Sub
Objetos utilizados
Para contactar con Outlook desde Excel podemos utilizar el objeto GetNameSpace de la MAPI Messaging Application Programming Interface. Luego, el mtodo GetDefaultFolder nos deja acceder a las carpetas de Outlook, por ejemplo el de los Contactos. Parmetro 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 cdigo
Sub ImportarContactos() Dim Dim Dim Dim olApp As Outlook.Application olContacts As Outlook.MAPIFolder olContact As Outlook.ContactItem i As Integer
Set olApp = New Outlook.Application Set olContacts = olApp.GetNamespace("MAPI").GetDefaultFolder(olFolderContacts) 'rotulos Cells(1, Cells(1, Cells(1, Cells(1, Cells(1, Cells(1, Cells(1, Cells(1, Cells(1, Cells(1, Cells(1, Cells(1, Cells(1, Cells(1, Cells(1, Cells(1,
1) = "Nombre" 2) = "E-mail" 3) = "Ttulo" 4) = "Empresa" 5) = "Tel (casa)" 6) = "Tel (mbil)" 7) = "Tel (trabajo)" 8) = "Fax (trabajo)" 9) = "Dir. (empresa)" 10) = "Postal (empresa)" 11) = "Ciudad (empresa)" 12) = "Pas (empresa)" 13) = "Dir. (casa)" 14) = "Postal (casa)" 15) = "Ciudad (casa)" 16) = "Pas (Casa)"
'importar contact items For i = 2 To olContacts.Items.Count If TypeOf olContacts.Items.Item(i) Is _Outlook.ContactItem Then Set olContact = olContacts.Items.Item(i) Cells(i, 1) = olContact.FullName Cells(i, 2) = olContact.Email1Address
Cells(i, Cells(i, Cells(i, Cells(i, Cells(i, Cells(i, Cells(i, Cells(i, Cells(i, Cells(i, Cells(i, Cells(i, Cells(i, Cells(i, End If Next
3) = olContact.JobTitle 4) = olContact.CompanyName 5) = olContact.HomeTelephoneNumber 6) = olContact.MobileTelephoneNumber 7) = olContact.BusinessTelephoneNumber 8) = olContact.BusinessFaxNumber 9) = olContact.BusinessAddressStreet 10) = olContact.BusinessAddressPostalCode 11) = olContact.BusinessAddressCity 12) = olContact.BusinessAddressCountry 13) = olContact.HomeAddressStreet 14) = olContact.HomeAddressPostalCode 15) = olContact.HomeAddressCity 16) = olContact.HomeAddressCountry
'eliminar variables de los objetos Set olContact = Nothing Set olContacts = Nothing Set olApp = Nothing 'ordenar lista por Nombre Cells.Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlGuess End Sub
El cdigo
'
Sub Mail_ActiveSheet() Dim wb As Workbook Dim strdate As String Dim stEmail As String strdate = Format(Now, "dd-mm-yy h-mm-ss") strEmail = "aaa.bbb@ccc.com" Application.ScreenUpdating = False ActiveSheet.Copy Set wb = ActiveWorkbook With wb .SaveAs ThisWorkbook.Name & " " & strdate & ".xls" .SendMail strEmail, "Archivo Adjunto" .ChangeFileAccess xlReadOnly Kill .FullName .Close False End With Application.ScreenUpdating = True End Sub