locked
Progressbar no VBA RRS feed

  • Pergunta

  • Olá!

     

    Alguém poderia me ajudar a usar o Progressbar?

    Tenho um cadastro de transações onde as etapas de cada uma são iguais, gostaria de mostrar através de uma barra de progresso o seu andamento, levando-se em conta o preenchimento de campos do formulário.

    Ex.: Se o formulário tem 100 campos, e somente 25 foram preenchidos, a barra fica somente 25% preenchida.

    Não encontrei nenhum help no Excel...

     

    Aguardo ansiosamente uma ajuda.

     

    Obrigada.

    quinta-feira, 10 de julho de 2008 18:28

Respostas

  • Olá Panddora,

     

    veja o código de exemplo que montei para uma tela com 5 caixas de texto.

     

    Na abertura do form você define o valor mínimo e máximo do ProgressBar. Ao sair de cada textbox, atualiza a barra.

     

    Como você tem muitos controles, o ideal é usar algum nome seqüencial (Textbox1, Textbox2, etc.), ou então usar algum identificador nos controles que serão usados na contagem (colocar um "X" na propriedade Tag de todos eles, por exemplo).

     

    Code Snippet

    Option Explicit

     

    Private Sub AtualizaProgressBar()
    Dim i As Integer
    Dim intValue As Integer

    For i = 1 To 5
        If Me.Controls("Textbox" & i).Text <> "" Then
            intValue = intValue + 1
        End If
    Next i

    Me.ProgressBar1.Value = intValue
    End Sub

     

    Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Call AtualizaProgressBar
    End Sub

     

    Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Call AtualizaProgressBar
    End Sub

     

    Private Sub TextBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Call AtualizaProgressBar
    End Sub

     

    Private Sub TextBox4_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Call AtualizaProgressBar
    End Sub

     

    Private Sub TextBox5_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Call AtualizaProgressBar
    End Sub

     

    Private Sub UserForm_Initialize()
    Dim ctl As Control

    On Error GoTo ErrHandler

    Me.ProgressBar1.Min = 0
    Me.ProgressBar1.Max = 5

    ExitHere:
    Exit Sub

    ErrHandler:
    MsgBox Err.Description & vbCrLf & Err.Number & vbCrLf & Err.Source, vbCritical, "UserForm1-UserForm_Initialize"
    Resume ExitHere
    End Sub

     

     

     

     

    sexta-feira, 11 de julho de 2008 01:17
    Moderador
  • Olá,

     

    se os nomes não são padronizados, defina o Tag das 120 caixas de texto como "X", e faça a rotina de atualizar a barra de progresso assim:

     

    [code]

    Private Sub AtualizaProgressBar()
    Dim ctl As Control
    Dim intValue As Integer

    For Each ctl In Me.Controls
        If ctl.Tag = "X" Then
            If ctl.Text <> "" Then
                intValue = intValue + 1
            End If
        End If
    Next ctl
    Me.ProgressBar1.Value = intValue
    End Sub

    [/code]

     

    sábado, 12 de julho de 2008 00:28
    Moderador

Todas as Respostas

  • Olá Panddora,

     

    veja o código de exemplo que montei para uma tela com 5 caixas de texto.

     

    Na abertura do form você define o valor mínimo e máximo do ProgressBar. Ao sair de cada textbox, atualiza a barra.

     

    Como você tem muitos controles, o ideal é usar algum nome seqüencial (Textbox1, Textbox2, etc.), ou então usar algum identificador nos controles que serão usados na contagem (colocar um "X" na propriedade Tag de todos eles, por exemplo).

     

    Code Snippet

    Option Explicit

     

    Private Sub AtualizaProgressBar()
    Dim i As Integer
    Dim intValue As Integer

    For i = 1 To 5
        If Me.Controls("Textbox" & i).Text <> "" Then
            intValue = intValue + 1
        End If
    Next i

    Me.ProgressBar1.Value = intValue
    End Sub

     

    Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Call AtualizaProgressBar
    End Sub

     

    Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Call AtualizaProgressBar
    End Sub

     

    Private Sub TextBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Call AtualizaProgressBar
    End Sub

     

    Private Sub TextBox4_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Call AtualizaProgressBar
    End Sub

     

    Private Sub TextBox5_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Call AtualizaProgressBar
    End Sub

     

    Private Sub UserForm_Initialize()
    Dim ctl As Control

    On Error GoTo ErrHandler

    Me.ProgressBar1.Min = 0
    Me.ProgressBar1.Max = 5

    ExitHere:
    Exit Sub

    ErrHandler:
    MsgBox Err.Description & vbCrLf & Err.Number & vbCrLf & Err.Source, vbCritical, "UserForm1-UserForm_Initialize"
    Resume ExitHere
    End Sub

     

     

     

     

    sexta-feira, 11 de julho de 2008 01:17
    Moderador
  • Olá, Luiz

     

    Fiz o teste e funcionou perfeitamente. Restou-me uma dúvida: tenho uma média de 120 caixas de texto, como posso utilizar a propriedade tag se os nomes são totalmente diferentes? Há alguma saída neste caso?

     

    Obrigada pela ajuda!

     

    sexta-feira, 11 de julho de 2008 13:45
  • Olá,

     

    se os nomes não são padronizados, defina o Tag das 120 caixas de texto como "X", e faça a rotina de atualizar a barra de progresso assim:

     

    [code]

    Private Sub AtualizaProgressBar()
    Dim ctl As Control
    Dim intValue As Integer

    For Each ctl In Me.Controls
        If ctl.Tag = "X" Then
            If ctl.Text <> "" Then
                intValue = intValue + 1
            End If
        End If
    Next ctl
    Me.ProgressBar1.Value = intValue
    End Sub

    [/code]

     

    sábado, 12 de julho de 2008 00:28
    Moderador
  • Olá, Luiz

     

    Obrigada pela ajuda!

    Sem querer abusar e já o fazendo...como posso usar o for quando for variável. Por exemplo:

     

    Dim palavra1, palavra2, palavra3 as string

    For i=1 to 3

    if ("palavra" & i) <> "" then      (não sei como dizer que trata-se de uma variável)

    intvalue = intvalue + 1

    else: intvalue2 = intvalue2 + 1

    end if

    next i

     

    Quero utilizar em outro form esta estrutura, aproveitando a sua lógica de controls.

     

    Obrigada + uma x.

    terça-feira, 15 de julho de 2008 15:43