Ajuda com código - AHK - Excel

Tire suas dúvidas sobre programação em AutoHotkey
ikrass
Posts: 2
Joined: 14 Jun 2019, 13:32

Ajuda com código - AHK - Excel

14 Jun 2019, 14:17

Boa Tarde,

Preciso consolidar uma serie de arquivos de Excel, todos os arquivos tem o mesmo formato e o mesmo cabeçalho, porém o número de linhas é distinto em cada um deles. Existe um arquivo em branco apenas com o cabeçalho salvo na maquina, preciso que o script copie e cole os dados de todas as planilhas que estão abertas (da segunda até a ultima linha que com valores) e depois cole no arquivo que está salvo na maquina.

O problema poderia ser solucionado através de código no VBA contudo os arquivos abertos que precisam ser consolidados não estão salvos na maquina e estão abertos em instancias diferentes no gerenciador de tarefas do windows. Existe uma maneira de fazer isso com o AHK?

Obs: Pensei em fazer isso através de um loop onde utilizaria o ComObjActive() para me conectar a primeira instancia de excel aberta > copiar os dados > colar em um arquivo txt > encerrar o excel sem salvar.

No proximo loop o comando ComObjActive() iria encontrar a segunda instancia de excel aberta e assim por diante, quando não houver mais nenhuma instancia de excel aberta o loop será interrompido e o arquivo txt salvo.

Poderiam me auxiliar com esse script? É possivel fazer? Desde já agradeço.
User avatar
Gio
Posts: 617
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Ajuda com código - AHK - Excel

14 Jun 2019, 15:29

Boa tarde Ikrass.

Seja bem-vindo ao fórum da comunidade do AutoHotkey :thumbup:
Obs: Pensei em fazer isso através de um loop onde utilizaria o ComObjActive() para me conectar a primeira instancia de excel aberta > copiar os dados > colar em um arquivo txt > encerrar o excel sem salvar.

No proximo loop o comando ComObjActive() iria encontrar a segunda instancia de excel aberta e assim por diante, quando não houver mais nenhuma instancia de excel aberta o loop será interrompido e o arquivo txt salvo.

Poderiam me auxiliar com esse script? É possivel fazer? Desde já agradeço.
É bem isso que você escreveu mesmo. Você já começou a fazer?

Infelizmente eu não uso mais Excel já tem alguma tempo (mudei para o LibreOffice), então não sei se o código abaixo vai funcionar (não tenho como testar), mas é mais ou menos como eu faria a coisa. O código implementa uma rotina a partir da hotkey F2. Ele funciona assim: primeiro, supondo que os dados da tabela alvo começam na célula A2 da planilha, ele seleciona a célula A2, e expande a seleção para baixo e depois para a direita. Depois, guarda o valor da seleção inteira no objeto TABELA (que é um objeto 2D). Ao fim, exibe o conteúdo de 4 células em caixas de texto (no caso, as células A2, A3, B2 e B3).

Code: Select all

F2::
Xl := ComObjActive("Excel.Application") ; Cria uma conexão com a planilha ativa.
Xl.Range("A2").Select ; Seleciona a célula A2
Xl.Range(Xl.Selection, Xl.Selection.End(-4152)).Select ; Expande a seleção à direita.
Xl.Range(Xl.Selection, Xl.Selection.End(-4121)).Select ; Expande a seleção abaixo.
TABELA:= Xl.Selection.Value ; Cria um objeto 2D (tabela) com os valores da seleção.
msgbox % TABELA[1,1] ; primeira linha e primeira coluna da tabela iniciada em A2.
msgbox % TABELA[1,2]
msgbox % TABELA[2,1]
msgbox % TABELA[2,2]
; Xl.Workbooks.close ; Fecha a planilha (opcional).
Return
Dica: você também pode usar dois loops para resgatar os dados do objeto acima. Depois que estruturar os dados e colocá-los em uma variável, escrever em um arquivo texto é fácil usando o comando FileAppend.
Dica 2: temos um tutorial de automação básica do Excel em português. Você pode acessá-lo aqui: https://www.autohotkey.com/boards/viewtopic.php?f=71&t=52350


Espero ter ajudado. Tente executar o código acima com uma planilha aberta e depois de verificar seu funcionamento estude-o para modificar do jeito que precisar. Se tiver alguma dúvida ou se algo não funcionar, pode postar abaixo.
ikrass
Posts: 2
Joined: 14 Jun 2019, 13:32

Re: Ajuda com código - AHK - Excel

14 Jun 2019, 20:06

Gio, Obrigado pela ajuda.

Percebi que uma vez que a Conexão COM com o Excel é estabelecida ela só é fechada quando o Script é encerrado, caso contrario o processo ainda fica ativo no gerenciador de tarefas mesmo após fechado o Excel, impossibilitando que uma nova conexão COM seja estabelecida com a próxima instancia de Excel do gerenciador. A maneira que encontrei para contornar esse problema foi criando dois Scripts o primeiro Script coleta as informações que preciso no Excel e as copia, o segundo Script cola as informações no bloco de notas. Segue o Exemplo:

Script 1 (Extracao_Excel)

Excel := ComObjActive("Excel.Application"); Se conecta a primeira instancia de Excel Aberta
Excel.Range("A1").Select; Seleciona a Celula A1
Excel.Range(Excel.Selection, Excel.Selection.End(-4121)).Select; Estende a selecao
Excel.Range(Excel.Selection, Excel.Selection.End(-4161)).Select; Estende a selecao
Excel.Selection.Copy; Copia os dados
Excel.Quit; Encerra o Excel



Script 2 (Consolidar_Base)

F2::

Run, "C:\Users\xxxxx\Desktop\Teste\Consolidado.txt"; Abre o bloco de notas destinado a consolidar a base

Sleep, 1000

Run, "C:\Users\Ixxxxx\Desktop\Teste\Extracao_Excel.Ahk"; Obtem os dados da tabela atraves da execucao do script 1

Sleep, 400
Send, {LControl Down}; cola no notepad
Sleep, 700
Send, {v}
Sleep, 100
Send, {LControl Up}

Sleep, 1000
Send, {LControl Down}; salva no notepad
Sleep, 700
Send, {s}
Sleep, 100
Send, {LControl Up}

Sleep, 1000
Send, {LAlt Down}; fecha o notepad
Sleep, 700
Send, {f4}
Sleep, 100
Send, {LAlt Up}


Acredito que dessa forma irá funcionar para o que preciso contudo preciso que o script 2 rode em loop enquanto houverem instancias do excel abertas na maquina. Consegue me auxiliar nessa parte? Seria de grande ajuda. Desde já agradeço.
User avatar
Gio
Posts: 617
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Ajuda com código - AHK - Excel

17 Jun 2019, 13:38

Bom dia Ikrass.
Percebi que uma vez que a Conexão COM com o Excel é estabelecida ela só é fechada quando o Script é encerrado, caso contrario o processo ainda fica ativo no gerenciador de tarefas mesmo após fechado o Excel, impossibilitando que uma nova conexão COM seja estabelecida com a próxima instancia de Excel do gerenciador.
Interessante. Como disse antes, estou impossibilitado no momento de executar testes com o Excel no momento, mas acredito que isso possa ser contornado de várias formas. Uma delas é tentar liberar o objeto COM primeiro e somente depois fechar a janela do excel usando um comando como o WinClose (ou WinKill). Para fechar um objeto COM, acredito que basta deletar a referência dele (algo como objeto := ""), mas também é possível que precise de outro método, como ObjRelease().

Também é possível tentar obter o processo diretamente da janela ativa (usando o comando WinGet) e daí fechar o processo (Process, close) ao invés de fechar o Excel (o que faria com que uma nova chamada a ComObjActive() fosse forçado a retornar uma nova referência).

Se no fim ainda for preciso mesmo encerrar o script, você pode tentar uma rotina com o comando Reload, que fecha o script e inicia novamente em seguida (isso pode ser feito depois de fechar a janela).
preciso que o script 2 rode em loop enquanto houverem instancias do excel abertas na maquina.
Isso também é relativamente fácil, você pode usar o comando SetTitleMatchMode e depois uma condicional IfWinExist para verificar se ainda existem janelas do excel. Isso tudo pode sim ser colocando dentro de um Loop (preferencialmente no começo).

Return to “Ajuda e Suporte Geral”

Who is online

Users browsing this forum: No registered users and 1 guest