Sunteți pe pagina 1din 10

Trucos y tretas en Excel VBA para

programadores
Comstar
(13/12/2011)7 comentarios

Suscribirte
Guardar
Este post no est hecho para novatos que no sepan nada del macros de Excel, sino aquellos
que saben algo de programacin de Visual Basic. Si eres nefito en macros de Excel en Visual
Basic, deberas ver mi post Excel VBA y macros: Una herramienta muy til para trabajar hojas
de clculo (1). Me han de perdonar la manera en que aparece el cdigo, pero es un problema
en la manera en que aparece el cdigo HTML para desplegar cdigo con indentacin en este
sitio.
Especialmente en finanzas o en bolsa, pero tambin en negocios de todo tipo, programar
macros de Excel suele ser sumemante til y por eso he querido deicar este post a transmitir
algunos trucos para ahorrarte tiempo. Cuando programamos cdigo para macros de Excel
VBA a menudo nos encontramos con que los detalles de cmo invocar tal o cual cosa de
Excel termina siendo muy crptica y debes navegar por foros, tutoriales o incontables pginas
ininteligibles de Microsoft que no te responden lo que andas buscando.
Si sabes Visual Basic, lo ms lgico es que para elaborar macros, trates de grabar una macro
primero, y luego empiezas a ver el cdigo de muestra para ver cmo hacer determinadas
cosas. En este post se pretende proveer trucos de programacin en Excel VBA para efectuar
tareas que no se pueden derivar del cdigo grabado en una macro en Excel. Estos trucos son
el resultado de resolver una serie de problemas que en su momento significaron un dolor de
cabeza.

Obtener valor de una celda


Cells(4,5)=23
x = Cells(4,5)+1

Este ejemplo inserta el valor 23 en la celda de la fila 4 y columna 5. Luego la variable x toma
ese valor y le suma 1. Cabe aadir que cada vez que llamamos una celda, una cantidad muy
grande de cdigo de Excel es invocada, de modo que si piensas trabajar con muchas celdas o
muchas veces con la misma celda, es mejor que pases los valores a variables, en lugar de
llamar a la celda en s misma.
Cells(2,3).Select
Selection.HorizontalAlignment = xlCenter
Selection.VerticalAlignment = xlCenter

En este ejemplo, la celda de la fila 2 columna 3 es seleccionada, y la seleccin luego es objeto


de centrado vertical y horizontal usando Selection.

Usando rangos
Pasar de la notacin de fila y columna a la de celdas suele ser un poco incmodo.
Normalmente para seleccionar un rango usaramos algo como esto:
Range("A5:B8").Select

Como has visto, lo que est procesando la funcin Range() entre comillas es una hilera de
caracteres. Para efectos de escribir cdigo, podemos usar esta expresin equivalente:
Range(Cells(5,1),Cells(8,2)).Select

Convertir nmeros en letras (pasar de la notacin fila 5 columna 1 a "A5") suele ser
sumamente incmodo. Para ello he construido una funcin que hace el trabajo.
Private Function GetColumnLetter(index) As String
Dim FL, LL As Long
GetColumnLetter = ""
LL = (index - 1) Mod 26 + 65
If LL > 63 Then GetColumnLetter = Chr(LL)
If index > 26 Then
FL = Int((index - 1) / 26) + 64
GetColumnLetter = Chr(FL) & GetColumnLetter
End If
End Function

La funcin convierte el nmero en letras, en caracteres. Cabe anotar que slo sirve para llegar
hasta columna ZZ, de modo que si se pasa de esa columna, esta funcin no te servir. Para
llamar esta funcin con las mismas coordenadas (5,1) y (8,2) haras algo como esto para
convertir en hilera:
Range(GetColumnLetter(5) & Format(1,"0") & ":" & GetColumnLetter(8) &
Format(2,"0")).Select

Como habrs notado he usado la funcin Format() que evita que se agreguen espacios al
convertir de nmero a hilera, como pasara con la funcin Str().

Ventana emergente para que el usuario


ingrese un rango
Si quieres que aparezca una ventana emergente con la cual puedas pedir al usuario que
seleccione un rango de datos, puedes usar el cdigo que se muestra a continuacin. Lo que

se hace es declarar un objeto de tipo Range llamado celdasSeleccionadas. A ese objeto se le


asigna el resultado de la funcin Application.InputBox que despliega la ventana emergente que
solicita la informacin al usuario. Si el usuario no ingresa ningn rango, el valor que tendr el
objeto es Nothing.
El comando On Error Resume Next indica que si ocurre un error, entonces ignore el error y
proceda conla siguiente instruccin. El comando On Error Goto 0 indica que se cancela la
deteccin de errores. El comando Msgbox despliega informacin en una ventana emergente.
He aqu el cdigo:
Dim celdasSeleccionadas As Range
On Error Resume Next
Set celdasSeleccionadas = Application.InputBox(prompt:="Seleccione un
rango de celdas", Type:=8)
On Error GoTo 0
If celdasSeleccionadas Is Nothing Then
'Aqu va el cdigo que se ejecuta si no se selecciona ninguna
celda.
'En este caso se despliega una ventana emergente con un mensaje.
MsgBox "No se ha seleccionado ninguna celda."
Else
'Aqu va el cdigo que se ejecuta si se se seleccion celdas.
'En este caso se despliega una ventana emergente con el resultado
de la suma de celdas.
MsgBox
Application.WorksheetFunction.Sum(celdasSeleccionadas.Cells)
End If

Como habrs notado en este cdigo lo que se hace si el usuario digita un cdigo es desplegar
el valor de la suma de todos los valores del rango usando la
funcin Application.WorksheetFunction.Sum, pero t puedes hacer que haga algo distinto.
Si quisieras obtener el valor contenido en el rango seleccionado puedes usar este cdigo.
MiVariable = celdasSeleccionadas.Value
En este caso el contenido del rango se almacena en una variable llamada MiVariable.

Acelerar la ejecucin
Cuando un programa corre, todo lo que tiene que ver con actualizacin de pantalla es
sumamente lento, y lo mejor es desconectar toda actualizacin de video. Para ello debes
agregar el siguiente cdigo al inicio de la macro.
Application.ScreenUpdating = False
Application.DisplayStatusBar = True
Application.StatusBar = "Iniciando..."

Y este cdigo al final.

Application.ScreenUpdating = True
Application.StatusBar = "Ejecucin terminada."

Application.ScreenUpdating se encarga de encender y apagar la actualizacin de


video. Application.DisplayStatusBar = True habilita la barra de estado que est en la parte
inferior de la ventana de Excel, y all despliegas mensajes asignando una hilera
a Application.StatusBar. La idea de usar la barra de estado es que si la ejecucin de la macro
tarda mucho, es bueno que el usuario sepa que la macro est trabajando, y que no se ha
quedado atascada.
No hay nada que fastidie ms que tener un programa atascado frente a uno. Por eso sera
bueno que dentro de la macro agregues otros mensajes donde el usuario pueda ver que la
macro va caminando, pero si pones mensajes con demasiada frecuencia eso ralentizar la
ejecucin, porque como dijimos, la actualizacin de video consume mucho tiempo de la
mquina.
Esto es especialmente til cuando vas a correr una macro que pasa de un libro de Excel a otro
o que se mueve mucho a lo largo de las pginas o celdas de manera muy intensiva.

Obtener posicin de la ltima celda


Cuando tienes hojas de Excel de tamao variable y necesitas ubicar la ltima celda
ocupada (la que est ms abajo y ms a la derecha), puedes usar lo siguiente:
ActiveCell.SpecialCells(xlLastCell).Select
UltimaFila = ActiveCell.Row
UltimaColumna = ActiveCell.Column

Si buscas en Internet acerca de cmo obtener posicin de la ltima celda, encontrars


maneras muy diversas. Sin embargo, esta es la mejor que he encontrado. Si agregas valores
ms all de la ltima celda, el valor se actualiza. El nico problema es que si borras filas o
columnas, este nmero no cambiar, sino hasta que abras de nuevo el archivo de Excel. Sin
embargo eso es mejor que nada, y puedes verificar si encuentras celdas en blanco, as que
eso no debera ser problema.

Obtener los nombres de libros de Excel


abiertos.
En ocasiones ocupas una lista de los libros de Excel que estn abiertos. Para ello te vales del
objeto Workbooks de Excel.
Dim NombreDeArchivo() as String
Redim NombreDeArchivo(Workbooks.Count-1)
For i = 1 To Workbooks.Count
NombreDeArchivo(i-1) = Workbooks.Item(i).Name
Next i

El arreglo NombreDeArchivo almacenar los nombres de los archivos de Excel que estn
abiertos en un momento dado.

Obtener la lista de pginas del libro de


Excel
Puedes usar el siguiente cdigo.
Dim NombreDePagina()
Dim Cantidad as Long
Cantidad = Sheets.Count
redim NombreDePagina(n)
For i = 1 To Cantidad
NombreDePagina(i) = Sheets(i).Name
Next i

Los nombres se almacenan en el arreglo NombreDePagina.

Obtener los nombres de las grficas


(charts) que hay en una pgina de Excel
Hay ocasiones en que ocupas buscar todas las grficas contenidas en una pgina de Excel.
para ello te vales de ActiveSheet.ChartObjects
Dim NombreDeChart()
Redim NombreDeChart(ActiveSheet.ChartObjects.Count-1)
For i = 1 To ActiveSheet.ChartObjects.Count
NombreDeChart(i-1) = ActiveSheet.ChartObjects(i).Name
Next i

El arreglo NombreDeChart contendr los nombres de las grficas de la hoja de Excel en que
nos encontramos.

Obtener el nombre del libro de Excel en


que te encuentras actualmente
Existen algunas situaciones donde ocupas saber el nombre del libro de Excel en que te
encuentras actualmente.
LibroActual = ActiveWorkbook.Name
El nombre de la hoja actual ser guardado en la variable LibroActual.

Cambiar de libro o de hoja


Si deseas pasarte a otro libro abierto u otra hoja, puedes usar el siguiente cdigo.

Workbooks("MiLibro.xls").Activate
Sheets("Sheet1").Select

Este cdigo har que te pases al libro de Excel MiLibro.xls y a la pgina Sheet1 de ese libro.
Como ves, el valor entre comillas puede ser reemplazado por una variable tipo String si lo
deseas.

Cmo lidiar con libros de


Excel protegidos por password
If ActiveSheet.ProtectContents Then
ActiveSheet.Unprotect Password:="XYZ"
End If

Este cdigo se encargar de eliminar la proteccin contra password. En este caso el


password es XYZ. Cuando trabajas con hojas protegidas con password, obtendrs errores al
tratar de acceder a material protegido y por eso debes desproteger la hoja para trabajar en
ella.

Enviar un correo con archivo adjunto


Si quieres generar un correo y pegarle un archivo adjunto, puedes usar el siguiente cdigo:
Dim oLook As Object
Dim oMail As Object
Set oLook = CreateObject("Outlook.Application")
Set oMail = oLook.createitem(0)
With oMail
.To = "mipersona@dominio.com"
.body = "Este es el cuerpo del mensaje. Ver archivo adjunto"
.Subject = "Asunto. Envio de archivo adjunto"
.Attachments.Add ("C:\MiArchivo.xlsx")
.Send
End With
Set oMail = Nothing
Set oLook = Nothing

Este cdigo buscar el archivo MiArchivo.xlsx ubicado en C:\, construir el mensaje y lo


enviar a la direccin mipersona@dominio.com. La lgica de este cdigo usa un poco de
programacin orientada a objetos. oLook es un objeto que se encarga de manejar la
aplicacin Outlook, y oMail es un objeto que se encarga de manejar el correo.

Ocultar una hoja e impedir que el


usuario la vea

Si quieres ocultar una hoja de Excel para que el usuario no la pueda ver, y no pueda mostrar
su contenido usa este cdigo:
Set hide_sheet = Sheet1
hide_sheet.Columns.Hidden = True
hide_sheet.Visible = False

El cdigo lo que hace es ocultar todas las columnas de la hoja Sheet1 y luego oculta la hoja.
Cabe notar que Sheet1 no es el nombre de la hoja visible para el usuario, sino el nombre del
objeto que aparece en el editor de cdigo de Excel VBA fuera de los parntesis.

Crear un botn en una hoja de clculo


Si quieres crear un botn:
ActiveSheet.Buttons.Add ActiveCell.Left, ActiveCell.Top,
ActiveCell.Width, ActiveCell.Height
El cdigo crea un botn sobre la celda en la que ests ubicado actualmente.

Cargar, refrescar, salvar y cerrar una


hoja de clculo
Si quieres efectuar esas tareas:
Workbooks.Open Filename:="C:\MiArchivo.xlsx", UpdateLinks:=3
Workbooks("MiArchivo.xlsx").RefreshAll
ActiveWorkbook.Save
ActiveWindow.Close

El cdigo efecta las cuatro tareas descritas en ese orden.

Cmo usar el portapapeles


El portapapeles no viene incluido en la versin bsica de Excel VBA, as que primero tenemos
que configurar algunas cosas.

Ve al editor de Visual Basic (Alt F11).


Selecciona Tools > References

Activa Microsoft Forms Object Library y presiona Ok.

Si no aparece Microsoft Forms 2.0 Object Library en la lista, quizs quieras usar el botn
Browse para buscar el archivo FM20.DLL que se encuentra en la ubicacin en disco duro que
se muestra en la imagen.
Ahora que ya configuramos todo, veamos el cdigo.
Primero deberas declarar el objeto de portapapeles (en este caso le llamaremos doClip)
Dim doClip As DataObject
Este sera el mtodo para crear el portapapeles en memoria.
Sub CrearClipboard()
Set doClip = New DataObject
End Sub

Con este mtodo puedes destruir el objeto portapapeles en memoria para liberar espacio.
Sub DestruirClipboard()
Set doClip = Nothing
End Sub

Con este mtodo copias un texto al portapapeles.


Sub CopiarAlClipboard(sTexto As String)
doClip.Clear
doClip.SetText sTexto

doClip.PutInClipboard
End Sub

Con esta funcin extraes el texto del portapapeles.


Function ClipboardTexto() As String
doClip.GetFromClipboard
ClipboardTexto = doClip.GetText
End Function

Cmo configurar rea de impresin


Para configurar el rea de impresin ocupas la orientacin portrait o landscape. He puesto las
muestras de las lneas para ambos casos, aunque t slo ocuparas una. Si vas a ajustar a
una o ms pginas horizontal o verticamente, primero necesitas poner el modo Zoom en
apagado y luego puedes configurar los ajustes. Y tambin debes delimitar el rea de
impresin que en este ejemplo es desde A1 hasta H25.
ActiveSheet.PageSetup.Orientation = xlPortrait
ActiveSheet.PageSetup.Orientation = xlLandscape
ActiveSheet.PageSetup.Zoom = False
ActiveSheet.PageSetup.FitToPagesWide = 1
ActiveSheet.PageSetup.FitToPagesTall = 1
ActiveSheet.PageSetup.PrintArea = "A1:H25"

Cmo crear una lista de archivos y


directorios
Para obtener una lista de archivos, ve al siguiente sitio: List all files in a directory.
Para listar archivos y subdirectorios ve al sitio List folders and subdirectories.

Otros trucos
Existen trucos para optimizar el desempeo de Visual Basic, tales como:

Evitar al mximo el uso de propiedades de controles. Las celdas de Excel son


controles. Los forms (formulario, ventana) y los controles sobre un form son controles. Usar
propiedades de controles agrega mucha carga de procesamiento innecesario. Por ejemplo,
el valor de una celda es una propiedad del control llamado celda. El texto de un control de
texto es una propiedad. Hay que minimizar la referencia a controles hasta donde sea posible,
pasando los valores de los controles a una variable, se trabaja todo en la variable, y al final se
actualiza la propiedad del control con el valor final de la variable.
Apaga la actualizacin de video, porque el tiempo de actualizar la pantalla
innecesariamente consume enormes cantidades de tiempo de procesamiento.

Evitar el uso de variables tipo Variant. Estas variables generalmente aparecen cuando
no se declaran las variables. Para hacer que el Visual Basic muestre un error cuando vea
variables no declaradas, puedes poner esto al inicio de cada mdulo.
Option Explicit

Espero que estos trucos te sirvan, porque a m me han servido mucho.

S-ar putea să vă placă și