Documente Academic
Documente Profesional
Documente Cultură
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.
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
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().
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..."
Application.ScreenUpdating = True
Application.StatusBar = "Ejecucin terminada."
El arreglo NombreDeArchivo almacenar los nombres de los archivos de Excel que estn
abiertos en un momento dado.
El arreglo NombreDeChart contendr los nombres de las grficas de la hoja de Excel en que
nos encontramos.
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.
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.
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
doClip.PutInClipboard
End Sub
Otros trucos
Existen trucos para optimizar el desempeo de Visual Basic, tales como:
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