jueves, 10 de mayo de 2018

VBA: El objeto Application en Excel

Me gustaría repasar uno de los objetos de Excel menos conocidos pero más amplios: el objeto Application.

Sobre este objeto Application podemos trabajar con multitud de eventos, métodos y propiedades.
Son tantos que he optado por mostrar un corta de lista de los más frecuentes.


Comenzaré por algunos de los métodos más interesantes (a mi elección):
1- Application.Calculate: que permite forzar el recálculo del libro completo, una hoja o un rango específico.

'Todos los libros abiertos 
Application.Calculate
'o sencillamente 
Calculate

'Una hoja de cálculo determinada 
Worksheets(1).Calculate

'Un rango específico 
Worksheets(1).Range("A1:E10").Calculate



Otro método:
2- Application.Evaluate: de manera similar a INDIRECTO convierte un nombre o texto que siga la convención de nomenclatura de Excel (la longitud del nombre debe ser menor o igual a 255 caracteres) en un objeto o un valor...

Importante!: El uso de corchetes (por ejemplo, "[A1:D13]") equivale a llamar al método Evaluate con un argumento de cadena. Por ejemplo, son equivalentes:

[A13].Value = 1313
Evaluate("A13").Value = 1313

Vble = [COS(90)]
Vble = Evaluate("COS(90)")

Set celda = Workbooks("Libro1.xlsm").Sheets(1).[A1]
Set celda = Workbooks("Libro1.xlsm").Sheets(1).Evaluate("A1")



Otro método más:
2- Application.Quit: sale y cierra la aplicación Excel (no únicamente los libros de trabajo).
Si hubiera algún libro abierto, Excel mostrará un cuadro de diálogo para preguntarnos si queremos guardar los cambios... igual que si cerráramos manualmente la aplicación.

Application.Quit



Otro método más:
2- Application.Union: para componer rangos a partir de otros ya existentes

Set RangoUnion = Application.Union(Range("A1:A13"), Range("C1:C13"))
RangoUnion.Formula = "Excelforo"



Pasaremos a continuación a recorrer algunas propiedades interesantes.

1- Application.Calculation: que permite modificar la opción de cálculo (Automático, Manual o Automático excepto tablas de datos).

2- Application.CalculateBeforeSave: indicaremos True para que los libros se calculen antes de guardarlos en el disco
OJO:si la propiedad Calculation se establece como xlManual.

3- Application.CalculateBeforeSave: indicamos cuál es la tecla habilitada para interrumpir el recálculo de nuestras fórmulas (xlAnyKey, xlNoKey o xlEscKey).

Application.Calculation = xlCalculationAutomatic
Application.CalculateBeforeSave = True
Application.CalculateBeforeSave = xlEscKey



4- Application.Caption: Devuelve o establece un valor String que representa el nombre que aparece en la barra de título de la ventana principal de Microsoft Excel (es la parte superior de Excel... donde encontramos el nombre del libro de trabajo).
Por defecto, si no establecemos un nombre o si se establece el nombre en blanco (Application.Caption = "") , esta propiedad devuelve el texto "Excel".)

Application.Caption = "Aprendiendo VB con Excelforo"




Otra propiedad curiosa:
5- Application.Cursor: Cambia la tipología del icono del cursor entre:
xlDefault-El puntero predeterminado.
xlIBeam-El puntero en i.
xlNorthwestArrow-El puntero flecha noroeste.
xlWait-El puntero reloj de arena.
La propiedad Cursor no se restablecerá automáticamente cuando la macro termine de ejecutarse.
Debereremos restablecer el puntero xlDefault antes de que la macro detiene su ejecución.

Sub CambioCursor()
'xlDefault .El puntero predeterminado.
'xlIBeam .El puntero en i.
'xlNorthwestArrow .El puntero flecha noroeste.
'xlWait .El puntero reloj de arena.
'La propiedad Cursor no se restablecerá automáticamente cuando la macro termine de ejecutarse.
'Deberá restablecer el puntero xlDefault antes de que la macro detiene su ejecución.

 Application.Cursor = xlIBeam
 For x = 1 To 100
 For y = 1 To 100
    Range("A1").Value = x + y
 Next y
 Next x
 Application.Cursor = xlDefault

End Sub



6- Application.DecimalSeparator: para configurar los separadores decimales o de miles de nuestro libro...

Sub CambioSeparadoresSistema()

Range("A1").Formula = "1,234,567.89"
MsgBox "procedemos al cambio..."

'definimos los nuevos separadores
Application.DecimalSeparator = "-"
Application.ThousandsSeparator = " "
'y aplicamos
Application.UseSystemSeparators = False

End Sub



7- Application.DisplayAlerts: daremos valor True para que Excel muestra ciertos mensajes y avisos mientras se ejecuta una macro; y False para suprimir los mensajes y los mensajes de alerta mientras se ejecuta una macro. Cuando un mensaje requiere una respuesta, Microsoft Excel elige la respuesta predeterminada.

'se cierra el libro y no se solicita al usuario que guarde los cambios. 
'No se guardan los cambios realizado en Libro1.xlsm !!
Application.DisplayAlerts = False 
Workbooks("Libro1.xlsm").Close 
Application.DisplayAlerts = True



8- Application.Caption: valor True si los eventos están habilitados para el objeto especificado.
Asociado normalmente a eventos de nuestra hoja de cálculo o objetos ActiveX
OJO por que no es funcional para eventos dentro de un userForm!!

'En este ejemplo deshabilita los eventos antes de que se guarde un archivo para que no se produce el evento BeforeSave
Application.EnableEvents = False 
ThisWorkbook.Save 
Application.EnableEvents = True



9- Application.ScreenUpdating: True si está activada la actualización/refresco de la pantalla.
Acelera la ejecución de las macros...
Recomendable finalizar nuestra macro dando valor False.

'veamos un ejemplo ocultando columnas
Sub TestAceleración_ScreenUpdating()
Dim elapsedTime(2)
'activamos el refresco de pantalla
Application.ScreenUpdating = True
For i = 1 To 2
     'para el segundo caso lo desactivamos
    If i = 2 Then Application.ScreenUpdating = False
    startTime = Time
    Worksheets("Hoja1").Activate
    'recorremos todas las columnas de la hoja
    For Each c In ActiveSheet.Columns
       'si la columna es par
       If c.Column Mod 2 = 0 Then
           'la ocultamos
           c.Hidden = True
       End If
    Next c
    stopTime = Time
    elapsedTime(i) = (stopTime - startTime) * 24 * 60 * 60
Next i
'lo dejamos activo
Application.ScreenUpdating = True
'y mostramos los tiempos
MsgBox "Tiempo transcurrido, screenupdating ON: " & elapsedTime(1) & " segundos." & vbCrLf & _
 "Tiempo transcurrido, screenupdating OFF: " & elapsedTime(2) & " segundos."
End Sub

VBA: El objeto Application en Excel



Y la última propiedad a comentar (por no eternizar la lista):
10- Application.Visible: True o False para determinar si el objeto (nuestra aplicación) está o no visible a ojos del usuario...

'Hacemos Excel invisible.. pero operativo.
Application.Visible = False

'forzamos la espera de 13 segundos
Application.Wait Now + TimeValue("00:00:13")
'con un mensajito
MsgBox "sigo operativo"

'y terminamos haciendo visible la aplicación
Application.Visible = True



Por supuesto hay muchos más.. y te invito a investigar
;-)

No hay comentarios:

Publicar un comentario