Cómo mostrar una barra de progreso con un formulario de usuario en Excel

Resumen

Si tiene una macro de Microsoft Visual Basic para Aplicaciones que tarda mucho tiempo en finalizar, es posible que desee proporcionar al usuario una indicación de que la macro progresa correctamente. En este artículo se describe cómo crear una barra de progreso con un formulario de usuario en Microsoft Excel.

Más información

Microsoft proporciona ejemplos de programación con fines ilustrativos únicamente, sin ninguna garantía, ya sea expresa o implícita. Esto incluye, entre otras, las garantías implícitas de comerciabilidad e idoneidad para un fin determinado. Se considera que está familiarizado con el lenguaje de programación que se muestra y con las herramientas para crear y depurar procedimientos. Los ingenieros de soporte técnico de Microsoft pueden explicarle la funcionalidad de un determinado procedimiento. Sin embargo, no modificarán estos ejemplos para proporcionar una funcionalidad adicional o procesos de construcción para que se cumplan sus requisitos específicos.

Creación del formulario de usuario

En el ejemplo siguiente, una subrutina de Visual Basic rellena un gran rango de celdas con un número aleatorio. El indicador muestra que la macro se ejecuta correctamente.

  1. Abra un nuevo libro en Excel.

  2. En Microsoft Office Excel 2003 y en versiones anteriores de Excel, haga clic en Herramientas, seleccione Macroy, a continuación, haga clic en Editor de Visual Basic.

    En Microsoft Office Excel 2007, haga clic en Visual Basic en el grupo Código de la pestaña Desarrollador .

    Nota Para mostrar la pestaña Desarrollador en la cinta de opciones, siga estos pasos:

    1. Inicie Excel 2007, haga clic en el botón Microsoft Office y, a continuación, haga clic en Opciones de Excel.
    2. En el cuadro de diálogo Opciones de Excel , haga clic en Populary, a continuación, haga clic en para seleccionar la pestaña Mostrar desarrollador en la cinta de opciones .
  3. En el menú Insertar, haga clic en UserForm.

  4. Dibuje un control Etiqueta en el formulario de usuario.

  5. Cambie las siguientes propiedades del control Label a los siguientes valores: | Propiedad| Valor| |---------------|-----------------------------| | Título| Ahora se está actualizando. Espere...| Nota Si la ventana Propiedades no está visible, haga clic en Ventana propiedades en el menú Ver .

  6. Dibuje un control Frame en el formulario de usuario.

  7. Cambie las siguientes propiedades del control Frame a los siguientes valores: | Propiedad | Valor| |---------|--------------------| | Nombre FrameProgress|

  8. Dibuje un control Label en el control Frame.

  9. Cambie las siguientes propiedades del control Label a los siguientes valores: | Propiedad| Valor| |----------|---------------------------| | Nombre | LabelProgress| | BackColor |& H0000000FF&| | SpecialEffect |fmSpecialEffectRaised|

Escriba el código de macro.

  1. Haga doble clic en el formulario de usuario para abrir la ventana Código del formulario de usuario.

  2. En el módulo, escriba el código siguiente para el evento UserForm_Activate :

    Private Sub UserForm_Activate()
        ' Set the width of the progress bar to 0.
        UserForm1.LabelProgress.Width = 0
    
    ' Call the main subroutine.
        Call Main
    End Sub
    
    
  3. En el menú Insertar, haga clic en Módulo.

  4. En la ventana Código del módulo, escriba el código siguiente:

    Sub ShowUserForm()
        UserForm1.Show
    End Sub
    
    Sub Main()
        Dim Counter As Integer
        Dim RowMax As Integer, ColMax As Integer
        Dim r As Integer, c As Integer
        Dim PctDone As Single
    
    Application.ScreenUpdating = False
        ' Initialize variables.
        Counter = 1
        RowMax = 100
        ColMax = 25
    
    ' Loop through cells.
        For r = 1 To RowMax
            For c = 1 To ColMax
                'Put a random number in a cell
                Cells(r, c) = Int(Rnd * 1000)
                Counter = Counter + 1
            Next c
    
    ' Update the percentage completed.
            PctDone = Counter / (RowMax * ColMax)
    
    ' Call subroutine that updates the progress bar.
            UpdateProgressBar PctDone
        Next r
        ' The task is finished, so unload the UserForm.
        Unload UserForm1
    End Sub
    
    Sub UpdateProgressBar(PctDone As Single)
        With UserForm1
    
    ' Update the Caption property of the Frame control.
            .FrameProgress.Caption = Format(PctDone, "0%")
    
    ' Widen the Label control.
            .LabelProgress.Width = PctDone * _
                (.FrameProgress.Width - 10)
        End With
    
    ' The DoEvents allows the UserForm to update.
        DoEvents
    End Sub
    
    
  5. Vuelva a Excel.

  6. En Excel 2003 y en versiones anteriores de Excel, seleccione Macro en el menú Herramientas y, a continuación, haga clic en Macros.

    En Excel 2007, haga clic en Macros en el grupo Código de la pestaña Desarrollador .

  7. En el cuadro de diálogo Macro , haga clic para seleccionar ShowUserForm y, a continuación, haga clic en Ejecutar.

Aparece un cuadro de diálogo que tiene una barra de progreso roja. La barra de progreso aumenta a medida que la subrutina Principal rellena las celdas de la hoja de cálculo.

La subrutina ShowUserForm muestra el formulario de usuario. El procedimiento que se adjunta al evento Activate del formulario de usuario llama a la subrutina Main . La subrutina principal rellena las celdas con números aleatorios. Además, la subrutina llama a la subrutina UpdateProgressBar que actualiza el control Label en el formulario de usuario.

Nota Cuando se usa esta técnica, la macro tarda un poco más en finalizar las tareas previstas.