Mensajes personlizados mientras ejecuta procesos lentos

Mientras hace procesos lentos en Excel por ejemplo este, que muestre mensajes mientras hace procesos lentos o barras de progreso:

For Each Hojas In ActiveWorkbook.Worksheets
            'With Hojas
            'Hojas.Select
            celda = Hojas.Range("ZZ101").Value
            If celda = "B" Then
                For Each Rango In Hojas.Range("G81:P111,Z81:AK111")
                    If (Rango.Value <> "") Then Rango.Value = ""
                Next Rango
                'Hojas.Range.Activate
                'Hojas.Range("G81:U111").ClearContents
                'Hojas.Range("Z81:AK111").ClearContents
            End If
            'End With
        Next Hojas
Respuesta
2

Quedaría así con statusbar, te va a aparecer un mensaje en la esquina inferior izquierda de excel.

Sub macro()
    Application.StatusBar = False
    num_hojas = ActiveWorkbook.Worksheets.Count
    num_celdas = Range("G81:P111,Z81:AK111").Count
    num_h = 1
    num_c = 1
    For Each Hojas In ActiveWorkbook.Worksheets
        'With Hojas
        'Hojas.Select
        celda = Hojas.Range("ZZ101").Value
        If celda = "B" Then
            For Each rango In Hojas.Range("G81:P111,Z81:AK111")
                Application.StatusBar = "Procesando hoja número: " & num_h & " de: " & num_hojas & _
                                        ". Celda: " & num_c & " de: " & num_celdas
                If (rango.Value <> "") Then rango.Value = ""
                num_c = num_c + 1
            Next rango
            'Hojas.Range.Activate
            'Hojas.Range("G81:U111").ClearContents
            'Hojas.Range("Z81:AK111").ClearContents
        End If
        'End With
        num_h = num_h + 1
    Next Hojas
    Application.StatusBar = False
End Sub

Si lo que quieres es limpiar el rango, prueba con lo siguiente:

Sub macro2()
    Application.StatusBar = False
    num_hojas = ActiveWorkbook.Worksheets.Count
    num_celdas = Range("G81:P111,Z81:AK111").Count
    num_h = 1
    num_c = 1
    For Each Hojas In ActiveWorkbook.Worksheets
        'With Hojas
        'Hojas.Select
        celda = Hojas.Range("ZZ101").Value
        If celda = "B" Then
            Application.StatusBar = "Procesando hoja número: " & num_h & " de: " & num_hojas
            Hojas.Range("G81:P111,Z81:AK111") = ""
        End If
        'End With
        num_h = num_h + 1
    Next Hojas
    Application.StatusBar = False
End Sub
'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

¡Gracias! me idea es tipo un formulario que se muestre en pantalla y sirva para todos los procesos una única función que se pueda personalizar el mensaje según el proceso, muchas gracias.

1 respuesta más de otro experto

Respuesta
1

. 30.01.17 #VBA Mensajes de espera

Buenas tardes,

Hay un par de alternativas para lo que solicitas

a.- Un cuadro de texto que permanece oculto hasta que se activa la rutina y, ésta, se encarga de mostrar durante su ejecución y que oculta, nuevamente al terminar. Por ejemplo así:

b.- Un mensaje en la barra inferior de la pantalla como el que ves en la misma imagen y que dice: Un momento, preparando hojas, o más específico indicando en qué hoja está trabajando.

Ambas soluciones te las muestro integradas en la siguiente variante de tu rutina:

'... 
ActiveSheet.Shapes("Text Box 01").Visible = True '<-MUESTRA UN CUADRO DE TEXTO OCULTO  
Application.ScreenUpdating = False ' Detiene el refresco de pantalla en cada acción.  
For Each Hojas In ActiveWorkbook.Worksheets
'  
MensBarra = "ESPERE! Ajustando hoja: " & Hojas.Name 'Define mensaje a mostrar al pie  
Application.StatusBar = MensBarra 'muestra el mensaje al pie por cada hoja  
'  
            'With Hojas
            'Hojas.Select
            celda = Hojas.Range("ZZ101").Value
            If celda = "B" Then
                For Each Rango In Hojas.Range("G81:P111,Z81:AK111")
                    If (Rango.Value <> "") Then Rango.Value = ""
                Next Rango
                'Hojas.Range.Activate
                'Hojas.Range("G81:U111").ClearContents
                'Hojas.Range("Z81:AK111").ClearContents
            End If
            'End With
Next Hojas
'...
Application.StatusBar = False 'devuelve el mensaje normal de sistema  
Sheets(1).Shapes("Text Box 01").Visible = False 'oculta el cuadro de texto  

Coméntame si resuelve lo que necesitas -y, en tal caso, agradeceré que califiques mi contribución- o escribeme de nuevo aquí, si necesitas más apoyo con esto.

Un abrazo

Fernando

.

.

Ah! Desde luego, el nombre del Textbox puede ser distinto al del ejemplo y asumo que está creado en la hoja desde donde se ejecuta la rutina:

'... 
LaImagen = "Text Box 01" 'puedes cambiarlo si fuese otro  
'  
ActiveSheet.Shapes(LaImagen).Visible = True '<-MUESTRA UN CUADRO DE TEXTO OCULTO  
Application.ScreenUpdating = False ' Detiene el refresco de pantalla en cada acción.  
For Each Hojas In ActiveWorkbook.Worksheets
'  
MensBarra = "ESPERE! Ajustando hoja: " & Hojas.Name 'Define mensaje a mostrar al pie  
Application.StatusBar = MensBarra 'muestra el mensaje al pie por cada hoja  
'  
            'With Hojas
            'Hojas.Select
            celda = Hojas.Range("ZZ101").Value
            If celda = "B" Then
                For Each Rango In Hojas.Range("G81:P111,Z81:AK111")
                    If (Rango.Value <> "") Then Rango.Value = ""
                Next Rango
                'Hojas.Range.Activate
                'Hojas.Range("G81:U111").ClearContents
                'Hojas.Range("Z81:AK111").ClearContents
            End If
            'End With
Next Hojas
'...  
Application.StatusBar = False 'devuelve el mensaje normal de sistema  
ActiveSheet.Shapes(LaImagen).Visible = False 'oculta el cuadro de texto  

En esta versión, puedes colocar el nombre de ese objeto en la variable "LaImagen"

Saludos

Fer

.

Gracias! me idea es tipo un formulario que se muestre en pantalla y sirva para todos los procesos una única función que se pueda personalizar el mensaje según el proceso, muchas gracias.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas