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 Importar celdas Excel a Excel (ADO) Con ADO podemos conectar con casi cualquier base de datos, incluyendo Excel mismo. En este ejemplo mostramos como conectar con otro libro Excel desde Excel. Luego importaremos los datos. Todo esto sin abrir el otro libro Excel (la base de datos). La importacin es muy eficaz, tarda poco, y puede ayudar mucho en la automizacin de tus rutinas diarias. Procedimiento Empezamos con un libro Excel vaco. Luego crearemos un mdulo VBA dentro de este libro. En este mdulo escribiremos el cdigo. El libro de las celdas a importar debe tener rtulos en la primera fila, y los datos a partir de la segunda. Sub Conectar_Excel_ADO() 'importar datos de un libro Excel sin abrirlo.
'dimensiones Dim datConnection As ADODB.Connection Dim recSet As ADODB.Recordset Dim recCampo As ADODB.Field Dim strDB, strSQL As String Dim i As Long
'ruta al archivo Excel (la base de datos) 'strDB = ThisWorkbook.Path & "\" & _ "MiArchivoExcel.xls" strDB = "C:\MiArchivoExcel.xls" 'si otra carpeta
'conectar Set datConnection = New ADODB.Connection Set recSet = New ADODB.Recordset datConnection.Open "DRIVER=Microsoft Excel _ Driver (*.xls);" & "DBQ=" & strDB
'consulta SQL 'strSQL = "SELECT * FROM [NuestroRango]" strSQL = "SELECT * FROM [Hoja1$A1:Q1000]"
'abrimos el recordset recSet.Open strSQL, datConnection, adOpenStatic
'copiar datos ActiveSheet.Cells.ClearContents ActiveSheet.Cells(2, 1).CopyFromRecordset recSet
'copiar rotulos (campos) i = 1 For Each recCampo In recSet.Fields ActiveSheet.Cells(1, i) = _ recCampo.Name: i = i + 1 Next recCampo
'cerrar los objetos Set recSet = Nothing Set datConnection = Nothing
End Sub
Importar datos de Word a Excel Al importar datos a Excel (en este caso texto) de un documento Word podemos aplicar la funcin VBA de Create Object. Esta funcin nos deja conectar con los otros programas Office. De esta manera es bastante sencillo mandar datos entre Excel y el resto del suite Office de Microsoft. Este ejemplo de Excel VBA presenta una manera de importar las filas de texto de un documento Word. El usuario elige desde cual documento Word la importacin se va a realizar, mediante el dilogo Windows predefinido de Abrir. Para que esto funcione, no olivides marcar la casilla de Microsoft Word x.xx Object Library en el men de Herramientas Referencias del editor VBA. Option Base 1 Public varText()
Sub abrirWordDesdeExcel()
Dim strWordArchivo As Variant Dim i, r, intLineas As Integer Dim appWord As Word.Application Dim appDoc As Word.Document Dim rngDoc As Word.Range
'dialogo 'abrir archivo' strWordArchivo = Application.GetOpenFilename _ ("Documentos Word (*.doc), *.doc"): On Error GoTo 99
'crear el objeto Word Set appWord = CreateObject("Word.Application") Set appDoc = appWord.Documents.Open(strWordArchivo)
'leer archivo Word intLineas = appDoc.Paragraphs.Count: ReDim varText(intLineas)
r = 1 For i = 1 To intLineas Set rngDoc = appDoc.Range( _ Start:=appDoc.Paragraphs(i).Range.Start, _ End:=appDoc.Paragraphs(i).Range.End) varText(i) = rngDoc.Text r = r + 1 Next i
'traspasar datos a celdas (o utilizar matriz para otra cosa de VB...) For x = 1 To UBound(varText) Cells(x, 1) = varText(x) 'terminar los objetos creados appDoc.Close: Set appDoc = Nothing appWord.Quit: Set appWord = Nothing 99: End Sub
Macro para pegar celdas Excel en Word
Esta macro nos deja automatizar el proceso de pegar las celdas Excel seleccionadas, en un documento nuevo de Word. Procedimiento Esta macro debe agregarse a las macros personales, para estar a mano desde cualquier libro Excel. Sub Copiar_Excel_a_Word()
'mandar las celdas Excel seleccionadas a nuevo documento Word 'copiar rango selecionado Selection.Copy
'crear nueva aplicacin Word Dim appWord As Word.Application Set appWord = New Word.Application
With appWord .Visible = True .Activate End With
'crear nuevo documento Word appWord.Documents.Add
'pegar celdas Excel appWord.Selection.Paste
'liberar el objeto Word Set appWord = Nothing
End Sub
Excel y bases de datos Importar tabla Access a Excel
Aqu explicamos cmo importar una tabla de una base de datos Access, a una hoja Excel. Esta maniobra tambin puede realizarse desde los mens 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 cdigo VBA, y programar una macro. Adems, esta importacin tarda poqusimo muy interesante si importamos muchas tablas al da. 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
Excel y archivos Ascii
A veces queremos guardar datos en un archivo de texto (archivo Ascii), por ejemplo de tipo CSV o de tipo sequencial (posiciones fijas). Es decir, utilizar un archivo de texto como una sencilla base de datos. Si los datos que tenemos que guardar son pocos, conviene guardarlos en un archivo Ascii en vez de una base de datos de verdad como Access. Hay que tener un cuenta que los datos guardados en archivos Ascii ocuparn ms espacio que en una base de datos de verdad. Pero para guardar hasta unos mil lneas de texto no hay problema ninguno. Comando OPEN El OPEN nos hace posible crear/abrir un archivo de texto, para luego proceder a escribir a este archivo. Hay tres modos: Output Abrir (o crear) el archivo (suprime todo ya grabado) para escribir. Es decir que, si el archivo existe, borrar todo los datos ya grabados. Open strArchivoTexto For Output As #f Append Abrir (o crear) para escribir (seguir por la ltima lnea). Open strArchivoTexto For Append As #f Input Abrir para lectura (a Excel). Open strArchivoTexto For Input As #f Sobre la #f: Para trabajar con el contenido de estos archivos hay que llamar a los archivos de una manera numrica. Si utilizamos el FREEFILE, no habr que preocuparse de esta numeracin. Comando PRINT El PRINT se emplea para la forma sequencial (posiciones fijas) = tal como est. En los ejemplos abajo utilizaremos el comando PRINT. Print #f, "Fecha de hoy: " & Date Comando WRITE El WRITE se utiliza para la forma sequencial CSV (Comma Separated Value Valor separado por coma). Esto significa que aadir una coma entre cada bloque de texto. Esto ayuda a la hora de importar un archivo Ascii a Excel. Print #f, "Fecha de hoy: " & Date ; " Application.UserName Cada bloque de texto se delimita del prximo por el carcter ;. Escribir archivo Ascii OUTPUT Sub Crear_Escribir_ArchivoAscii()
Dim strNombreArchivo, strRuta, strArchivoTexto As String Dim f As Integer
'nombre y ruta del archivo de texto strNombreArchivo = "MiArchivoAscii.txt" strRuta = "C:\" strArchivoTexto = strRuta & strNombreArchivo
'abrimos el archivo para escribir f = FreeFile Open strArchivoTexto For Output As #f
'escribimos al archivo Print #f, "Fecha de hoy: " & Date Print #f, "Usuario: " & Application.UserName
'cerramos el archivo de texto Close f
End Sub
Escribir archivo Ascii APPEND Sub Crear_Escribir_ArchivoAscii()
Dim strNombreArchivo, strRuta, strArchivoTexto As String Dim f As Integer
'nombre y ruta del archivo de texto strNombreArchivo = "MiArchivoAscii.txt" strRuta = "C:\" strArchivoTexto = strRuta & strNombreArchivo
'abrimos el archivo para escribir f = FreeFile Open strArchivoTexto For Append As #f
'escribimos al archivo Print #f, "Fecha de hoy: " & Date Print #f, "Usuario: " & Application.UserName
'cerramos el archivo de texto Close f
End Sub
Leer archivo Ascii INPUT Sub Leer_ArchivoAscii()
Dim strNombreArchivo, strRuta, strArchivoTexto As String Dim f, i As Integer Dim strTexto As String
'nombre y ruta del archivo de texto strNombreArchivo = "MiArchivoAscii.txt" strRuta = "C:\" strArchivoTexto = strRuta & strNombreArchivo
'abrimos el archivo para lectura f = FreeFile Open strArchivoTexto For Input As #f
'leemos el archivo de texto a columna de Excel i = 1 While Not EOF(f) Line Input #f, strTexto Cells(i, 1) = strTexto i = i + 1 Wend
'cerramos el archivo de texto Close f
End Sub
Importar tabla de dBase IV a Excel
dBase IV es una base de datos de los aos 80, que todava se utiliza. En caso de necesitar importarla a Excel, podemos utilizar el siguiente marcado. Conectar a traves de ADO etc es bastante complicado. Hay otra manera mucho ms fcil; abrirla como libro Excel.
Sub Importar_dBaseIV() Dim dBase As String Dim strMacro As String strMacro = ActiveWindow.Caption
'abrir el archivo .dbf como archivo Excel Workbooks.Open Filename:="C:\dbase.dbf"
'aparcar en la nueva lista Windows(strMacro).Activate Columns.AutoFit
End Sub
Abrir archivo de texto (CSV) en Excel
Al abrir en Excel un archivo plano de texto (.txt etc) hay que tener en cuenta si trata de un texto delimitado por comas,tabs etc, o no. Un texto delimitado se caracteriza por tener delimitadores dentro del texto. Estos dicen por donde empezar una nueva columna. Un archivo de estos, al abrirlo en Word etc, puede tener un aspecto bastante desorganizado. Pero en realidad no es as. Basta cambiar fuente a una monoespacio (por ejemplo Courier) para poder ver la estructura. Hay varias maneras de importar estos datos a Excel. Aqu explicamos una de las maneras mas sencillas, es decir abrirlo directamente en Excel. Antes de proceder hay que averiguar si se trata de un texto delimitado o no. Conceptos de apertura en Excel Teorticamente hay tres posibilidades como proceder. No. Concepto Resultado Delimitadores 1 Texto no delimitado Texto queda en la columna A - 2 Texto delimitado Texto queda en la columna A Seguirn presentes 3 Texto delimitado Texto se divide en columnas segn posiciones de los delimitadores Desaparecen El primer ejemplo es un archivo de texto con texto normal y corriente. No est pensado para dividir en columnas. El segundo est pensado para dividir en columnas, pero en este caso queremos conservar la estructura delimitada por eso colocamos el texto en la columna A, y los delimitadores seguirn presentes. El tercero est pensado para dividir en columnas, y eso es tambin el proceso que se efectuar. Abrir archivo de texto en Excel sin dividir en columnas Este cdigo deja al usuario elegir el archivo a abrir, y luego se abre el archivo de texto en Excel. No divide en columnas, todos los datos permanecern el la columna A. Los delimitadores quedan intactos.
Sub AbrirEnColumnaUnica()
'abre un archivo de texto en la columna A '[sin dividir en columnas]
'dimensiones Dim strNombreArchivo
'dilogo para abrir archivo strNombreArchivo = Application.GetOpenFilename If strNombreArchivo = False Then Exit Sub
'abre el archivo en la columna A Workbooks.OpenText _ Filename:=strNombreArchivo, _ Origin:=xlWindows, _ StartRow:=1, _ FieldInfo:=Array(1, 1)
End sub Abrir archivo de texto en Excel, y dividir el contenido en columnas En el segundo ejemplo abriremos el archivo de texto en Excel, y procedemos a dividir el contenido en columnas, dependiendo del delimitador elegido. Los delimitadores desaparecern. Sub Abrir_y_DividirEnComumnas()
'abre un archivo de texto en Excel, divide en columnas 'hay que poner el tipo de delimitador (en este caso 'Space')
'dimensiones Dim strNombreArchivo
'dilogo para abrir archivo strNombreArchivo = Application.GetOpenFilename If strNombreArchivo = False Then Exit Sub
Enviar hoja Excel por correo electrnico (Outlook etc.)
Resumen Este truco sirve para enviar una hoja Excel por mail, utilizando Outlook u otro sistema de correo instalado en el ordenador del usuario 'Jose Skraviuk 'ayudaexcel {at} yahoo.com.ar
Sub Mail_ActiveSheet()
Dim wb As Workbook Dim strdate As String Dim stEmail As String Application.ScreenUpdating = False
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 Configuraciones Hay que indicar la direccin email a emplear. strEmail = "aaa.bbb@ccc.com"
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 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 olApp As Outlook.Application Dim olContacts As Outlook.MAPIFolder Dim olContact As Outlook.ContactItem Dim i As Integer
Set olApp = New Outlook.Application
Set olContacts = _ olApp.GetNamespace("MAPI").GetDefaultFolder(olFolderContacts)
'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, 3) = olContact.JobTitle Cells(i, 4) = olContact.CompanyName Cells(i, 5) = olContact.HomeTelephoneNumber Cells(i, 6) = olContact.MobileTelephoneNumber Cells(i, 7) = olContact.BusinessTelephoneNumber Cells(i, 8) = olContact.BusinessFaxNumber Cells(i, 9) = olContact.BusinessAddressStreet Cells(i, 10) = olContact.BusinessAddressPostalCode Cells(i, 11) = olContact.BusinessAddressCity Cells(i, 12) = olContact.BusinessAddressCountry Cells(i, 13) = olContact.HomeAddressStreet Cells(i, 14) = olContact.HomeAddressPostalCode Cells(i, 15) = olContact.HomeAddressCity Cells(i, 16) = olContact.HomeAddressCountry End If Next
'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
Libros y hojas Excel Cerrar libro Excel (guardar cambios) ActiveWorkbook.Close ActiveWorkbook.Close Savechanges:=True ActiveWorkbook.Close(True) Cerrar libro Excel (sin guardar cambios) ActiveWorkbook.Close(False) ActiveWorkbook.Close Savechanges:=False Cerrar libro Excel (variable, sin guardar cambios) Application.DisplayAlerts = False Windows(Libro_mayor).Close Application.DisplayAlerts = True
<h2>Abrir libro Excel (ruta fija)</h2> <pre lang="vb">Workbooks.Open FileName:="C:\Trabajo\Informe.xls" Abrir libro Excel (dilogo) Msg = MsgBox("Elija archivo para abrir.", vbOKOnly, (""))
strArchivo = Application.GetOpenFilename On Error GoTo 99
Workbooks.OpenText Filename: = strArchivo If strArchivo = "" Then Exit Sub strArchivo = ActiveWindow.Caption 99: Exit sub Devolver nombre del libro Excel strNombre = ActiveSheet.Parent.FullName MsgBox ActiveWorkbook.FullName
Nombre de la hoja (variable) 'asigna nombre variable a la hoja a variable strHoja = ActiveWindow.Caption Windows(strHoja).Activate 'para activar el libro del nombre asignado Insertar hoja nueva (elegir posicin) ActiveWorkbook.Sheets.Add Before:=Worksheets("Informe1") Insertar hoja nueva (primera posicin) Sheets("Informe1").Copy After:=Worksheets(Worksheets.Count) Mover hoja Worksheets("informe5").Move After:=Worksheets("Informe4") Ordenar hojas (orden alfabtico) 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 Suprimir una hoja determinada Application.DisplayAlerts = False
For i = 1 To Sheets.Count Sheets(i).Activate xxx = ActiveCell.Worksheet.Name If xxx = "Informe" Then ActiveWindow.SelectedSheets.Delete End If Next
Excel pone a disposicin un montn de formatos. Abajo presentamos como modificar algunos de ellos a travs de macros Excel VBA. Redondear celdas Set Area = Selection For Each Cell In Area z = Round(Cell, 2) Cell.Value = z Cell.NumberFormat = "#,##0.00" Next Cell 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 Cambiar entre estilos A1 / RC Application.ReferenceStyle = xlA1Application.ReferenceStyle = xlR1C1
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).Row MaxCol = Cells.SpecialCells(xlLastCell).Column Encontrar ltima celda (buscar al revs) Dim lngUltimaCelda As Long If WorksheetFunction.CountA(Cells) > 0 Then lngUltimaCelda = Cells.Find(What:="*", After:=[A1], _ SearchOrder:=xlByRows, _ SearchDirection:=xlPrevious).Row MsgBox lngUltimaCelda End 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.Address End If Suprimir filas vacas intLastRow = Columns("A:A").Range("A65536").End(xlUp).Row For r = intLastRow To 1 Step -1 If Application.CountA(Rows(r)) = 0 Then Rows(r).Delete Next r Suprimir filas vacas Dim intNumDeFilas As Long
Selection.SpecialCells(xlCellTypeLastCell).Select intNumDeFilas = Selection.Row For i = 1 To intNumDeFilas If Application.WorksheetFunction.CountA(Rows(i)) = 0 Then Rows(i).Delete End If Next Suprimir filas vacas intUltimaFila = _ ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count For r = intUltimaFila To 1 Step -1 If Application.CountA(Rows(r)) = 0 Then Rows(r).Delete Next r Suprimir filas por condicin Dim rngString As Range
Do Set rngString = Cells.Find("Aglis", MatchCase:=False, _ LookAt:=xlPart, LookIn:=xlValues) If Not rngString Is Nothing Then rngString.EntireRow.Delete End If Loop Until rngString Is Nothing Suprimir filas vacas por dos condicines X, Y For i = intUltimaFila To 1 Step -1 Let strTest= Application.Cells(i, 2) If strTest <> "X" And strTest <> "Y" Then Rows(i).Delete Next i
Columnas de Excel y VBA
Presentamos unas macros para trabajar con columnas Excel desde Excel VBA. Encontrar ltima columna (buscar al revs) 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 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.Address End If End Sub Suprimir columnas vacas en el rango Sub SuprimirColumnas() Dim cCount As Integer, c As Integer Dim 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.Delete Next c End With End Sub Suprimir cada n-columnas Sub SuprimirColumnas() Dim rCount As Long, r As Long Dim DeleteRange as range
DeleteRange =("A1:B10")
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
Repasar archivos Excel de una carpeta
Esta macro de Excel presenta una solucin para repasar todos los archivos Excel (o de cualquier tipo) de una carpeta. Incluso nos deja abrir cada archivo Excel automticamente para luego importar datos de todos los archivos de esa carpeta determinada. Presentar los archivos Excel de la carpeta Los ejemplos emplean la funcin DIR, y el cdigo VBA presentado abajo, nos indica los nombres de cada archivo Excel. Sub RepasarCarpeta() 'en este ejemplo sacamos los nombres de los archivos de la carpeta.
'dimensiones Dim strArchivoExcel As String Dim strNombreCarpeta As String
'carpeta a repasar strNombreCarpeta = "C:/MisArchivosExcel"
'repasamos los archivos de la carpeta Do While strArchivoExcel <> "" MsgBox strArchivoExcel strArchivoExcel = Dir Loop
End Sub Sacar datos de todos los libros Excel de la carpeta En este ejemplo aadimos la posibilidad de utilizar el objeto Workbook, para poder abrir (y cerrar) cada archivo Excel (para lectura o modificacin). Sub RepasarCarpeta2() 'en este ejemplo abriremos cada libro de la carpeta para sacar ' informacin de 'las celdas A1 y B1.
'dimensiones Dim wb As Workbook Dim strArchivoExcel As String Dim strNombreCarpeta As String
'carpeta a repasar strNombreCarpeta = "C:/MisArchivosExcel"
'repasamos los archivos de la carpeta Do While strArchivoExcel <> "" Set wb = Workbooks.Open(strNombreCarpeta & "\" & strArchivoExcel) MsgBox wb.ActiveSheet.Cells(1, 1) MsgBox wb.Application.Sheets("Hoja2").Cells(2, 1).Value wb.Close False Set wb = Nothing strArchivoExcel = Dir Loop
End Sub
Colores y filtros en Excel 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 cdigo VBA. Abajo presentamos unos ejemplos de cdigo 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 difcil de leer. Los colores forman parte del diseo del libro, son importantes para una buena presentacin de un informe. Pero por regla general tampoco se debe pasar utilizando demasiado color. Excel y Colores RGB Excel 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 pgina de Colores RGB y HEX. Cambiar colores de la paleta Excel Entonces, qu podemos hacer para que Excel siempre tenga los colores definidos por ti? Una solucin sera crear una plantilla con nuestros formatos. Excel llamar esta plantilla al crear un libro nuevo. Otra solucin es crear una macro cual nosotros podemos llamar cuando nos convenga. Esto nos da un poco ms 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) Cdigo VBA para cambiar colores de celdas Excel Para 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) <pre lang="vb"> Selection.Interior.Color = ?000066? 'hexadecimal Resetear paleta de colores Para resetear los colores a los predefinidos de Excel, aplicamos el mtodo ResetColors. ActiveWorkbook.ResetColors Copiar colores de otro libro Excel Tambin 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 actual A lo mejor nos interesa saber que color tiene una celda. La propiedad ColorIndex nos ayuda. i = Cells(1, 1).Interior.ColorIndex MsgBox i Aplicar colores por condiciones en Excel VBA Podemos 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 If Next
Colorear celdas Excel al hacer click
Este trocito de cdigo VBA Excel colorear celdas al hacer click sobre ellos. Es una macro que utiliza el evento Worksheet_SelectionChange de las hojas de libro Excel. Por eso hay que incluir este cdigo en los objetos de las hojas. En ejemplo abajo habra que poner el cdigo en los contenedores de cdigo de una o mas de los objetos Hoja1, Hoja2 y Hoja3. Para colorear solo la celda activa Private Sub Worksheet_SelectionChange(ByVal Target As Range) ActiveCell.Interior.ColorIndex = 3 End Sub Para colorear todas las celdas seleccionadas Private Sub Worksheet_SelectionChange(ByVal Target As Range) Target.Interior.ColorIndex = 3 End Sub
Filtrar con colores en Excel
Marcar encabezado de columnas filtradas Este ejemplo Excel VBA surge en base a que si uno filtra con muchos criterios, pasa que a veces nos perdemos que columnas tenemos filtrados.
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. Descargar archivo Descargar archivo Excel (zip) Contenedor del cdigo El cdigo debe ir en el mdulo VBA correspondiente a la hoja para filtrar, por utilizar el suceso Worksheet_Calculate(). Ver ejemplo.
El cdigoVBA Option Explicit 'JOSE SKRAVIUK 'ayudaexcel {at} 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
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 cdigo. 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 cdigo Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim strRuta As String Dim intRowActual as Double, intColumnActual As Double Dim intRow as Double, intColumn As Double
'ruta a imagen strRuta = "C:\imagen.jpg"
'fila/columna actual intRowActual = ActiveCell.Row intColumnActual = ActiveCell.Column
'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
Vnculos y acceso en Excel VBA para proteger hojas de un libro Excel
Con 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 funcin no est integrada en Excel (sorprendentemente), por eso hay que recurrir a VBA. Eventos empleados para la proteccin Para 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 hojas Cualquier persona puede entrar al cdigo VBA para ver la palabra de paso. Por eso debes proteger el codigo (VBA editor Click derecho sobre EsteLibro Propiedades). Este mtodo no da 100% de seguridad. Si activamos la proteccin de los mdulos 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 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). Cdigo VBA para proteger hojas Excel 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
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object) 'recordar hoja inicial strStartHoja = Sh.Name End Sub
Crear enlaces a las hojas Excel
Si nuestro libro Excel contiene muchas hojas (hasta 256) convendra 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 mximo un par de segundos para concluir el trabajo. 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. 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
Con un mnimo de cdigo vamos a crear archivos independientes de las hojas de un libro. Un ejemplo sera un libro con 124 hojas, una hoja por empleado, y ahora queremos separar las hojas de cada colega y crear libros independientes. 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. Ahora cierras el editor VBA, vuelves a Excel. Guardamos el libro. Cdigo Sub Crear_archivos_de_hojas()
Dim strHoja, strStartHoja, strRuta As String Dim i As Integer
Con esta macro podrs eliminar vnculos a otras hojas/libros. Elimina vnculos a otras hojas/libros Referencias dentro de la hoja se mantienen. Los vnculos se convierten en valores. Antes de todo, recuerda hacer una copia de seguridad! 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. Ahora cierras el editor VBA, vuelves a Excel. Guardamos el libro. El cdigo Sub QuitarVinculos()
Dim varVinculo As Variant Dim wrsHoja As Worksheet Dim objCelda As Object Dim 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
Informacin del sistema o usuario Objecto Application de Excel VBA
El objeto Application de VBA nos da informacin del usuario/mquina. En este artculo presentaremos unas aplicaciones del un objeto muy bsico de Excel/VBA: Application. Este representa todo el conjunto del programa Excel y sus libros de trabajo. Unos ejemplos de propiedades del objeto Application El objeto Application tiene muchas propiedades. Hay unas que pueden ser interesantes para el programador de macros VBA de Excel. Objeto Propiedad Devuelve Application. UserName Nombre del usuario
OrganizationName Nombre de la empresa
OperatingSystem Sistema operativo
Version Versin de MS Excel
ProductCode Cdigo de MS Excel
StandardFont Fuente por defecto
StandardFontSize Tamao fuente por defecto
DecimalSeparator Carcter separador de miles
ActivePrinter Impresora por defecto
DefaultFilePath Ruta de acceso por defecto
UserLibraryPath Ruta a carpeta Add-ins Sobre la versin de MS Excel arriba: N Versin 12 Excel 2007 11 Excel 2003 10 Excel 2002 (XP) 9 Excel 2000 8 Excel 97 7 Excel 95 Algunos ejemplos prcticos del objeto Application de Excel Presentar la impresora activa del usuario Para presentar la impresora activa del usuario, en una caja de dilogo, pondramos Sub Devolver ImpresoraActiva()
Dim strImpresoraActiva as String strImpresoraActiva = Application.ActivePrinter
Msgbox strImpresoraActiva
End sub o todava ms fcil: Sub Devolver ImpresoraActiva()
Msgbox Application.ActivePrinter
End sub Crear lista extensa de informacin sobre la mquina del usuario Abajo te presentamos una macro para presentar varios datos del usuario/maquina.
Sub Application_Data()
'dimensiones Dim strDataArray(10) As String Dim i, x As Integer
'presentar los datos en celdas D3... x = 0 For i = 3 To 13 Cells(i, 4) = strDataArray(x) x = x + 1 Next i
End Sub Sub SuprimirDatosEnceldas()
'suprimir datos antiguos Range(Cells(3, 4), Cells(13, 4)).ClearContents
End Sub
Determinar idioma del usuario desde Excel VBA
Este marcado sirve para averiguar el idioma de Excel del usuario. La funcin Application.International de Excel VBA nos ayuda. Lo nico es que hay que saber los marcadores de telefona de los pases para descodficar la respuesta de la funcin. Ver por ejemplo esta lista de prefijos telefnicos internacionales. El cdigo Sub DeterminarPais()
If CodigoPais = 1 Then MsgBox ("Hello") ElseIf CodigoPais = 34 Then MsgBox ("Hola") End If
End Sub
Funcionalidad aadida
Abrir otro libro de Excel utilizando VBA Este cdigo sirve para abrir otro libro Excel a travs del dilogo Abrir. All el usuario elige el libro a abrir. Si el usuario pulsa Cancelar, el dilogo se cierra. Este procedimiento en s no sirve para mucho (porque luego se debe hacer algo con este libro, verdad), pero al final ser un procedimiento bsico en muchos de tus futuros programas de Excel VBA. Sub Abrir_archivo()
Dim strRutaArchivo As String
'un poco de informacin MsgBox ("Abra el archivo Excel.")
'elegir archivo strRutaArchivo = _ Application.GetOpenFilename("Libro de Microsoft Excel (*.xls), *.xls")
'abrir archivo On Error GoTo 9 Workbooks.Open Filename:=strRutaArchivo 9:
End Sub
Messagebox y Excel VBA
Las messagebox son muy tiles (y fciles de usar), y crea una interfaz entre el usuario y el programa. Sirven para Mostrar informacin al usuario Recibir informacin del usuario Devolver informacin del usuario Construccin sintctica de la messagebox Msgbox "Mensaje", Botones/conos, "Ttulo" o en el caso de devolver informacin Respuesta = Msgbox("Mensaje", Botones/conos, "Ttulo") Nota las parntesis en la segunda construccin. 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 Iconos 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
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 aqu Para ver el cdigo utilizado, combine las siguientes Teclas: Alt + F11.
Como armar un reloj en Excel (mtodo OnTime).
Sobre el mtodo de Excel VBA OnTime El mtodo OnTime de Excel ejecuta una macro en una hora designada o en intervalos fijos. Cdigo VBA empleado para el mtodo OnTime Sub Reloj() Range("A1").Formula = "=NOW()" Application.OnTime Now + TimeValue("00:00:01"), "reloj" End Sub
Sub auto_Open() Call Reloj End Sub Imprimir la hora en la hoja Excel Segn el cdigo 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)
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.
Crear una barra de progreso en Excel VBA. 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
Casilla de Verificacin (evento Change) Resumen Se usa el evento change para simular una casilla de verificacin, en la columna A, y luego combinamos con una suma condicional, que que solamente SUMA los meses que se encuentran tildados. 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.
'Jose Skraviuk 'ayudaexcel {at} yahoo.com.ar
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 personas), podramos optar por la frmula SUMAPRODUCTO, que adems permite aplicar varias condiciones de una manera fcil. =SUMAPRODUCTO((A2:A13<>)*C2:C13)
Excel VBA Crear un sistema de ayuda
Resumen Un bonito ejemplo de como usar el evento Change, para proporcionar ayuda acerca de la celda seleccionada. Este truco Excel permite proporcionar ayuda en lnea al usuario, acera de la celda seleccionada. Esto puede resultar til a la hora de construir formularios (no los de VBA, sino los formularios a rellenar de toda la vida) en una hoja Excel.
El cdigo 'Jose Skraviuk 'ayudaexcel@yahoo.com.ar
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
If ActiveCell = Range("B5") Then Range("ayuda") = "Ud ha seleccionado la OPCION1, permite ver el ejemplo n1" Else Range("ayuda") = "" If ActiveCell = Range("D5") Then Range("ayuda") = "Ud ha seleccionado la OPCION2, permite ver el ejemplo n2" Else Range("ayuda") = "" End If End If
End Sub
El temporizador de Excel VBA Si queremos que una instruccin se haga automticamente, a intervalos fijos, podemos recurrir al mtodo Application.OnTime. 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
WAIT mostrar un formulario VBA durante un tiempo predeterminado Con el mtodo WAIT puedes hacer que un formulario se cierre despus de un tiempo determinado. Esto puede ser til para presentar informacin al usuario (La importacin ha terminado con xito, El archivo est guardado etc). El truco est en utilizar el mtodo WAIT de VBA. 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 MostrarFormulario()
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
Imprimir Macro VBA Excel para imprimir adecuadamente A veces vale la pena incluir una funcin para que el usuario del libro pueda imprimir cmodamente (y seguro), por ejemplo desde un botn. De esta manera mantenemos el control sobre lo que se va a imprimir, y de los parmetros que se mandarn a la impresora. Abajo encontrars sencillos ejemplos de la aplicacin de cmo imprimir desde Excel VBA: Seleccin Hojas seleccionadas Todas las hojas Primero ajustamos los parmetros de la impresin, el apartado PageSetup. Luego se imprime con el mtodo PrintOut. Marcado VBA para imprimir las celdas seleccionadas Sub Imprimir_seleccion()
'preparar la hoja para la impresin With ActiveSheet.PageSetup .PrintArea = "" .Orientation = xlPortrait 'xlLandscape .PaperSize = xlPaperA4 'formato A4 .BlackAndWhite = False 'incluir colores o no .FitToPagesWide = 1 'reduce el tamao de la hoja (ancho) .FitToPagesTall = 1 'reduce el tamao de la hoja (alto) .CenterHorizontally = False 'centrar horizontalmente .CenterVertically = False 'centrar verticalmente End With
'imprimir las celdas seleccionadas (1 copia) ActiveWindow.Selection.PrintOut copies:=1, collate:=True
End Sub Cdigo VBA para imprimir las hojas seleccionadas Sub Imprimir_seleccion()
'preparar la hoja para la impresin With ActiveSheet.PageSetup .PrintArea = "" .Orientation = xlPortrait 'xlLandscape .PaperSize = xlPaperA4 'formato A4 .BlackAndWhite = False 'incluir colores o no .FitToPagesWide = 1 'reduce el tamao de la hoja (ancho) .FitToPagesTall = 1 'reduce el tamao de la hoja (alto) .CenterHorizontally = False 'centrar horizontalmente .CenterVertically = False 'centrar verticalmente End With
'imprimir las celdas seleccionadas (1 copia) ActiveWindow.SelectedSheets.PrintOut copies:=1, collate:=True
End Sub Cdigo VBA para imprimir todas las hojas del libro Sub Imprimir_seleccion()
'preparar la hoja para la impresin 'bucle que repasa todas las hojas For Each Worksheet In ActiveWorkbook.Sheets With ActiveSheet.PageSetup .PrintArea = "" .Orientation = xlPortrait 'xlLandscape .PaperSize = xlPaperA4 'formato A4 .BlackAndWhite = False 'incluir colores o no .FitToPagesWide = 1 'reduce el tamao de la hoja (ancho) .FitToPagesTall = 1 'reduce el tamao de la hoja (alto) .CenterHorizontally = False 'centrar horizontalmente .CenterVertically = False 'centrar verticalmente End With Next Worksheet 'fin del bucle
Excel y VBA Copiar mdulo VBA a otro libro Excel Mtodo para guardar un mdulo VBA/importarlo a otro libro Excel. Al exportar hojas a un libro nuevo (el primer ejemplo de cdigo), los mdulos VBA no se copiarn, sino el libro nuevo se quedar sin cdigo VBA. Es decir, este ejemplo no vale para copiar mdulos VBA.
'copiar hojas a un libro nuevo Sheets(Array("Hoja1", "Hoja2", "Hoja3")).Copy Para exportar un mdulo VBA, primero hay que guardarlo como un archivo de texto, y luego importarlo desde el libro nuevo. Objetos del editor VBA El editor VBA tiene 2 objetos bsicos: VBProject Todos los mdulos y componentes/referencias VBA del libro VBComponent Un mdulo (o formulario) especfico del VBProject Para utilizarlos debes marcar la siguiente referencia del editor VBA: Herramientas Referencias Microsoft Visual Basic for Applications Extensibility x.x. Exportar mdulo VBA 'exportar mdulo VBA Dim vbaProyecto As VBIDE.VBProject Dim vbaModulo As VBIDE.VBComponent Public strRuta as String
Set vbaProyecto = ThisWorkbook.VBProject Set vbaModulo = vbaProyecto.VBComponents("Module1") strRuta = ThisWorkbook.Path & "\modulo1_export.txt" 'o strRuta = "c:\modulo1_export.txt"
vbaModulo.Export strRuta Importar mdulo VBA 'importar mdulo VBA Dim vbaProyecto As VBIDE.VBProject Dim vbaModulo As VBIDE.VBComponent Public strRuta as String
strRuta = ThisWorkbook.Path & "\modulo1_export.txt" 'o strRuta = "c:\modulo1_export.txt"
Set vbaProyecto = ActiveWorkbook.VBProject vbaProyecto.VBComponents.Import (strRuta)
'suprimir el archivo plano Kill strRuta
Funciones
Calcular los Dgitos de control desde Excel VBA En este ejemplo presentamos un ejemplo de marcado VBA para calcular los dgitos de control de una cuenta bancaria espaola.
Qu son los dgitos de control? Las cuentas bancarias espaolas consisten de 4 grupos de dgitos. Los dgitos de control verifican los cdigos de Entidad y Oficina (el primer dgito), y el Nmero de Cuenta (el segundo dgito). El algoritmo para calcular los dgitos de control se define en Norma bancaria 34 de AEB (Asociacin Espaola de Banca). 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. Ahora cierras el editor VBA, vuelves a Excel. Guardamos el libro. El cdigo Sub DC_check()
Dim Bank As String Dim Office As String Dim DC As String Dim Account As String Dim BankOffice As String Dim 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)
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
Buscar fragmento de texto en una lista La funcin INSTR nos permite buscar un fragmento de texto en una lista de cadenas de texto. Nos devuelve la posicin 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 sera queiro, c ual nos devolvera Abanquiero. 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 lngUltimaFila As Long Dim strObjetoBuscar As String Dim lngResultado As Long Dim lngColumna As Long, lngFila As Long Dim lngPegarColumna As Long, lngPegarFila As Long Dim x As Integer, n As Integer
Sumar rangos variables con VBA Excel Sumar un rango en Excel es fcil. Sumar un rango expresado por una variable en VBA es un poco ms complicado (pero sigue siendo fcil). No siempre se sabe de antemano que celdas formarn parte del rango a sumar. Entonces tenemos que expresar el rango de forma variable. En Excel es fcil sumar este rango mediante una sencilla frmula. Pero VBA no contiene ninguna funcin igual. Entonces hay que hacer que VBA utilice las funciones de Excel. Utilizar funciones Excel en VBA Tenemos un rango varSuma, el rango a sumar. Para sumar las celdas de este rango tenemos que llamar a la funcin SUM de Excel. Application.WorksheetFunction.Sum(varSuma) 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.
Escribir la suma (en celda) 'el rango a sumar varSuma = Range(Cells(8, 3), Cells(13, 3)) 'sumar el rango Cells(1, 1) = Application.WorksheetFunction.Sum(varSuma)
<h2>Escribir la suma (variable)</h2> <div class="cb"> <pre>
'el rango a sumar varSuma = Range(Cells(8, 3), Cells(13, 3)) 'sumar el rango SUMA = Application.WorksheetFunction.Sum(varSuma)
SQL para VBA de Excel Excel y Bases de datos SQL VBA de Excel te permite conectar con prcticamente cualquier base de datos externa para sacar o grabar datos. Un ejemplo tpico de estas aplicaciones es la importacin automatizada de datos a Excel desde una base de datos externa. Esto significa que debemos incluir trozos de cdigo SQL en nuestra programacin VBA para poder realizar esta tarea. Qu es SQL? SQL (Structured Query Language o Lenguaje de consultas estructurado) es un lenguage que se utiliza para organizar, gestionar y recuperar datos de bases de datos. Con SQL se puede consultar bases de datos para buscar/escribir etc datos. Surgi de IBM a finales de los aos 70. Posteriormente adoptado por ANSI (American National Standards Institute). La ltima version se llama SQL-99, y todas las bases de datos comnes son compatibles. Ejemplos de comandos SQL Abajo presentamos informacin bsica sobre algunos de los comandos SQL que emplearas al programar una macro de este tipo. Captulo Comando Descripcin SQL y tablas CREATE Crear nuevas tablas y campos
DROP Eliminar tablas
ALTER Modificar tablas o agregar campos
TRUNCATE Eliminar contenido de tablas SQL y registros SELECT Consultar registros
SELECT INTO Consultar/escribir registros
INSERT Insertar nuevos registros
UPDATE Modificar registros
DELETE Eliminar registros SQL y condiciones FROM Especificar tabla de origen
WHERE Espeificar condiciones
GROUP BY Separar registros seleccionados en grupos
ORDER BY Ordenar registros seleccionados segn criterio SQL y operadores AND TRUE si dos registros cumplen condicin
OR TRUE si uno de dos registros cumple
NOT Negacin lgica devuelve el valor contrario
< Menor que
> Mayor que
<> Distinto de
< = Menor o igual que
>= Mayor o igual que
= Igual que
BETWEEN Especificar intervalo de valores SQL y variables
Incluir variables en las consultas
VBA: Consultas SQL Tablas CREATE Para crear nuevas tablas y campos. CREATE TABLE nombre_tabla (nombre_columna1 datatype, nombre_columna2 datatype, ) Ejemplo CREATE TABLE Nombres (Apellido varchar (40), Nombre varchar(40)) Varchar significa que esa columna solo puede contener texto. La longitud mxima (opcional) se puede poner entre parntesis. Otros formatos son integer nmeros integrales decimal nmeros con decimales char todo tipo de contenido date fecha en formato yyyymmdd. DROP Para suprimir tablas o bases de datos. DROP TABLE nombre_tabla DROP DATABASE nombre_basededatos TRUNCATE Para suprimir el contenido una tabla (y no toda la tabla en si). Puede ser muy til de vez en cuando. TRUNCATE TABLE nombre_tabla ALTER Para aadir/suprimir columnas en una base de datos. ALTER TABLE nombre_tabla ADD nombre_columna datatype ALTER TABLE nombre_tabla DROP nombre_columna Ejemplo ALTER TABLE Nombre ADD Direccin varchar(40) ALTER TABLE Nombre DROP Apellido
VBA y consultas SQL Registros SELECT Para seleccionar (devolver) datos de la base de datos. SELECT nombre_columna(s) FROM nombre_tabla SELECT * FROM nombre_tabla SELECT DISTINCT nombre_columna(s FROM nombre_tabla INSERT Para grabar nuevos registros en la base de datos. INSERT INTO nombre_tabla VALUES (valor1, valor2, valor3. Para insertar datos en una columna escpecfica: INSERT INTO nombre_tabla (columna1, columna2) VALUES (valor1, valor2, valor3) UPDATE Para modificar datos de una tabla. UPDATE nombre_tabla SET nombre_columna = nuevo valor, nombre_columna2 = nuevo valor2 WHERE nombre_columna = un valor DELETE Para suprimir datos de una tabla. DELETE FROM nombre_tabla WHERE nombre_columna = un valor Para suprimir todas las filas de una tabla: DELETE FROM nombre_tabla o DELETE * FROM nombre_tabla
VBA y SQL: Condiciones FROM Para especificar tabla de origen. Utilizado con el comando SELECT. SELECT DISTINCT nombre_columna(s) FROM nombre_tabla WHERE Se utiliza para escpecificar condiciciones en la consulta de la base de datos. Utilizado con el comando SELECT, ms un operador y luego la condicin en si. SELECT nombre_columna FROM nombre_tabla WHERE nombre_columna2 operador valor Unos de los operadores que WHERE admite son Operador Explicacin AND TRUE si dos registros cumple la condicion. OR TRUE si uno de los registros cumple la condicion. NOT Negacin lgica. Devuelve el valor contrario. < Menor que. > Mayor que. <> Distinto de. < = Menor Igual que. >= Mayor Igual que. = Igual que. BETWEEN Especificar un intervalo de valores. Si la condicin es de texto, hay que poner apstrofes (Lpez), si es numrico no se pone. GROUP BY Para separar registros seleccionados en grupos. Interesante si quieres sumar cada registro distinto de una columna. Si no aplicas el GROUP BY, cada suma ser el total de todos los registros, y no la suma de cada registro nico. SELECT nombre_columna1, SUM(nombre_columna2) FROM nombre_tabla GROUP BY nombre_columna1 ORDER BY Para ordenar los registros. SELECT nombre_columna1, nombre_columna2, nombre_columna3 FROM nombre_tabla ORDER BY nombre_columna1, nombre_columna3
VBA y programacin SQL Operadores Operador Descripcin AND TRUE si dos registros cumple la condicion. OR TRUE si uno de los registros cumple la condicion. NOT Negacin lgica. Devuelve el valor contrario. < Menor que. > Mayor que. <> Distinto de. < = Menor Igual que. >= Mayor Igual que. = Igual que. BETWEEN Especificar un intervalo de valores.
Excel y consultas SQL Variables SQL
Algunas veces querrs hacer consultas SQL y poner una variable como condicin. Esto se puede hacer perfectamente, solo hay que tener un poco de cuidado al formular la ortografa de la consulta. Ejemplo Sacamos el salario de un empleado que especificamos en una celda de Excel, o en una caja de texto de VBA etc. Luego convertimos este nombre a una variable llamada Empleado Ahora incluimos la variable en la consulta SQL. strSQL = SELECT Salario FROM tabla_Salarios WHERE Empleado LIKE & Empleado &