Notifications
Clear all

INICIALIZAR VARIAVEL AO ABRIR ARQUIVO

3 Posts
2 Usuários
0 Reactions
1,070 Visualizações
(@celsoyano)
Posts: 75
Trusted Member
Topic starter
 

Boa tarde pessoal

Eu peguei na internet um código em VBA que faz uma cópia do arquivo (cópia de segurança) em um determinado intervalo de tempo para caso eu queira recuperar.

Resumidamente, o código se comporta da seguinte forma:
1 - Abro a planilha
2 - Salva uma cópia em c: sem nenhuma alteração com o seguinte nome: NOME & DATA & HORA
3 - Inicia contagem .. por enquanto está em 10 segundos
4 - Passados os 10 segundos, se houver alguma alteração, ele salva uma outra cópia em c: com o seguinte nome: NOME & DATA & HORA
e assim vai indo.

Segue arquivo exemplo em anexo

A minha dúvida é a seguinte:
Eu gostaria que no final do nome da primeira cópia, ou seja, aquela sem nenhuma alteração, tivesse a palavra "inicial" no final dela

Para isso, eu ACHO que preciso criar uma variável que inicie ao abrir o arquivo, mas que não seje constante. Pois essa variável receberia o valor "Inicial" ao abrir.

Private Sub Workbook_Open()
NOME_COMPLEMENTAR = " - inicial"
Call INICIAR_AUTO_BACKUP
End Sub

e depois da primeira execução da Sub "INICIAR_AUTO_BACKUP" receberia "" (vazio)

Sub INICIAR_AUTO_BACKUP()

INTERVALO = 10 'INTERVALO ENTRE UM BACKUP E OUTRO, EM SEGUNDOS.

CAMINHO = "C:"
NOME = Left(ActiveWorkbook.Name, InStr(ActiveWorkbook.Name, ".") - 1) & " - Auto Backup - " & NOME_COMPLEMENTAR
On Error GoTo MENSAGEM

If Application.ThisWorkbook.Saved = False Then
    ActiveWorkbook.SaveCopyAs Filename:=CAMINHO & NOME & ".xlsm"
    ActiveWorkbook.Save



    NOME_COMPLEMENTAR = ""




End If

' ........

End Sub

Agora, como fazer isso? Alguém pode me ajudar?

Obrigado

 
Postado : 07/07/2014 2:46 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

celso, só uma pergunta, eu abro o arquivo hoje e por ser a primeira vez irá adicionar o termo "Inicial" e as demais sem este termo, ok, e no dia seguinte como fica ? Tambem valerá esta regra ?

Independente do meu questionamento, eu sugiro fazer da seguinte forma :
Em um Range qualquer coloque o numero "1", apos aberta o arquivo na hora de salvar será verificado se o numero é igual a "1" se for, salva com o final Inicial, senão salva sem a expressão, e se for da forma que perguntei acima, coloque em Workbook_BeforeClose a instrução para setar o numero para 1 novamente, no código abaixo eu defini o Range("A1") para teste, se servir você altera este range.

Sub INICIAR_AUTO_BACKUP()
Dim sInicial As Long

Dim NOME_COMPLEMENTAR

NOME_COMPLEMENTAR = " - inicial"

'Variavel que verfica se é a primeira vez
sInicial = Range("A1").Value

INTERVALO = 10 'INTERVALO ENTRE UM BACKUP E OUTRO, EM SEGUNDOS.

CAMINHO = "C:"

    If sInicial = 1 Then
    
        NOME = Left(ActiveWorkbook.Name, InStr(ActiveWorkbook.Name, ".") - 1) & " - Auto Backup - " & VBA.Format(VBA.Date, "YYMMDD") & " - " & VBA.Format(VBA.Time, "hhmmss") & NOME_COMPLEMENTAR
        'NOME = Left(ActiveWorkbook.Name, InStr(ActiveWorkbook.Name, ".") - 1) & " - Auto Backup - " & NOME_COMPLEMENTAR
    
        'Seta Variavel com zero
        Range("A1").Value = 0
    Else
        
        NOME = Left(ActiveWorkbook.Name, InStr(ActiveWorkbook.Name, ".") - 1) & " - Auto Backup - " & VBA.Format(VBA.Date, "YYMMDD") & " - " & VBA.Format(VBA.Time, "hhmmss")
    
    End If

On Error GoTo MENSAGEM

    If Application.ThisWorkbook.Saved = False Then
        ActiveWorkbook.SaveCopyAs Filename:=CAMINHO & NOME & ".xlsm"
        ActiveWorkbook.Save
        INICIAL = ""
    End If

    INICIAR = Now + TimeSerial(0, 0, INTERVALO)
    Application.OnTime EarliestTime:=INICIAR, Procedure:="INICIAR_AUTO_BACKUP", Schedule:=True

GoTo FIM

MENSAGEM:
    MsgBox "Verifique o caminho de gravação do backup." & Chr(13) & Chr(13) & CAMINHO & Chr(13) & Chr(13) & "O backup não será feito até que a pasta seja criada e o arquivo reiniciado!"
    
FIM:
End Sub

Ao fechar o arquivo, coloque esta :

Private Sub Workbook_BeforeClose(Cancel As Boolean)

    Range("A1").Value = 1
    
End Sub

Faça os teste e veja sé isto.

[]s

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 07/07/2014 4:19 pm
(@celsoyano)
Posts: 75
Trusted Member
Topic starter
 

Mauro boa tarde.

A sua sugestão deu certo também e fiquei muito grato por ela, exclusivamente para essa planilha e outra daria pra usar.

No entanto, eu queria uma outra solução, porque aqui no escritório, nem todos tem habilidade em Excel, e vi um algo que poderia dar problema ... como essa macro aplicarei em diversos arquivos com planilhas diferentes, valores diferentes, a cada planilha a pessoa teria que ter determinar onde estaria essa Range que receberia o valor, e teria que deixar reservado ela exclusivamente para isso. E nem todos tem uma planilha "Base de Dados".

Aí procurei outra solução, eu acabei achando uma. Como minha habilidade em VBA é pequena, a solução pode parece simples para outras pessoas, mas era exatamente o que eu procurava ... quando eu atribui a variável INICIAL como "public" dentro do Módulo, ANTES eu pensava que ela só seria pública ou global nas macros entre os módulos, mas na verdade ela também se torna pública nos códigos dentro de "ESTAPASTA_DE_TRABALHO" inclusive na rotina "Workbook_Open()". Depois que descobri isso, coloquei no módulo1 a linha "Public INICIAL As String" e em "ESTAPASTA_DE_TRABALHO" "Workbook_Open()", antes de chamar a macro, INICIAL = " - Inicial". E no nome do arquivo acrescente a váriavel INICIAL.

Depois que ela termina de salvar, coloquei INICIAL = "" e assim ela não salva coloca " - Inicial".

E deu certinho! Agora o pessoal só precisa copiar e colar os código, como habitualmente já fazem aqui.

Estou deixando em anexo o arquivo e imagem em anexo para consultas futuras.

A macro abaixo cria uma cópia de segurança (BACKUP) em c: a cada 5 minutos

Algumas pessoas podem perguntar: "Mas para que isso, se existe a opção de 'Salvamento automático' no Excel??". Bom pessoal, primeiramente porque eu já tive VARIASSS experiencias onde essa opção não funcionou corretamente, e de onde eu extrai um código parecido, também tinha muita gente que não confiava. E em segundo, porque eu posso voltar alguma etapa que não tenha dado certo, ou que poderia ser feito de outra forma.

Espero que ajudem outras pessoas também.

OBRIGADO MAURO PELA AJUDA

ESTAPASTA_DE_TRABALHO

Private Sub Workbook_Open()
Application.ScreenUpdating = False

'..........................................................................................................................'
'PARA QUE O BACKUP INICIAL FUNCIONE, É PRECISO FAZER ALGUM TIPO DE MODIFICAÇÃO NO ARQUIVO PARA QUE HAJA ALGO A SER SALVO.  '
'PARA ISSO INCLUI AS LINHAS:                                                                                               '
'       Sheets(1).Visible = False                                                                                          '
'       Sheets(1).Visible = True                                                                                           '
'       Sheets(1).Select                                                                                                   '
'OCULTA A 1º PLANILHA, E DEPOIS EXIBE ELA NOVAMENTE. ESSA ALTERAÇÃO É O SUFICIENTE PARA QUE SALVE UMA COPIA                '
'..........................................................................................................................'

'BACKUP INICIAL
Sheets(1).Visible = False
Sheets(1).Visible = True
INICIAL = " - Inicial"

Call INICIAR_AUTO_BACKUP

Application.ScreenUpdating = True
End Sub

MODULO 1

Public INICIAL As String

Sub INICIAR_AUTO_BACKUP()

INTERVALO = 300  'INTERVALO ENTRE UM BACKUP E OUTRO, EM SEGUNDOS.

CAMINHO = "C:"
NOME = Left(ActiveWorkbook.Name, InStr(ActiveWorkbook.Name, ".") - 1) & " - Auto Backup - " & VBA.Format(VBA.Date, "YYMMDD") & " - " & VBA.Format(VBA.Time, "hhmmss") & INICIAL
On Error GoTo MENSAGEM

If Application.ThisWorkbook.Saved = False Then
    INICIAL = ""
    ActiveWorkbook.SaveCopyAs Filename:=CAMINHO & NOME & ".xlsm"
    ActiveWorkbook.Save
End If

INICIAR = Now + TimeSerial(0, 0, INTERVALO)
Application.OnTime EarliestTime:=INICIAR, Procedure:="INICIAR_AUTO_BACKUP", Schedule:=True

GoTo FIM

MENSAGEM:
MsgBox "Verifique o caminho de gravação do backup." & Chr(13) & Chr(13) & CAMINHO & Chr(13) & Chr(13) & "O backup não será feito até que a pasta seja criada e o arquivo reiniciado!"

FIM:
End Sub

Sub AUTO_BACKUP_PARAR()
'    On Error Resume Next
    Application.OnTime EarliestTime:=INICIAR, Procedure:="INICIAR_AUTO_BACKUP", Schedule:=False
End Sub
 
Postado : 09/07/2014 3:29 pm