none
Salvar como CSV - Melhorar código e corrigir bugs RRS feed

  • 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
    segunda-feira, 14 de setembro de 2015 21:17

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

    terça-feira, 15 de setembro de 2015 20:38