Problema: a pasta de trabalho não abre até que a execução do código seja concluída.
Detalhes: eu tenho um loop que exigia que o usuário tivesse outro arquivo aberto, para que o código continuasse. Este arquivo deve ser baixado da Internet e aberto. Se o arquivo não estiver aberto, uma caixa de mensagem aparecerá pedindo ao usuário para abrir o arquivo. Mesmo que eu baixe o arquivo e o abra, ele não abrirá até que todos os outros códigos sejam executados.
Meus pensamentos: Talvez haja algo como um "Atualizar", que atualiza o estado atual. Eu provavelmente deveria adicionar algo ao código existente abaixo que atualize as pastas de trabalho do Excel e veja se algo mais aconteceu.
Código abaixo: (O código é bom e funciona para o que preciso, o problema é que a pasta de trabalho não abre até que todo o outro código esteja completo):
Private Function WorkbookActive() As Boolean
' Loop until the correct workbook is open
Do Until WorkbookActive = True
On Error Resume Next
If Workbooks("Rapport.csv") Is Nothing Then
If MsgBox("[Rapport.csv] - Workbook is currently not open." & vbNewLine & "Please download and open [Rapports.csv] and press OK", vbOKCancel, "Workbook not open") = vbCancel Then Exit Do
WorkbookActive = False
ElseIf Not Workbooks("Rapport.csv") Is Nothing Then
WorkbookActive = True
End If
Loop
End Function
Tudo que você precisa é fazer seu loop "indireto", usando Application.Ontime
. Reescreva seu loop desta maneira:
Sub IndirectLoop()
On Error Resume Next
Workbooks("Rapport.csv").Activate
If Err.Number = 0 Then Exit Sub ' Done!
If MsgBox("[Rapport.csv] - Workbook is currently not open." & vbNewLine & _
"Please download and open [Rapports.csv] and press OK", _
vbOKCancel, "Workbook not open") = vbCancel Then _
Exit Sub ' loop cancelled by user
' Pause VBA and reschedule the routine for 3 seconds later
' Control passes here from VBA to excel to open the file by the user'
Application.OnTime Now + TimeSerial(0, 0, 3), "IndirectLoop"
End Sub
A ideia é, em vez de fazer um loop dentro de sua rotina VBA (que mantém o Excel bloqueado), reprogramar a rotina usando Application.Ontime
. Esta técnica vai passar o controle do VBA para o Excel por algum tempo (digamos 3 segundos no código acima), permitindo que ele faça alguma atividade, que é abrir o arquivo que você está esperando.
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras