Filtrar dados de planilha excel Topic is solved

Tire suas dúvidas sobre programação em AutoHotkey

Moderator: Gio

thalesduarte
Posts: 95
Joined: 13 Sep 2021, 06:08

Filtrar dados de planilha excel

Post by thalesduarte » 19 Nov 2021, 10:17

Olá, bom dia.
Existe alguma maneira de automatizar a pesquisa de um campo em varias planilhas de excel ao mesmo tempo?


Tenho uma planilha de excel e gostaria de tirar dados de mais de 500 planilhas em uma pasta.

Exemplo:
Quero que o SCRIPT verifique todos as 500 planilhas que estão em uma pasta e busque o resultado da célula A3 de cada planilha e traga para a minha planilha matriz.

Alguém poderia me dar uma luz de como posso reproduzir isso?
Checando uma por uma referenciando o nome do arquivo (que não é o caso que eu quero, queria que ele checasse o tipo do arquivo, .xls), eu consegui, porém de forma massiva não achei uma maneira rápida de reproduzir isso.

User avatar
Gio
Posts: 1247
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Filtrar dados de planilha excel  Topic is solved

Post by Gio » 24 Nov 2021, 16:32

Bom dia Thalesduarte.

Sem ver o seu código atual fica difícil lhe dar uma sugestão muito assertiva, mas vou tentar.

Se o programa está fazendo o que você pediu (lendo os arquivos), o que você precisa agora é otimizá-lo.

Para entender como isso pode ser feito, convém pensar no que está ocorrendo agora. A forma padrão através da qual um programa acessa um arquivo é:

1. O programa solicita ao Sistema Operacional (SO) que carregue o arquivo inteiro do HD para a memória RAM com a permissão desejada (leitura, escrita, etc).
2. Após o carregamento, o SO libera ao programa o uso dos dados na memória RAM conforme a permissão solicitada.
3. Se houver alteração no arquivo que deva ser salva, o SO reescreve os novos dados da memória RAM para o HD.

:arrow: O grande problema é que apesar da grande velocidade dos processadores e memórias atuais, o carregamento ainda é muito mais lento, principalmente se o sistema estiver utilizando um HD (hoje existe a opção do SSD, que torna um pouco mais veloz, mas é importante lembrar que ainda assim é MUITO mais lento que a comunicação diretamente entre o processador e a RAM).

Por isso, carregar 500 planilhas é uma tarefa bastante ineficiente para a máquina, principalmente se for de forma sequenciada com outras ações (abre 1, lê 1, abre 2, lê 2, abre 3, lê 3...).

Mas no caso do uso de COM, isso também pode envolver (dependendo do código) abrir e fechar 500 instâncias de um objeto Excel.Application, o que também é bastante ineficiente.

Eu sugiro algumas opções para tentar otimizar esse processo:

Opção 1: Verifique o código COM que está utilizando. Às vezes você está criando 500 instâncias do objeto COM, quando na verdade poderia criar apenas 1 e depois ir abrindo/fechando as planilhas no mesmo objeto. Tente alterar o seu código COM para ser o mais eficiente possível.
OU
Opção 2: Os dados de planilhas de Excel são basicamente arquivos xml comprimidos (.zip). Sendo assim, você pode renomear qualquer arquivo .xlsx como um arquivo .zip e depois abrir as pastas dele para encontrar os arquivos xml. Dessa forma, não é necessário abrir uma instância do Excel para extrair os dados de um arquivo .xlsx, desde que você primeiro descomprima ele e depois acesse o xml diretamente.
Isso não deveria ser necessariamente mais rápido do que abrir o arquivo, mas acontece que o processo de descompressão pode ocorrer em paralelo ao processo de leitura dos arquivos xml (por exemplo, você usa um arquivo .bat com linhas de comando para extrair os arquivos e enquanto isso o script autohotkey vai só esperando os arquivos xml ficarem disponíveis e já vai lendo eles conforme aparecem).

Acho que alguma dessas ideias podem render frutos (mas não posso garantir sem testar). Eu também poderia sugerir uma alternativa de ler apenas parte dos arquivos (alguns comandos permitem ler uma quantidade de bytes sem carregar o arquivo inteiro na memória), mas eu acho que arquivos comprimidos, tal como os xlsx, dificultariam muito esse tipo de algoritmo (ainda assim vale saber que pode ser possível).

Post Reply

Return to “Ajuda e Suporte Geral”