Notifications
Clear all

Barra de Progresso/Status

22 Posts
2 Usuários
0 Reactions
4,614 Visualizações
(@cs1508)
Posts: 0
New Member
Topic starter
 

Olá a todos,

Tenho um projecto em excel que está em funcionamento na empresa, num tablet windows. Tenho vindo a aprimorar alguns pormenores ao longo do tempo. Agora, gostaria de colocar uma barra de progresso/status quando é executada determinada macro. Devido ao facto de estar a funcionar no tablet a execução desta macro é um pouco lenta. Já vi na net vários exemplos inclusivamente aqui no planilhando, mas infelizmente não consigo adaptar ao meu projecto. Segue a macro em questão. Agradece desde já a vossa disponibilidade e ajuda, tem sido importante.

Private Sub Workbook_BeforeClose(Cancel As Boolean)
  Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"",True)"
    Application.DisplayFormulaBar = True
    ActiveWindow.DisplayHeadings = True
End Sub

Private Sub Workbook_Open()
 Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"",False)"
    Application.DisplayFormulaBar = False
    ActiveWindow.DisplayHeadings = False
    Application.DisplayStatusBar = False
End Sub


Sub Gravar()
Dim Data As Date
Dim Funcionario As String
Dim Obra As String
Dim Cliente As String
Dim HorasTotais As Double
Dim HorasExtras As Double

Dim UltimaCel As Integer

Dim RespostaConfirmaçãoAZero As Integer

Dim ConfirmaçãoRepetida As Integer
                
Application.ScreenUpdating = False
Application.EnableEvents = False


     If Range("G16") = 1 Then
     ConfirmaçãoRepetida = MsgBox("Já foram inseridas as horas para este funcionario na data de hoje, deseja prosseguir?", _
     vbYesNo + vbQuestion, "Confirmação de gravação de Horas")
     If ConfirmaçãoRepetida = vbNo Then
     MsgBox "Caso queira inserir horas de outro dia em falta, escreva o dia no campo Tarefa/Outras Anotações.", vbOKOnly + vbInformation, "Informação"
     Exit Sub
     End If
    End If

        
 Data = Range("G3").Value
 Funcionario = Range("B5").Value
 Obra = Range("B9").Value
 Cliente = Range("B7").Value
 HorasTotais = Range("C11").Value
    
    If Range("c11") = 0 Then
        RespostaConfirmaçãoAZero = MsgBox("Confirmar as Horas Totais de Hoje a 0 (zero)?", vbYesNo + vbQuestion, "Confirmação")
        If RespostaConfirmaçãoAZero = vbNo Then
        MsgBox "Insira as horas correctamente!", vbOKOnly + vbExclamation, "Correcção de Horas"
        Exit Sub
        End If
    End If
    
 HorasExtras = Range("C13").Value
  
 
Sheets("Registo de Ponto Diário").Activate

UltimaCel = Range("A1000000").End(xlUp).Row + 1


 Range("A" & UltimaCel).Value = Data
 Range("B" & UltimaCel).Value = Funcionario
 Range("C" & UltimaCel).Value = Obra
 Range("D" & UltimaCel).Value = Cliente
 Range("E" & UltimaCel).Value = HorasTotais
 Range("F" & UltimaCel).Value = HorasExtras
 


Sheets("Relógio de Ponto").Activate

  
Range("B9").Value = ""
Range("C11").Value = ""


ActiveWorkbook.Save
  
MsgBox "Gravado com Sucesso!", vbOKOnly + vbInformation, "Gravação de Dados"


Application.ScreenUpdating = True
Application.EnableEvents = True

End Sub

 
Postado : 13/05/2016 4:09 am
(@cs1508)
Posts: 0
New Member
Topic starter
 

Boa tarde,

Tenho a barra de progresso quase ficando como pretendo. Só ainda não consegui colocar avançando conforme a macro vai executando os seus passos.

Veja-se, por favor, o anexo. Ela vai avançando de 1 em 1%, mas sem estar ligada (penso eu), nas execuções da macro. Isto torna-se particularmente interessante, pois a execução da macro não demora sempre o mesmo - varia conforme a máquina em que está trabalhando.

Agradecimentos.

 
Postado : 24/05/2016 8:06 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa tarde!!!

Eu executei o código está rodando,não era isso ou dessa forma que vc precisa?

Veja a imagem em anexo.

Att

 
Postado : 24/05/2016 9:55 am
(@cs1508)
Posts: 0
New Member
Topic starter
 

Boa tarde!!!

Sim, está rodando. É quase isto. Mas está um pouco lento, e não está acompanhando a execução da macro de gravação, entende?

Obrigada!

 
Postado : 24/05/2016 10:12 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa tarde!!

Tente ajustar a rotina baixo.

Sub code()

Dim i As Integer, j As Integer, pctCompl As Single

For i = 1 To 10                 'Número de linhas (10), antes era 100
    For j = 1 To 6              'Interação de incremento em cada linha
        Cells(i, 150).Value = j 'Coluna ET que recebe os dados do laço
    Next j
    pctCompl = i
    progress pctCompl
Next i

End Sub

Att

 
Postado : 24/05/2016 10:18 am
(@cs1508)
Posts: 0
New Member
Topic starter
 

Boa tarde!!

Se alterar para:

For i = 1 To 10

chegando aos 10% finaliza.

se alterar este:

For j = 1 To 6 

para, por exemplo:

For j = 20 To 20 

, avança muito mais rápido, mas mesmo assim não avança conforme a macro - verificando dados e copiando para a guia Registo de Ponto Diário.

A minha macro tem cerca de 14 rotinas. Assim, por exemplo quando chegasse às 7, a barra deveria estar nos 50%, e assim por diante...como neste exemplo que encontrei na net:

Option Explicit
 
'========================================================================
'Cover Macro to Test the Progress Bar
'========================================================================
Sub TestTheBar()
'Disable Screen Updating and Events
Application.EnableEvents = False
Application.ScreenUpdating = False
 
'Declaring Sub Level Variables
Dim lngCounter As Long
Dim lngNumberOfTasks As Long
 
'Initilaizing Variables
lngNumberOfTasks = 10000
 
'Calling the ShowProgress sub with ActionNumber = 0, to let the
'user know we are going to work on the 1st task. Also, set a
'title for the form
Call modProgress.ShowProgress(0, lngNumberOfTasks, _
                   "Excel is working on Task Number 1", False, _
                    "Progress Bar Test")
 
For lngCounter = 1 To lngNumberOfTasks
    'The code for each task goes here
 
    '
 
    'Call the ShowProgress sub each time a task is finished to
    'the user know that X out of Y tasks are over, and that
    'the X+1'th task is in progress.
    Call modProgress.ShowProgress(lngCounter, lngNumberOfTasks, _
                    "Excel is working on Task Number " & lngCounter + 1, False)
Next lngCounter
 
'Enable ScreenUpdating and Events
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub

Mas não tenho conhecimentos suficientes para conseguir adaptar na minha macro.

Att.

 
Postado : 24/05/2016 10:36 am
(@cs1508)
Posts: 0
New Member
Topic starter
 

Boa tarde,

Será que alguém pode me ajudar?

Obrigada.

 
Postado : 01/06/2016 9:23 am
(@cs1508)
Posts: 0
New Member
Topic starter
 

Bom dia,

Finalmente, creio que consegui. Com a ajuda do alexandrevba e com as ajudas aqui viewtopic.php?t=10541&p=55735. Alterei o código para:

Sub code()

Dim i As Long
Dim Tarefas As Long
Dim pctCompl As Single

Tarefas = 15
pctCompl = 100 / Tarefas * i

For i = 1 To Tarefas
    progress pctCompl
    pctCompl = 100
    
    UserForm2.text.Caption = " " & i & " de " & Tarefas & " "
    
    Next i        
                       
End Sub

Obrigada pela ajuda!!

 
Postado : 03/06/2016 2:59 am
Página 2 / 2