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.
Ajuda com código - AHK - Excel
Moderator: Gio
Re: Ajuda com código - AHK - Excel
Boa tarde Ikrass.
Seja bem-vindo ao fórum da comunidade do AutoHotkey
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).
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.
Seja bem-vindo ao fórum da comunidade do AutoHotkey
É bem isso que você escreveu mesmo. Você já começou a fazer?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.
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 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.
"What is suitable automation? Whatever saves your day for the greater matters."
Barcoder - Create QR Codes and other Barcodes using only Autohotkey !!
Archmage Gray - A fantasy shooter game fully coded in AutoHotkey
Barcoder - Create QR Codes and other Barcodes using only Autohotkey !!
Archmage Gray - A fantasy shooter game fully coded in AutoHotkey
Re: Ajuda com código - AHK - Excel
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.
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.
Re: Ajuda com código - AHK - Excel
Bom dia Ikrass.
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).
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().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.
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).
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).preciso que o script 2 rode em loop enquanto houverem instancias do excel abertas na maquina.
"What is suitable automation? Whatever saves your day for the greater matters."
Barcoder - Create QR Codes and other Barcodes using only Autohotkey !!
Archmage Gray - A fantasy shooter game fully coded in AutoHotkey
Barcoder - Create QR Codes and other Barcodes using only Autohotkey !!
Archmage Gray - A fantasy shooter game fully coded in AutoHotkey
Return to “Ajuda e Suporte Geral”
Who is online
Users browsing this forum: Google [Bot] and 28 guests