Macro que salva automaticamente as alterações de sua planilha

Amigos leitores, sejam bem vindos mais uma vez ao meu blog.
Quantas e quantas vezes perdemos tudo o que estávamos fazendo por conta de uma queda de energia ou bugs no computador. Isso é uma coisa realmente muito chata – pra não dizer algo pior, que, por sinal, é o que certamente exclamamos nestes momentos!!!
Em meus estudos, descobri um código muito interessante para programarmos osalvamento automático real, com uma certa frequência a ser definida por nós mesmos. Diferentemente do autosalvamento do excel, esta macro salva o próprio arquivo de modo real, como se nós mesmos o tivéssemos feito clicando no botão “Salvar”.
O fundamento desta macro é salvar o arquivo a cada X minutos caso o arquivo tenha sofrido modificações e ainda não tenha sido salvo. Esta macro é iniciada ao abrirmos o arquivo, no evento Workbook_Open da pasta de trabalho. Vou mostrar como criá-la.
Abra o Projeto do VBA (Alt+F11) e insira um módulo digitando o seguinte código:

Public RunWhen As Double
Public Const cRunIntervalSeconds = 600 '10 minutos
Public Const cRunWhat = "SalvamentoProgramado"  'nome do procedimento a ser executado
Sub StartTimer()
    RunWhen = Now + TimeSerial(0, 0, cRunIntervalSeconds)
    Application.OnTime EarliestTime:=RunWhen, Procedure:=cRunWhat, _
        Schedule:=True
End Sub
Sub SalvamentoProgramado()
    If Application.ThisWorkbook.Saved = False Then
        Application.ThisWorkbook.Save
    End If
    StartTimer  ' Reschedule the procedure
End Sub
Sub StopTimer()
    On Error Resume Next
    Application.OnTime EarliestTime:=RunWhen, Procedure:=cRunWhat, _
        Schedule:=False
End Sub

A constante cRunIntervalSeconds define o tempo, em segundos, para o Cronômetro executar.
O procedimento StartTimer inicia o cronômetro da programação do salvamento. Na sub SalvamentoProgramado é verificado se houve alterações no arquivo e se ele está salvo, então, ele salvará as modificações no arquivo. StopTimer encerrará a programação da macro. Poderá ser chamada no menu macros mesmo, ou então criar um atalho para ela.
Agora, abra o código da pasta de trabalho, dando um duplo clique em EstaPasta_de_trabalho e digite o código:

Private Sub Workbook_Open()
    Call StartTimer
End Sub

Prontinho. Salve o arquivo. Feche. E abra novamente. A partir de então ele salvará suas alterações no intervalo de tempo estipulado. E adeus aos trabalhos perdidos.
Um abraço.
 
UPDATE: (Nov/12)
Atendendo ao feedback do leitor Allan, adicionem o código abaixo no módulo EstaPasta_de_trabalho:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Call StopTimer
End Sub

Isso faz com que o job do Salvamento seja retirado dos processos, liberando-o da memória.

38 comentários em “Macro que salva automaticamente as alterações de sua planilha”

  1. Tentei fazer no Excel 2007, e até parece que quer funcionar.
    O problema é que aparece a seguinte mensagem em uma janela:
    Aviso de privacidade: este documento contém macros, controle ActiveX, informações do pacote de expansao para XML ou componentes da Web. É possível que esses itens contenham informações pessoais que não possam ser removidas pelo Inspetor de Documento.
    Fui nas opções das configurações de Macro e ActiveX (Habilitei os recursos) mais a mensagem ainda acontece.
    Preciso que a mensagem não apareça.
    Minha intenção é gerar uma página web dos dados de forma automática. Mais ele só atualiza a página, se o arquivo for salvo. Assim a pagina fica atualizada sempre.
    Agradeço se puder me ajudar !!!!

    Responder
  2. Bom diaaa !!!
    Encontrei uma solução aqui
    Private Sub Worksheet_Change(ByVal Target As Range)
    ThisWorkbook.Save
    End Sub
    Colocando na pasta só essa macro já funciona no momento em que a planilha receber qualquer alteração.
    Flw
    obrigado

    Responder
  3. Ola, muito boa essas dicas.
    Fiz todos os procedimentos acima de colar no modulo o codigo do primeiro bloco.
    mais o segundo bloco não entendi onde colocar o codigo abaixo.
    Private Sub Workbook_Open()
    Call StartTimer
    End Sub
    —————-
    outra pergunta caro amigo Ederson, esse seu codigo funciona sem os codigos acima, simplesmente colar num modulo e pronto?
    Obrigado se puder responder

    Responder
    • Primeiro lugar, obrigado.
      Quanto ao bloco do código Workbook_Open, ele deve ser colocado no módulo da Pasta de trabalho (o próprio arquivo Excel)… Na lista dos objetos do projeto, onde tem os módulos, formulários, planilhas,… também tem um item chamado EstaPastaDeTrabalho.
      Dê dois clique sobre este item e será exibida uma janela de código como a do módulo. Então insira este código ali.
      Agora, sobre o coment do Ederson, é uma outra maneira de fazer, porém, gera muita lentidão no sistema, pois a macro será repetida a cada alteração nas células, diferente da macro deste artigo que é realizada a cada 10 minutos.
      Espero que tenha ficado explicado.
      Abraço

      Responder
  4. Otima dica!
    Mas veja se oque eu vou explicar é possivel.
    Oque eu precisaria era que ele salva-se como um outro arquivo de nome diferente conforme o o dia atual.
    por exemplo: Eu crio no dia 1º de novembro de 2010 o arquivo “ExeceldoSeuJeito” e precisária que o Execel desse um “Salvar Como…” e salva-se com o nome “ExeceldoSeuJeito 01-11-2010″ (usei como exemplo o hifem ” – ” porque o windows não aceita a barra ” / ” no nome do arquivo)
    Se não for possivel por a data tudo bem, mas tem como fazer “salvar como…” e pré determinar o nome do arquivo? e se possivel pré determinar o nome com o valor de alguma celula?
    Att.

    Responder
    • @Allston,
      Podes substituir a linha de comando “Application.Thisworkbook.Save” por uma chamada da rotina “SalvarCopiaComo“, que vou descrever abaixo, para que seja adicionada ao código.
      Sub SalvarCopiaComo()
      Dim sExtensao As String
      Dim sNomeSalvarComo As String
      sExtensao = Mid(ThisWorkbook.FullName, (InStrRev(StringCheck:=ThisWorkbook.FullName, StringMatch:=”.”, Compare:=vbTextCompare)))
      sNomeSalvarComo = Left(ThisWorkbook.FullName, (InStrRev(StringCheck:=ThisWorkbook.FullName, StringMatch:=”.”, Compare:=vbTextCompare) – 1)) _
      & ” ” & Format(Date, “dd-mm-yyyy”) & sExtensao
      ThisWorkbook.SaveCopyAs sNomeSalvarComo
      End Sub
      Abç

      Responder
  5. Tenho uma planilha feito no Excel 2007 porém quando à salvo é exibida a seguinte mensagem:
    Aviso de privacidade: este documento contém macros, controle ActiveX, informações do pacote de expansao para XML ou componentes da Web. É possível que esses itens contenham informações pessoais que não possam ser removidas pelo Inspetor de Documento.
    Como faço para que a mensagem acima não seja exibida?
    Li a resposta acima no entanto não compreendi, poderia ser mais detalhista com relação a pasta ao qual devo inserir o código postado? Desde já agradeço pela atenção.
    Parabéns pelo site!!!!

    Responder
    • Olá Rafael.
      Existe uma opção sim!
      Remova a restrição da existência de alterações na planilha.
      Procure no código pelas linhas abaixo:
      If Application.ThisWorkbook.Saved = False Then <--- Tire essa linha Application.ThisWorkbook.Save End If <---- e esta também Abç

      Responder
  6. Olá Reinaldo. Poderia me ajudar com esse erro?
    Estou tentando colocar esse código e aprece o seguinte erro de compilação:
    O erro está referenciando as linhas 2 e 3 da sequência indicada.
    “Constantes, sequência de comprimento fixo, matrizes, tipos definidos pelos usuários e instruções Declare não permitidos como membros públicos de módulos de objetos.”

    Responder
  7. Reinaldo, bom dia!
    Parabéns pelo código…
    Apliquei ele em uma planilha e a mesma abre até quando esta fechada para salvar, tem como mudar isso???
    Agradeço sua atenção

    Responder
    • Oi Allan.
      Boa observação. Não fiz a chamada ao procedimento de cancelamento do job.
      Seria o seguinte: (No módulo da pasta de trabalho)
      Private Sub Workbook_BeforeClose(Cancel As Boolean)
      Call StopTimer
      End Sub
      Obrigado pelo feedback.
      Abração

      Responder
  8. fiz um documento em outubro e agora em novembro abri e coloquei novas informações só que era para salvar como, e esqueci e só salvei e com isso perdi todos os dados de outubro tem como resgatar se puder me ajudar agradeço

    Responder
  9. Olá. Gostei muito desse tópico, mas tenho uma dúvida:
    Tem como salvar arquivo diário separados? Tipo, eu uso o excel para acompanhar processos de fábrica e me seria muito útil se ele salvasse os valores (arquivos) por dia para que eu possa buscar informações de dias anteriores.
    hoje ele salva um, amanhã outro e assim vai, porém se eu quiser ver os resultados de anteontem tem como?

    Responder
    • Olá Gazineu, tudo bem?
      Para realizar o que você quer, esta não seria a melhor macro a ser usada.
      Veja como poderia ser:

      
      '****** MACRO para Salvar a Planilha diariamente em arquivos diferentes ******
      Dim sPath As String
      Dim sFilename As String
      Dim sExt As String
      Dim sSufixoData As String
      Dim sSaveFileName As String
      Dim vOldSufixo As Variant
      Dim sOldSufixo As String
      Dim i As Integer
          'Salva este arquivo
          If ThisWorkbook.Saved = False Then
              ThisWorkbook.Save
          End If
          'Verifica se quer salvar e arquivar uma cópia
          If MsgBox("Deseja arquivar esta versão para as alterações de " & Date & "?", vbQuestion + vbYesNo + vbDefaultButton1, "Salvar Versão") = vbYes Then
              sPath = ThisWorkbook.Path
              sFilename = ThisWorkbook.Name
              sExt = Right(sFilename, Len(sFilename) - InStrRev(sFilename, ".") + 1)
              sSufixoData = Replace(Date, "/", "-")
              vOldSufixo = Split(Replace(sFilename, sExt, ""), "-")
              If UBound(vOldSufixo) >= 2 Then
                  For i = UBound(vOldSufixo) To LBound(vOldSufixo) Step -1
                      If IsNumeric(vOldSufixo(i)) Then
                          If i = UBound(vOldSufixo) Then
                              sOldSufixo = vOldSufixo(i)
                          Else
                              sOldSufixo = vOldSufixo(i) & "-" & sOldSufixo
                          End If
                      End If
                  Next i
                  sOldSufixo = "-" & sOldSufixo
              End If
              sSaveFileName = sPath & "\" & Replace(sFilename, sExt, "") & "-" & sSufixoData & sExt
              sSaveFileName = Replace(sSaveFileName, sOldSufixo, "")
              sSaveFileName = Trim(InputBox("Salvar e arquivar cópia como:", "Arquivar", sSaveFileName))
              If Len(sSaveFileName) > 0 Then
                  ThisWorkbook.SaveAs sSaveFileName
                  MsgBox "Cópia arquivada.", vbInformation
              End If
          End If
      

      Faça o Download da Planilha com a Macro aqui
      Um abraço

      Responder
  10. Olá, parabéns pelo site!
    Acompanho o processo de máquinas na empresa pelo excel, e queria que ele salvasse uma planilha por dia para poder ser consultado posteriormente os dias em que houve possíveis parada de produção. Tem como fazer isso? Grato!

    Responder

Deixe um comentário