Como o Salvamento Automático afeta suplementos e macros

Saiba mais sobre como o salvamento automático funciona no Excel, PowerPoint e Word e como pode afetar suplementos ou macros.

Visão geral do salvamento automático

Quando um arquivo é hospedado na nuvem (ou seja, OneDrive, OneDrive for Business ou SharePoint Online), o salvamento automático permite que edições do usuário sejam salvas de forma automática e contínua. Quando o arquivo é compartilhado com outras pessoas, as alterações são mescladas na versão do usuário do arquivo. Se o salvamento automático está desativado, salvar deve ser disparado manualmente para que as alterações do usuário continuem na nuvem e para esse usuário receber alterações de outras pessoas.

Atualmente, o Excel, Word e PowerPoint fornecerem um eventoBeforeSave que permite a um desenvolvedor executar o código depois que o usuário dispara um salvar, mas antes de salvar. O Excel também oferece um evento AfterSave que pode executar o código de macro ou suplemento após a conclusão de salvar.

Quando o salvamento automático é habilitado, esses eventos acionam automaticamente e periodicamente sem interação do usuário. Por esse motivo, suplementos e macros que aproveitam esses eventos podem ter problemas quando o salvamento automático estiver ativado.

Em geral, esses problemas podem ser evitados, se o usuário optar por desativar o salvamento automático. Você pode fazer isso em nome do usuário usando a propriedade AutoSaveOn no Word, Excel, e PowerPoint se ele estiver disponível (veja o exemplo a seguir). Você também pode executar etapas como um desenvolvedor para reduzir esses problemas, para que seus suplementos e macros trabalham bem, mesmo que o salvamento automático seja habilitado.

Exemplo

Este exemplo desativa o salvamento automático e notifica os usuários que a pasta de trabalho não está sendo salva automaticamente.

Sub UseAutoSaveOn()
    ActiveWorkbook.AutoSaveOn = False
    MsgBox "This workbook is being saved automatically: " & ActiveWorkbook.AutoSaveOn
End Sub

Possíveis problemas com salvar eventos e salvamento automático

Talvez seja necessário manipular um ou mais dos seguintes problemas em relação a interação entre salvar eventos e salvamento automático:

  1. Código nos eventos BeforeSave ou AfterSave executa por muito tempo
  2. Código em Salvar eventos mostra uma caixa de diálogo modal
  3. Código em Salvar eventos limpa a coluna Desfazer (apenas Excel)
  4. Código no AfterSave suja a pasta de trabalho (apenas Excel)
  5. Código no BeforeSave cancela o arquivo Salvar (definindo o argumento Cancelar como verdadeiro)

Problema 1: Executa o código de eventos BeforeSave ou AfterSave por muito tempo

Em geral, não estão respondendo à interação do usuário ao suplemento do Word, Excel e PowerPoint ou o código de macro é executado. Portanto, se o código em um manipulador de eventos BeforeSave ou AfterSave demora muito para executar, ele pode prejudicar significativamente a experiência do usuário.

Quando o salvamento automático é desabilitado, o código é executado somente quando o usuário explicitamente optar por salvar para que um atraso não fique mais aparente e pode ser evitado pelo usuário até que ele esteja pronto para salvar.

Quando o salvamento automático é habilitado, esse será executado automaticamente e periodicamente, o que tem o potencial para interromper o usuário, especialmente se o código demora mais.

Exemplo de cenário

Imagine um suplemento que permite aos usuários criarem mapas com base em dados de uma pasta de trabalho do Excel. Como um suplemento pode ter código BeforeSave serializa qualquer mapas que o usuário criou e armazenará na pasta de trabalho em uma parte CustomXML. Esse processo pode demorar um segundo para concluir e o Excel poderá não responder enquanto isso acontece.

Quando o salvamento automático está desativado, o usuário pode escolher quando deseja salvar, e portanto, mesmo que o suplemento atrase o processo salvar um pouco, o usuário não percebe.

Quando o salvamento automático é habilitado, esse código BeforeSave será executado automaticamente de forma periódica mesmo que o usuário esteja no meio de outra coisa (como digitar dados em uma célula), que pode ser muito incômodo.

Solução alternativa

Suplementos deveria tentar evitar operações de longa duração dentro de um evento salvar. Neste exemplo, o desenvolvedor poderia optar por manter mapas personalizados para o arquivo, pois eles são criados ou modificados pelo usuário, em vez de esperar o evento salvar.

Problema 2: Código em salvar eventos mostra uma caixa de diálogo modal

Qualquer código é executado em uma salvar evento que exibe a interface do usuário, pois uma caixa de diálogo modal tem potencial para prejudicar seriamente a experiência do usuário quando o salvamento automático está ativado. Como os eventos BeforeSave e AfterSave são executadas automaticamente de forma periódica, essas caixas de diálogo podem interromper o fluxo de trabalho normal do usuário.

Exemplo de cenário

Um suplemento que valida um documento do Word antes de salvar para garantir que a identidade visual da empresa seja aplicada pode acionar uma caixa de diálogo que alertará o usuário sobre os problemas que foram encontrados e oferece uma maneira de corrigi-los. Como o evento BeforeSave agora é ativado automaticamente e continuamente, essa caixa de diálogo de validação pode aparecer de repente, enquanto o usuário faz outra coisa.

Soluções alternativas

Considere remover qualquer código que precisa exibir a interface do usuário para outras áreas do aplicativo. Por exemplo, o usuário pode escolher um botão "validar" para disparar o processo de validação ou pode acionar o código de validação somente se o usuário tenta alterar dados existentes.

Se quiser que o código de validação dispare somente no primeiro salvar do novo documento, mas não em salvamento automático subsequente, considere inspecionar uma propriedade como do Excel Workbook.Path antes de exibir qualquer interface do usuário durante BeforeSave ou AfterSave. No Excel, a propriedade Workbook.Path deve estar em branco, se a pasta de trabalho ainda não tiver um local de salvamento.

Problema 3: Código em salvar eventos limpa a coluna Desfazer (apenas Excel)

Em geral, se você executar instruções VBA no Excel, a coluna Desfazer será limpa. Por exemplo, se você alterar o valor de uma célula executando ActiveCell.Value = "myValue", a coluna desfazer é limpa. Se este código estiver presente no evento BeforeSave ou AfterSave para uma macro ou suplemento e o salvamento automático estiver ativado, um usuário desta macro ou suplemento com frequência não será capaz de desfazer ações normais de usuário, conforme esperado.

Exemplo de cenário

Um suplemento pode ter o código que é executado na resposta para o evento BeforeSave que verifica o documento e grava valores em uma tabela de "Registro" na pasta de trabalho. Quando o salvamento automático está ativado, este limparia a coluna desfazer periodicamente, o que poderia potencialmente chatear os usuários.

Solução alternativa

Considere remover o código que escreve à pasta de trabalho em eventos BeforeSave ou AfterSave. Por exemplo, o suplemento descrito no cenário de exemplo pode ser modificado para armazenar o log de alterações no banco de dados ou arquivo separado.

Problema 4: Código em AfterSave suja a pasta de trabalho (apenas Excel)

Quando o salvamento automático está ativado, os eventos BeforeSave e AfterSave apenas acionarão se houve uma alteração na pasta de trabalho desde a última vez em que foram disparados. Se o código np evento AfterSave suja a pasta de trabalho (ou seja, faz outras alterações), que poderia disparar potencialmente eventos para acionar novamente para as mesmas mudanças e fazer fila dos eventos para acionar novamente indefinidamente. Isso pode perder recursos do sistema e afetar a vida da bateria.

Solução alternativa

O código que suja a pasta de trabalho no AfterSave deve ser movido para BeforeSave ou em outro local totalmente (consulte Problema 3). Isso não recomendável, mesmo sem o salvamento automático, pois deixa a pasta de trabalho em um estado "sujo" permanente, fazendo com que a solicitação apareça ao fechar que pede ao usuário para salvar as alterações, mesmo que não tenham feito alterações adicionais. 

Problema 5: Código em BeforeSave cancela o arquivo Salvar (definindo argumento Cancelar como verdadeiro)

Hoje, é possível cancelar o salvar no evento BeforeSave configurando Cancel para verdadeiro:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) 
    Cancel = True
End Sub

Quando o salvamento automático é habilitado, o aplicativo (ou seja, Excel, Word ou PowerPoint) aciona salvar automaticamente de forma contínua até o arquivo não ter mais alterações não salvas. Depois que o usuário fizer uma única alteração para o arquivo, o aplicativo tenta salvá-lo.

Se o desenvolvedor optar por cancelar o salvamento da maneira descrita acima, o aplicativo constantemente determina que há alterações não salvas, que faz com que o salvar (eventualmente) tente novamente. Como o mesmo código de evento que cancelou o primeiro salvar também cancelará a segunda tentativa de salvamento, o processo continuará enquanto o arquivo estiver aberto, possivelmente afetando o desempenho e a vida da bateria.

Exemplo de cenário

Um suplemento pode substituir completamente o padrão de código salvar do Word para que o arquivo seja salvo em um banco de dados corporativo em vez de um disco ou local do SharePoint. Como um suplemento deve primeiro cancelar a tentativa de salvar antes de tentar salvar em outro local.

Solução alternativa

Esses suplementos devem garantir que o salvamento automático esteja desativado para configurar AutoSaveOn como falso. Como um arquivo já deve ser salvo em um local do OneDrive ou SharePoint para salvamento automático estar ativado, o salvamento automático já deve estar desativado ou desabilitado na maioria das versões desse cenário.

Confira também

Suporte e comentários

Tem dúvidas ou quer enviar comentários sobre o VBA para Office ou sobre esta documentação? Confira Suporte e comentários sobre o VBA para Office a fim de obter orientação sobre as maneiras pelas quais você pode receber suporte e fornecer comentários.