Este fórum está sendo desativado

Depois de 9 anos, este fórum será desativado. Mas calma.... estamos migrando para uma comunidade no DISCORD. Junte-se a nós.

ENTRAR PARA DISCORD

Tópicos relacionados a códigos VBA, gravação de macros, etc.
  • Avatar do usuário
#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
#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
Você não está autorizado a ver ou baixar esse anexo.
#29778
Boa tarde!!

Talvez algo como a propriedade EnableCancelKey, deve te ajudar!
Código: Selecionar todos
Private 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
#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
long long title how many chars? lets see 123 ok more? yes 60

We have created lots of YouTube videos just so you can achieve [...]

Another post test yes yes yes or no, maybe ni? :-/

The best flat phpBB theme around. Period. Fine craftmanship and [...]

Do you need a super MOD? Well here it is. chew on this

All you need is right here. Content tag, SEO, listing, Pizza and spaghetti [...]

Lasagna on me this time ok? I got plenty of cash

this should be fantastic. but what about links,images, bbcodes etc etc? [...]

Estamos migrando para uma comunidade no Discord