Notifications
Clear all

Macro reabre arquivo

7 Posts
2 Usuários
0 Reactions
1,480 Visualizações
(@shroeder)
Posts: 0
New Member
Topic starter
 

Bom dia,

Estou a criar um arquivo e para evitar algumas modificações, e para dar um efeito diferente de visualização, estou tentar usar um código para fechar o programa se tentarem ver as abas. Este código executa logo que se abre o arquivo e a cada segundo repete.

O problema é o seguinte:

Se tiver outro arquivo xls aberto, a aplicação reabre sempre o arquivo até ter todos os arquivos fechados.

Tem como resolver?

Envio o exemplo em anexo.

Obrigado.

 
Postado : 01/03/2016 3:43 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

1) a linha de código:
activeworkbook.quit
não faz sentido... remova-a.

2) O arquivo é reaberto para rodar o código de novo, após 1 segundo. vc precisa desprogramar o próximo segundo antes de wb.close SaveChanges:=False
no seu módulo3, crie uma global para guardar o valor da próxima execução, assim:

Public ProximoHorario As Date

Sub Temporizador()
    ProximoHorario = Now + TimeValue("00:00:01")
    'Chama a rotina Separadores após 1 segundo
    Call Application.OnTime(ProximoHorario, "Separadores")
End Sub

E no seu módulo 2, cancele o próximo agendamento, e não reagende, assim:

Sub Separadores()
    'Código de sua macro aqui
Dim wb As Workbook
Dim Resultado As VbMsgBoxResult
dim Reagendar as Boolean

    Set wb = ThisWorkbook
    Reagender = True
    
    If Windows(wb.Name).DisplayWorkbookTabs = True Then
        Resultado = MsgBox("Tem a certeza que quer ver os separadores?", vbYesNo, "Dúvida")
        If Resultado = vbYes Then
            MsgBox ("Até breve!")
            Call Application.OnTime(EarliestTime:=ProximoHorario, Procedure:="Separadores", Schedule:=False)
            Reagendar = False
            wb.Close SaveChanges:=False
            
        Else
            ActiveWindow.DisplayWorkbookTabs = False
        End If
    End If

    'Chama a rotina temporizador, que executará a
    'SuaMacro após o tempo definido
    If Reagendar then Call Temporizador
End Sub

Dica:
Eu não usaria o esquema de reagendamento e o ontime, com uma pergunta no meio, é que se não for bem planejado, e o usuário demorar mais de um segundo para responder e o código for disparado de novo, pode dar merda.
Claro que aparentemente não é seu caso, mas só, tome cuidado e teste com pessoas que demoram pra responder. Se der tudo certo, então fechô !

FF

 
Postado : 01/03/2016 4:48 am
(@shroeder)
Posts: 0
New Member
Topic starter
 

Obrigado pela sua ajuda.

Algo não está funcionando ou eu não percebi bem.

Erro em anexo.

Cumprimentos,

 
Postado : 01/03/2016 5:23 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Falha minha.

Use este código, no módulo2:

Sub Separadores()
    'Código de sua macro aqui
Dim wb As Workbook
Dim Resultado As VbMsgBoxResult
Dim Reagendar As Boolean

    Set wb = ThisWorkbook
    Reagendar = True
    'Debug.Print "rodou: " & VBA.Format(ProximoHorario, "dd/mm/yyyy hh:mm:ss")
    If Windows(wb.Name).DisplayWorkbookTabs = True Then
        Resultado = MsgBox("Tem a certeza que quer ver os separadores?", vbYesNo, "Dúvida")
        If Resultado = vbYes Then
            MsgBox ("Até breve!")
            Reagendar = False
            wb.Close SaveChanges:=False
            
        Else
            ActiveWindow.DisplayWorkbookTabs = False
        End If
    End If

    'Chama a rotina temporizador, que executará a
    'SuaMacro após o tempo definido
    If Reagendar Then Call Temporizador
End Sub
 
Postado : 01/03/2016 6:33 am
(@shroeder)
Posts: 0
New Member
Topic starter
 

Com outro arquivo excel aberto, o código continua a reabrir o meu arquivo.

Apenas consigo fechar, quando fecho os outros arquivos.

Cumps.

 
Postado : 01/03/2016 8:30 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Tenta assim:

Sub Separadores()
    'Código de sua macro aqui
Dim wb As Workbook
Dim Resultado As VbMsgBoxResult
Dim Reagendar As Boolean

    Set wb = ThisWorkbook
    Reagendar = True
    If Windows(wb.Name).DisplayWorkbookTabs = True Then
        Resultado = MsgBox("Tem a certeza que quer ver os separadores?", vbYesNo, "Dúvida")
        If Resultado = vbYes Then
            MsgBox ("Até breve!")
            Reagendar = False
            wb.Close SaveChanges:=False
            
        Else
            Windows(wb.Name).DisplayWorkbookTabs = False
        End If
    End If

    'Chama a rotina temporizador, que executará a
    'SuaMacro após o tempo definido
    If Reagendar Then Call Temporizador
End Sub
 
Postado : 01/03/2016 9:06 am
(@shroeder)
Posts: 0
New Member
Topic starter
 

Continua a reabrir o arquivo.

Desculpa a perda de tempo.

Cumps.

 
Postado : 01/03/2016 10:02 am