Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Si, sin duda. Mucha gente empieza por la grabación de macros, es decir grabar
una secuencia de comandos, para luego reutilizarla. Un buen ejemplo es
"Pegar - Valores", uno de los comandos VBA más utilizados. Luego se pasa a
una programación VBA mas compleja para buscar soluciones más íntegras.
¿Qué es VBA?
VBA significa Visual Basic for Applications. Es un lenguage de programación
que surge de Visual Basic (VB). Se podría decir que es un dialecto de VB. VBA
de Excel está adaptado a Excel, para trabajar con celdas, hojas, autofiltro etc
(es decir, los objetos de la aplicación Excel).
¿Puedo acceder a VBA?
Sí. VBA está incluido en el Excel 'normal y corriente'. Se instala con Excel por
defecto.
¿Porqué VBA?
VBA sirve para muchas cosas. Imagínate todas las tareas repetitivas que tienes
que ejecutar todos los días. Un ejemplo - siempre vas aplicando el mismo
formato a un grupo de celdas de un libro que te mandan todos los días. En vez
de hacer un monton de clicks para obtener este formato, puedes automatizar el
proceso, a un boton, o un atajo de teclado.
También puedes crear aplicaciones que importan datos desde el libro mayor,
reorganizan los datos, y crean informes personalizados para cada
departamento. Casi no hay límites.
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 (Beginner´s All-purpose Symbolic Instruction
Code, o Código de Instrucciones Simbólicas de Uso General para
Principiantes), el cual en su turno es un lenguage que tiene muchos años ya
(desde los años sesenta).
¿Existen varios VBAs?
VBA existe para todas las aplicaciones de Microsoft Office, y estas se llaman
'host aplicacions'. Así que hay VBA para Excel, otro para Word etc. Cada VBA
se parece al resto, pero también tienen diferencias, por servir distintos 'host
aplications'. Excel utiliza, por supuesto, VBA para Excel.
El editor VBA de Excel
El editor VBA sirve para controlar y manipular tu código VBA, tanto de macros
como de completas aplicaciones VBA y add-ins. Todo parece mucho a Visual
Basic, con la diferencia de que VBA tiene otros objetos (hoja, celda
etc)/métodos/eventos.
Contenido de un 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).
Excel Este Libro y las hojas del libro
Objetos
Módulos Contenedores para el código del proyecto
Formularios Tus propios formularios, con controles (botones, menús... +
código
Enlace Descripción
Tipos de Referencia de variables
variables
Declarar variables La importancia de declarar las variables.
Tipos de variables
Abajo presentamos los más frecuentes tipos de variable de Excel VBA.
Tipo Bytes Descripción Comentario
Byte 1 0-255 Integrales
positivos
Boolean 1 True/False Valores discretos
Integer 2 -32.768 hasta + ... Integrales
Long (long int.) 4 -2.147.483.648 hasta + ... Integrales
Single 4 -3,402823 E38 hasta + ... Decimales
Double 8 -1,79769313486232 E308 hasta + Decimales
...
Currency 8 15 díg. + 4 decimales Número, 4 dec.
Date 8 1-ene-100 hasta 31-dic-9999 Fechas
Object 4 referencia a objetos Ej. "Workbook"
String 10+ carácteres Ascii (texto) Texto
String (long. 1+ carácteres Ascii, longitud predef. Texto
fija)
Variant 16+ cualquier tipo de datos Cubre la mayoría
Declarar variables
¿Porqué declarar variables?
i = 1
Instrucción que repite las instrucciones hasta que una condición 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
intValor = 1
For i = 1 to 4 step 1
intValor = intValor + 2
Next i
• Inicio
• VBA
• Bucles
• For Each... Next
For Each... Next
Dim rngArea
Excel y Outlook
Excel por e-mail Mandar hoja Excel por e-mail.
Importar datos de Outlook a Importar datos de Outlook a Excel. (VBA)
Excel
'dimensiones
Dim xlApp As Excel.Application
Dim xlLibro As Excel.Workbook
Dim xlHoja As Excel.Worksheet
Dim varMatriz As Variant
Dim lngUltimaFila As Long
End Sub
A través de una API (instrucción Windows) podemos hacer que Excel arranque el Marcador
Telefónico.
Para usar tienes que marcar la celda con el nº, y luego dar marcar.
Configuraciones
Hay una parte del código, que se puede configurar, por si alguien quiere llamar desde un lugar
donde se trabaja con una central telefonica. Generalmente para tomar una linea te pide que
marques el (0).
'
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
End Sub
Objecto Application de Excel VBA
El objeto Application de VBA nos da información del usuario/máquina. En este artículo
presentaremos unas aplicaciones del un objeto muy básico de Excel/VBA: Application. Este
representa todo el conjunto del programa Excel y sus libros de trabajo.
Este marcado sirve para averiguar el idioma de Excel del usuario. La función
Application.International de Excel VBA nos ayuda.
Lo único es que hay que saber los marcadores de telefonía de los países para descodificar la
respuesta de la función. Ver por ejemplo esta lista aquí.
El código
Sub DeterminarPais()
CodigoPais = Application.International(xlCountryCode)
If CodigoPais = 1 Then MsgBox ("Hello")
ElseIf CodigoPais = 34 Then MsgBox ("Hola")
End If
End Sub
VBA y libros 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
Abrir libro Excel (ruta fija)
Workbooks.Open FileName:="C:\Trabajo\Informe.xls"
Abrir libro Excel (diálogo)
ActiveWorkbook.Sheets.Add Before:=Worksheets("Informe1")
Insertar hoja nueva (primera posición)
Sheets("Informe1").Copy After:=Worksheets(Worksheets.Count)
Mover hoja
Worksheets("informe5").Move After:=Worksheets("Informe4")
Ordenar hojas (orden alfabético)
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 'Informe'
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
Application.DisplayAlerts = True
Seleccionar primera hoja
ActiveWindow.ScrollWorkbookTabs Position:=xlFirst
Seleccionar última hoja
ActiveWindow.ScrollWorkbookTabs Position:=xlLast
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 código
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
End Sub
Este método no da 100% de seguridad. Si activamos la protección de los módulos VBA tenemos
bastante seguridad, pero hay que tener en cuenta que existen varios programas comerciales para
resolver el tema de palabras de paso de Excel.
Los procedimientos
Pon este código en el contenedor 'EsteLibro' del editor VBA (Herramientas - Macro - Editor VBA).
Luego tienes que poner que hojas/palabra de paso (ver 'Preparar modelo' del código).
'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
99:
'conectar Events
Application.EnableEvents = True
End Sub
'*************************************************
• Inicio
• VBA
• Ejemplos
Crear enlaces a las hojas Excel
Si nuestro libro Excel contiene muchas hojas (hasta 256) convendría hacer una lista de enlaces a
cada hoja. Esto puede ayudar mucho a los 'navegantes' de nuestros libros.
Y como siempre, esta lista se puede crear manualmente. O se puede recurrir a una macro de VBA,
cual tardará al máximo un par de segundos para concluir el trabajo.
Procedimiento
Empezamos con un libro Excel cualquier, pero que tenga por lo menos dos hojas. Luego vamos a
crear un módulo dentro de este libro. En este módulo escribimos el código.
Crear el módulo
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 - Módulo.
Doble click en el módulo nuevo, y a la derecha sale un espacio blanco, es para el código.
Herramientas - Referencias. Marca Microsoft ActiveX DataObjects x.x Library.
Ahora cierras el editor VBA, vuelves a Excel. Guardamos el libro.
El código
Sub Links_hojas()
'crear links
If wsHoja.Name <> wrsHojaActiva.Name Then
intFila = intFila + 1
End If
ProxHoja:
Next wsHoja
End Sub
Ejecutar macro
Para ejecutar esta macro entras a Herramientas - Macros. Allí encontrarás la macro
"Conectar_Excel_ADO". Marca esta, y "Ejecutar".
Macro VBA para eliminar vínculos Excel
Con esta macro podrás eliminar vínculos a otras hojas/libros.
Copia de seguridad
Guarda una copia de seguridad de tu libro. Hazlo porque nunca sabes.
Crear el módulo
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 - Módulo.
Doble click en el módulo nuevo, y a la derecha sale un espacio blanco, es para el código.
Herramientas - Referencias. Marca Microsoft ActiveX DataObjects x.x Library.
Ahora cierras el editor VBA, vuelves a Excel. Guardamos el libro.
El código
Sub QuitarVinculos()
i = 1
Do Until IsEmpty(varLink)
On Error GoTo 9
ActiveWorkbook.BreakLink Name:=varLink(i), _
Type:=xlLinkTypeExcelLinks
i = i + 1
Loop
End If
9:
End Sub
Ejecutar macro
Para ejecutar esta macro entras a Herramientas - Macros. Allí encontrarás la macro
"Conectar_Excel_ADO". Marca esta, y "Ejecutar".
Procedimiento
Empezamos con el libro de una o varias hojas. Luego vamos a crear un módulo dentro de este libro.
En este módulo escribimos el código.
Crear el módulo
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 - Módulo.
Doble click en el módulo nuevo, y a la derecha sale un espacio blanco, es para el código.
Herramientas - Referencias. Marca Microsoft ActiveX DataObjects x.x Library.
Ahora cierras el editor VBA, vuelves a Excel. Guardamos el libro.
Código
Sub Crear_archivos_de_hojas()
Application.ScreenUpdating = False
strStartHoja = ActiveCell.Worksheet.Name
'repetir bucle'
Next
Sheets(strStartHoja).Activate
Application.ScreenUpdating = True
End Sub
Ejecutar macro
Para ejecutar esta macro entras a Herramientas - Macros. Allí encontrarás la macro
"Conectar_Excel_ADO". Marca esta, y "Ejecutar".
Columnas de Excel y VBA
Presentamos unas macros para trabajar con columnas Excel desde Excel VBA.
Sub EncontrarUltimaColumna()
Dim intUltimaCol As Integer
Sub EncontrarUltimaColumna()
Dim intUltimaCol As Range
Sub SuprimirColumnas()
Dim cCount As Integer, c As Integer
Dim DeleteRange as Range
DeleteRange =("A1:B10")
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
En este caso se utiliza una macro, para que resalte el encabezado de las columnas filtradas.
El usuario tiene la posibilidad de elegir el color que prefiere. En este caso tiene unos ejemplos pero
se puede agregar más colores.
El código
Option Explicit
'
'ayudaexcel@ yahoo.com.ar
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
Filas Excel - macros VBA
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 revés)
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 vacías
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 vacías
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 condición
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 vacías por dos condiciónes X, Y
Procedimientos
Vamos a necesitar tres sencillas macros.
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.
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 instrucción
'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 código
Ahora, el módulo 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 instrucción
'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 método WAIT puedes hacer que un formulario se cierre después de un tiempo determinado.
Esto puede ser útil para presentar información al usuario ('La importación ha terminado con éxito', 'El
archivo está guardado' etc). El truco está en utilizar el método WAIT de VBA.
Procedimiento
Crea un formulario 'frmMensaje' con el mensaje que quieres que aparezca. Añade este código al
formulario. El ejemplo nos dice que la rutina se va a esperar ('Wait') hasta la hora
Now + TimeValue("00:00:04")
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 código.
frmMensaje.Show
En el ejemplo de abajo, el formulario se mostrará al abrir el libro (ponemos el código en el
contenedor de código VBA 'EsteLibro'.
De esta forma podemos añadir un medidor de progreso gráfico a la barra de estado de Excel.
El código
Option Explicit
Sub BarraDeProgreso()
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
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
Según el código VBA descrito arriba, Excel pondrá el tiempo en la celda A1. Para devolver
fragmentos (hora/minuto/segundo), emplea formulas como
= HORA("A1")
= MINUTO("A1")
= SEGUNDO("A1")
Formatos Excel y VBA
Redondear celdas
Cells.Select
With Selection.Font
.Name = "MS Sans Serif"
.Size = 10
End With
Líneas de división
ActiveWindow.DisplayGridlines = False
Indice de colores
Range("A1:B10").Interior.ColorIndex = 44
Cambiar entre estilos A1 / RC
Los colores forman parte del diseño del libro, son importantes para una buena presentación de un
informe. Pero por regla general tampoco se debe pasar utilizando demasiado color.
Para cambiar entre RGB y HEX necesitamos un Conversor RGB <> HEX.
Cambiar colores de la paleta Excel
Entonces, ¿qué podemos hacer para que Excel siempre tenga los colores definidos por ti? Una
solución sería crear una plantilla con nuestros formatos. Excel llamará esta plantilla al crear un libro
nuevo.
Otra solución es crear una macro cual nosotros podemos llamar cuando nos convenga. Esto nos da
un poco más de control. En este ejemplo cambiaremos los colores 40 y 41 (de los 56) de la paleta.
Selection.Interior.ColorIndex = 40
Selection.Interior.ColorIndex = _
xlNone/xlColorIndexAutomatic/xlColorIndexNone
ActiveWorkbook.ResetColors
Copiar colores de otro libro Excel
También se puede copiar (importar) la paleta de otro libro Excel. Para esto cambiamos la propiedad
Colors del libro.
ActiveWorkbook.Colors = Workbooks("C:\MiLibroDeColores.xls").Colors
Devolver colores del libro Excel 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.
En este ejemplo buscaremos en una lista de apellidos. En el ejemplo abajo, "Aban" nos devuelve
dos apellidos. Otro ejemplo sería 'queiro", c ual nos devolvería Abanquiero.
Preparamos la hoja
En celdas C5:C12 tenemos la lista en que buscar (celdas D5:D12 también pertenecen a la matriz.
En celdas G5:H5 el programa pondrá la lista "filtrada", allí no tienes que introducir nada.
Crear el módulo
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 - Módulo.
Doble click en el módulo nuevo, y a la derecha sale un espacio blanco, es para el código.
Ejecutar macro
Para ejecutar esta macro entras a Herramientas - Macros. Allí encontrarás la macro
"Buscar_Texto_En_Lista()". Marca esta, y "Ejecutar".
Código
Sub Buscar_Texto_En_Lista()
'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
'evaluación
lngResultado = InStr(1, Cells(n, 3), _
strObjetoBuscar, vbTextCompare)
'copiar/pegar
If lngResultado > 0 Then
Range(Cells(n, 2), Cells(n, 4)).Copy
Range( _
Cells(lngPegarFila, lngPegarColumna), _
Cells(lngPegarFila, lngPegarColumna + 2)) _
.Select
ActiveSheet.Paste
lngPegarFila = lngPegarFila + 1
End If
Next n
'aparcar
Application.CutCopyMode = False
Range("G2").Select
99:
End Sub
No siempre se sabe de antemano que celdas formarán parte del rango a sumar. Entonces tenemos
que expresar el rango de forma variable.
En Excel es fácil sumar este rango mediante una sencilla fórmula. Pero VBA no contiene ninguna
función igual. Entonces hay que hacer que VBA utilice las funciones de Excel.
Respuesta = Msgbox("Mensaje", _
Botones/íconos, "Título")
Nota los paréntesis en la segunda construcción.
Mensaje
Cualquier tipo de texto. Para crear un salto de línea empleamos el carácter vbCrLf.
Íconos
Puedes elegir entre los siguientes.
vbCritical
vbQuestion
vbExclamation
vbInformation
Título
Cualquier texto.
Devolver información
Si quieres que el programa utilice la respuesta del usuario, estas son las cifras que te devuelve.
Ok = 1
Cancel = 2
Abort = 3
Retry = 4
Ignore = 5
Yes = 6
No = 7
Ejemplos
Te ponemos unos ejemplos módelo para que te vayas acostumbrando a las diferentes messagebox.
Sub MessageBox()
msgbox "Actualización terminada:", _
vbOKOnly, "Información"
End Sub
Sub MessageBox()
msgbox "¿Quieres seguir?", vbYesNo, _
"Información importante"
End Sub
Sub MessageBox()
Dim intRespuesta As Integer
intRespuesta = msgbox("¿Quieres seguir?", _
vbQuestion + vbYesNo, "Información importante")
If intRespuesta = 6 Then
msgbox "Seguimos"
Else
msgbox "Terminamos"
End If
End Sub
Sub MessageBox()
msgbox "Actualización terminada:" & _
vbCrLf & vbCrLf & _
"- Importación de datos de venta." & vbCrLf & _
"- Cálculos de impuestos." & vbCrLf & _
"- Venta por proveedor." & vbCrLf _
, vbOKOnly, "Actualización terminada."
End Sub
Sub MessageBox()
msgbox "Actualización terminada:" & vbCrLf & _
vbCrLf & _
"- Importación de datos de venta." & vbCrLf & _
"- Cálculos de impuestos." & vbCrLf & _
"- Venta por proveedor." & vbCrLf _
, vbExclamation + vbOKOnly, _
"Actualización terminada."
End Sub
Calcular los Dígitos de control desde Excel
VBA
En este ejemplo presentamos un ejemplo de marcado VBA para calcular los dígitos de control de
una cuenta bancaria española
Tarea
Queremos un programa que nos calcule los dígitos de control de una cuenta.
Un ejemplo de cuenta
0123 - 4567 - xx - 0123456789
Entidad 0123
Oficina 4567
Dígitos de control Xx
Cuenta 0123456789
En el ejemplo arriba, los dígitos de control serían 81.
Empezamos
Abrimos un libro nuevo. Formateamos las celdas B3:E3 a TEXTO.
Crear el módulo
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 - Módulo.
Doble click en el módulo nuevo, y a la derecha sale un espacio blanco, es para el código.
Herramientas - Referencias. Marca Microsoft ActiveX DataObjects x.x Library.
Ahora cierras el editor VBA, vuelves a Excel. Guardamos el libro.
El código
Sub DC_check()
'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 sería " & TestValueDC & ".]", vbOKOnly, vbInformation
End If
'---------------------------------------------------
End Sub
Ejecutar macro
Para ejecutar esta macro entras a Herramientas - Macros. Allí encontrarás 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 fórmula matricial y condicional para sumar los meses tildados.
{=SUMA(SI($A$2:$A$13<>"";$C$2:$C$13;0))}
El código
El código debe escribirse en la misma hoja Excel, ver imagen.
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),
podríamos optar por la fórmula SUMAPRODUCTO, que además permite aplicar varias condiciones
de una manera fácil. / Anders J.
=SUMAPRODUCTO((A2:A13<>"")*C2:C13)
Explorador de informes
Resumen de este ejemplo de "Explorador de informes"
Este ejemplo nos nuestra, de cómo armar un explorador de informes en Excel, manejándonos desde
un Panel Principal. Esto nos permite dar una mejor estética a cualquier aplicación desarrollada en
Excel.
Instrucciones
Encontrarás un ejemplo real del
Explorador de archivos Excel en la carpeta de este curso en el servidor de UGA
Para ver el código utilizado, combine las siguientes Teclas:ALT + F11.
Importar tabla Access a Excel
Aquí explicamos cómo importar una tabla de una base de datos Access, a una hoja Excel.
Esta maniobra también puede realizarse desde los menús del propio programa Access. ¿Pero qué
pasa si tenemos que acceder a un archivo Access, y no tenemos el programa Access instalado?
Entonces podemos recurrir al código VBA, y programar una macro.
Además, esta importación tarda poquísimo - muy interesante si importamos muchas tablas al día.
El código
Sub Importar_Access()
'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
'crear la conexión
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 rótulos
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
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 método GetDefaultFolder nos deja acceder a las carpetas de Outlook, por ejemplo el de
los Contactos.
Parámetro Carpeta
3 Deleted Items (Elementos elimindos)
4 Outbox (Bandeja de salida)
5 Sent Items (Elementos enviados)
6 Inbox (Bandeja de entrada)
9 Calendar (Calendario)
10 Contacts (Contactos)
11 Journal (Diario)
12 Notes (Notas)
13 Tasks (Tareas)
16 Drafts (Borrador)
El código
Sub ImportarContactos()
'rotulos
Cells(1, 1) = "Nombre"
Cells(1, 2) = "E-mail"
Cells(1, 3) = "Título"
Cells(1, 4) = "Empresa"
Cells(1, 5) = "Tel (casa)"
Cells(1, 6) = "Tel (móbil)"
Cells(1, 7) = "Tel (trabajo)"
Cells(1, 8) = "Fax (trabajo)"
Cells(1, 9) = "Dir. (empresa)"
Cells(1, 10) = "Postal (empresa)"
Cells(1, 11) = "Ciudad (empresa)"
Cells(1, 12) = "País (empresa)"
Cells(1, 13) = "Dir. (casa)"
Cells(1, 14) = "Postal (casa)"
Cells(1, 15) = "Ciudad (casa)"
Cells(1, 16) = "País (Casa)"
End Sub
'
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
Configuraciones Hay que indicar la dirección a utilizar.
strEmail = "aaa.bbb@ccc.com"