Página 1 de 1

Ordenar WorkBooks após usar o método Visible

Enviado: 16 Jul 2021 às 16:06
por NemPensar
Boa tarde, gente!!

Terminei um projeto feito em VBA mas em testes percebi um detalhe importante.

Assim que o usuario ativa as macros, fica se guiando por forms com o Application.Visible = False o tempo todo. Quando ele clica em OK no form, o excel é liberado pra ele colar uma tabela em uma planilha que contém apenas uma planilha(que ele ira colar a tabela).

Problema: Acontece que percebi que se mais de uma planilha o usuario estiver aberta usando( e isso é praticamente certeza absoluta que acontecerá já que é usado como uma ferramenta de um dpto corporativo), quando o Visible é acionado(True), em vez do WorkBook que o usuario deve colar a tabela aparecer, aparece como primario o outra das planilhas que estão abertas. Tentei solucionar sem sucesso com o seguinte.

No fim do escopo que libera libera o Excel ao usuario, coloquei:
Código: Selecionar todos
Workbooks("nomeArquivoExcel.xlsm").Activate
Sheets("nomePlanilha").select
Range("A1").select ' Essa foi minha ultima tentativa.
Mas enfim nada funcionou e mesmo pesquisando não achei algo que me atendesse.

Podem me ajudar?
Desde já, muito obrigado!

Re: Ordenar WorkBooks após usar o método Visible

Enviado: 16 Jul 2021 às 18:26
por osvaldomp
Olá, @NemPensar .

Nesta expressão ~~~> Workbooks("nomeArquivoExcel").Activate consta a extensão do arquivo ?

Se não, experimente colocar ~~~> Workbooks("nomeArquivoExcel.aaa").Activate

no lugar de aaa ~~~> xlx ou xlsx ou xlsm ... conforme a extensão do seu arquivo

Re: Ordenar WorkBooks após usar o método Visible

Enviado: 16 Jul 2021 às 20:30
por NemPensar
Olá, @osvaldomp , muito obrigado pela resposta! :D

Sim, está com a extensão. Na verdade, assim que as macros são ativadas - que o Visible = False - a instrução Initialize grava o nome da planilha usando a propriedade Name com ActiveWorkbook em uma variável Public do tipo string. Isso acontece imediatamente que as macros são ativadas pois inicia um form. Como Name coleta o nome do arquivo com a extensão, então isso não deveria ser problema tanto que, quando a linha é executada (Workbooks(varPubNomeArquivo)) não recebo um erro em tempo de execução.

Exatamente isso me deixa "encucado" pois Workbooks juntamento com o método Activate deveria me atender. :?:

O que achas?

Re: Ordenar WorkBooks após usar o método Visible

Enviado: 16 Jul 2021 às 20:46
por osvaldomp
Concordo, deveria funcionar.

Existe algum comando Application.ScreenUpdating = False antes do comando que tenta ativar o nomeArquivoExcel ?

Se quiser fazer um teste, rode o código abaixo a partir de um arquivo vazio. Não utilize variável, coloque o nome do arquivo a ser ativado diretamente no código (com a extensão).
Código: Selecionar todos
Sub teste()
 Application.Visible = False
 'aguarda 5 seg para reexibir o Excel
 Application.Wait Now + TimeValue("00:00:05")
 Application.Visible = True
 'aguarda 5 seg e então ativa outro aruivo
 Application.Wait Now + TimeValue("00:00:05")
 Workbooks("NomeArquivo.xlsm").Activate
End Sub

Re: Ordenar WorkBooks após usar o método Visible

Enviado: 17 Jul 2021 às 11:56
por NemPensar
Olá, @osvaldomp , tudo bem? Muito obrigado por manter contato com objetivo de ajudar com meu problema! :D

Assim que recebi sua última resposta, analisei seu código e fui testar mas não funcionou. Então removi a variável e coloquei diretamente o nome do arquivo, mas não funcionou. Fiquei 20 minutos fazendo teste e tudo falhando. Então tive uma ideia: e se eu gravasse uma macro selecionando a planilha manualmente? Fiz isso. Resultado foi que em vez da coleção Workbooks que estávamos usando, foi utilizado a coleção Windows na macro. Dai vi uma luz e fui testar. Não funcionou também nem com alguns testes só com ela. Dai fui até a documentação da instrução(https://docs.microsoft.com/pt-br/office ... cel.window) e ela explica a diferença entre a coleção Workbook e o Window:

"A coleção Windows do objeto Application contém todas as janelas do aplicativo, enquanto a coleção Windows do objeto Workbook contém somente as janelas da pasta de trabalho especificada."

Logo, essa é a instrução correta pra atender. Neste mesmo artigo, o primeiro exemplo usa a propriedade WindowState para controlar o menu de controle das janelas, como minimizar, maximizar, fechar...
Com isso, tive a ideia de usar após um Windows(varNomeArquivo).Activate usar um Windows(varNomeArquivo).WindowState = xlMaximized, que é exatamente o primeiro exemplo da documentação que citei.

Fui testar e... funcionou! :shock:
Além disso ficou até melhor pois antes a janela abria minimizada para o usuário e agora abre maximizada. 8-)

Tudo resolvido, muito obrigado!
Grande abraço!