Usuário com melhor resposta
Salvar como CSV - Melhorar código e corrigir bugs

Pergunta
-
Oi Pessoal, tudo bem?
Gostaria da ajuda de vocês para melhorar o meu código e corrigir algumas coisas.
Tenho um planilha com macros .XLSM que recebem informações a cada minuto, e preciso transmitir essas infos para o dropbox a cada 30seg. As infos precisam ser enviadas em formato CSV.
A planilha que recebe as infos possui duas abas. A primeira, chamada de "Simple Data" é onde ela recebe as infos, e a segunda aba "Plan1" é onde fica um gráfico que transmite as informações em um circuito interno transmitindo 24h. Ou seja, eu preciso gerar um CSV (sem fechar ou substituir o arquivo original que recebe os dados) das infos da aba "Simple Data", sem sair do gráfico, e de forma automática.
Depois de quebrar um pouco a cabeça, consegui montar o código abaixo, que funciona e atende o que eu preciso, mas possui algumas falhas que sei que dá pra melhorar, só me falta o conhecimento de como.
Então, objetivo: 1. Exportar/Salvar um CSV com as infos da aba "Simple Data", 2. sem qualquer tipo de alerta, 3. sem sair da tela do gráfico da segunda aba, e 4. poder fazer isso mesmo tendo outro excel aberto.
Apesar de usar a função "Application.ScreenUpdating = False" a tela pisca rapidamente quando a nova planilha é criada. Sei que devo evitar o uso de coisas como ".select", e que geralmente depois dessas ações, o ScreenUpdating volta para True, mas sinceramente não sei como e preciso que esse VBA não pisque e transmita o gráfico na tela sem qualquer interferência.
Atualmente, se eu tenho outra planilha aberta, o Excel vai tentar salvar a planilha em questão, e não a que possui o gráfico. Sei que isso acontece devido ao fato de eu usar "ActiveWorkbook" e "ActiveSheet", mas não sei como fazer referência pelo nome do do documento para que ela salve somente a planilha dos dados, e não a atual que estiver na tela.
Fiz um looping que repete a macro a cada 30seg, mas não sei se esta correto. Ela funciona, mas depois de ativa, fica rodando infinitamente, sem opção de "Start" e "stop". Se puderem me ensinar como incluir isso, seria ótimo também.
Segue o código:
Sub live() Dim selAtual As Range Application.ScreenUpdating = False Sheets("Simple Data").Select Set selAtual = Selection Columns("A:B").Copy Workbooks.Add ActiveSheet.Paste Application.DisplayAlerts = False ActiveWorkbook.SaveAs Filename:= _ "C:\Users\Company\Dropbox\track.csv", FileFormat:=xlCSV, _ CreateBackup:=False ActiveWorkbook.Close selAtual.Select Sheets("Plan1").Select Application.OnTime Now + TimeValue("00:00:30"), "live" Application.DisplayAlerts = True Application.ScreenUpdating = True End Sub
Dentro do meu conhecimento, foi o que pude fazer. Espero que possam apontar onde posso melhorar para que essa ação ocorra totalmente em segundo plano, de forma que eu possa ter outro excel aberto e fazer outras coisas.
- Editado SoMeGoD3 segunda-feira, 14 de setembro de 2015 21:24
Respostas
-
Use a propriedade .visible do objeto Excel.application.
Definindo-a como FALSE, tudo acontece em background, invisível ao usuário
Veja o exemplo abaixo:
Function trataArquivo() 'Declarações Dim appExcel As Excel.application Dim wb As Excel.Workbook Dim ws As Excel.Worksheet 'A Aplicação é criada aqui: Set appExcel = CreateObject("Excel.Application") appExcel.application.DisplayAlerts = False 'A linha abaixo é importante: você deve querer que 'sua aplicação seja visível na maioria das vezes appExcel.Visible = False appExcel.Workbooks.Open FileName:="C:\nomedaplan.xls" Set wb = appExcel.Workbooks("C:\nomedaplan.xls") wb.Activate wb.Sheets(nomedaaba).Activate 'AQUI VOCÊ FAZ A CÓPIA DOS DADOS 'O método SaveAs é semelhante ao comando 'Salvar Como': wb.SaveAs FileName:="novaplan.csv", FileFormat:=xlCSV 'FileFormat:=xlOpenXMLWorkbook significa que o arquivo será salvo com a wb.Close savechanges:=True appExcel.application.DisplayAlerts = True End Function
- Sugerido como Resposta André Santo segunda-feira, 28 de setembro de 2015 19:52
- Marcado como Resposta Felipe Costa GualbertoMVP, Moderator quinta-feira, 5 de novembro de 2015 15:31