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.
Valeu cara…eu estava precisando de um macro destes e funcionou !!!
Beleza!!!
Muito gratificante isso.
Visite mais vezes.
Abraço
Olá..
dica muito bacana…mas acho que estou fazendo alguma coisa errada.. não está dando certo…
alguém poderia me dar uma força?
Abraços
Que problema está ocorrendo?
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 !!!!
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
Ok.
Abraço
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
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
Prezado,
Há a possibilidade de rodar essa macro com o tempo e 60 segundos e em uma planilha compartilhada?
Na planilha compartilhada há a restrição de salvamento.
Apenas o primeiro usuário na fila de acesso terá o privilégio para salvá-la.
Abraço.
Meus parabens
essa macro (não salvando automaticamente mas realizando uma função a cada intervalo) é de extrema importancia e necessidade
Parabens
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.
@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ç
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!!!!
Obrigado.
Isso acontece com todos as suas planilhas 2007?
Experimente criar um novo arquivo e copiar suas macros. Veja se continua o problema.
Abç
Deu super certo… ótimo saber que exista pessoas como você que compartilhe essas maravilhas!
parabénssss!
Parabéns , ficou certinho e estou muito satisfeito.
Valeu.
Ai, muito obrigado pela dica deste site me ajudou muito em meus projetos.
Boa tarde.. por gentileza há uma opção para alterar esta macro caso eu queira salvar automaticamente, independente se a planilha foi alterada ou não???
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ç
Essa macro funciona em qualquer documento aberto do Excel ou precisaria ser configurada a cada documento que quisermos?
O código aqui exposto funciona apenas para o arquivo que contém a macro.
Mas, pode ser adaptado perfeitamente para rodar em todas as pastas de trabalho abertas, através de um loop pela coleção Workbooks.
Abç
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.”
Poderia me ajudar a entender por que não está funcionando?
Acesse o formulário de contato e me passa o código que você está implementando.
Abç
Consegui, estava colocando o código no local errado. Em vez de escrevê-lo no módulo estava colocando no objeto.
Grato!
Maravilha!
Abraço
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
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
Não consigo utilizar. Tem como colocar um passo-a-passo?
Olá Wesley,
Disponibilizei o arquivo de exemplo para download.
Abç
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
Olá Maria.
Infelizmente acho que não, pois isso é uma questão própria do Excel e sim de sistema. 🙁
Se seu sistema estiver configurado para realizar backups automáticos pode ser que consiga.
Abç
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?
Olá Gazineu, tudo bem?
Para realizar o que você quer, esta não seria a melhor macro a ser usada.
Veja como poderia ser:
Faça o Download da Planilha com a Macro aqui
Um abraço
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!