Tópicos relacionados a códigos VBA, gravação de macros, etc.
Por AndersonLeal 18 Jan 2018 às 13:58
Membro 2 Estrelas
Mensagens: 209
Reputação: 73
#29508
Olá,

Marquei meu outro tópico como respondido pois achava que tinha encontrado a solução para o meu problema, porém eu estava enganado. Abaixo o link, tem um arquivo de exemplo:

viewtopic.php?f=12&t=6060

O problema é que estou utilizando uma sub recursiva para pesquisar nas pastas do computador. Apenas a título de curiosidade, uma sub recursiva é uma rotina que chama a si mesma um determinado nº de vezes, também pode ser usada em funções.

A instrução
Application.EnableCancelKey = xlErrorHandler
envia para o procedimento em execução um erro interceptável com o código 18, daí utilizo
On Error GoTo Sair
para tratar o erro gerado após pressionar as teclas CTRL+BREAK . Na linha Sair apenas coloco um
Exit Sub
para abandonar a macro, mas como trata-se de uma rotina recursiva a sub voltar a chamar a si mesma e continua a pesquisa até percorrer todas as subpastas da pasta principal.

O que quero fazer é que ao pressionar CTRL+BREAK eu interrompa de alguma forma essa sub recursiva, parando assim a pesquisa, pois dessa forma se a macro estiver demorando muito para realizar a pesquisa, o usuário pode interromper a mesma a qualquer momento via teclado.

Se for possível percorrer todas as subpastas de um diretório sem utilizar a recursividade também resolve meu problema.

Agradeço muito se alguém puder me orientar como proceder.

Se precisarem de um arquivo de exemplo é só avisar.

Atenciosamente,
Anderson Leal
Por babdallas 21 Jan 2018 às 14:32
Membro 5 Estrelas
Mensagens: 2201
Reputação: 966
#29565
Anexe um arquivo de exemplo, por favor.
Por AndersonLeal 23 Jan 2018 às 12:32
Membro 2 Estrelas
Mensagens: 209
Reputação: 73
#29621
Olá,

Estou anexando um arquivo de exemplo.

A rotina para parar a execução seria do botão Parar. Selecione uma pasta do seu computador (botão com os três pontinhos (...) ao lado do textbox) e depois clique em Buscar.

A rotina Procurar_Arquivos é a sub recursiva que gostaria de interromper via teclado.

Qualquer dúvida estou a disposição.

Atenciosamente,
Anderson Leal
Apenas usuários registrados podem ver ou baixar anexos.
Avatar do usuário
Por alexandrevba 26 Jan 2018 às 18:23
Excel Expert
Mensagens: 1643
Reputação: 578
#29778
Boa tarde!!

Talvez algo como a propriedade EnableCancelKey, deve te ajudar!
Código: Selecionar todosPrivate Sub test()
'https://msdn.microsoft.com/en-us/library/aa214566(office.11).aspx
On Error GoTo handleCancel
Application.EnableCancelKey = xlErrorHandler
MsgBox "This may take a long time: press ESC to cancel"
For x = 1 To 1000000    ' Do something 1,000,000 times (long!)
    ' do something here
Next x

handleCancel:
If Err = 18 Then
    MsgBox "You cancelled"
End If

End Sub


Att
Por AndersonLeal 29 Jan 2018 às 12:12
Membro 2 Estrelas
Mensagens: 209
Reputação: 73
#29850
Olá alexandrevba,

Sobre a propriedade EnableCancelKey que você mencionou já utilizei e não deu certo, se a rotina na qual você a utilizar não for recursiva funciona perfeitamente, mas com uma sub recursiva não funciona.

Faça o teste com o arquivo que anexei e perceba que quando pressionar CTRL+BREAK a rotina é interrompida e a mensagem é exibida, mas ao descartar a msgbox a busca continua de onde tinha parado.

Obrigado por se disponibilizar a responder minha dúvida :)

Atenciosamente,
Anderson Leal