Insira o tempo sem dois pontos - dicas do Excel

A pergunta sobre o Excel desta semana vem de John, que trabalha em Okinawa.

Estou construindo uma planilha do Excel para refletir as partidas e chegadas. Haverá basicamente três células: Hora real de partida, Hora estimada de viagem e Hora estimada de chegada. Gostaria que a pessoa pudesse inserir (por exemplo) 2345 e que a célula formatasse automaticamente a exibição para mostrar 23:45. O que estou obtendo é 0:00, independentemente da fórmula ou formatação. E, o cálculo não exibirá nada além de 0:00 se o usuário falhar em mudar a tecla e dois pontos. Eu sei que parece simples fazer isso, no entanto, cada segundo salvo conta, especialmente ao inserir dados semelhantes repetidamente no Excel.

Para fazer isso funcionar, você precisa usar um manipulador de eventos. Os manipuladores de eventos eram novos no Excel 97 e foram discutidos em Executar uma macro sempre que o valor de uma célula muda no Excel. No entanto, naquela dica, o manipulador de eventos estava aplicando um formato diferente a certas células. Este aplicativo é um pouco diferente, então vamos revisitar o manipulador de eventos.

Um manipulador de eventos é um pequeno código de macro que é executado toda vez que um determinado evento acontece. Nesse caso, queremos que a macro seja executada sempre que você alterar uma célula. Para configurar um manipulador de eventos, siga estas etapas:

  • Um manipulador de eventos está associado a apenas uma única planilha. Comece a partir dessa planilha e pressione alt-F11 para abrir o editor VB.
  • Na janela superior esquerda (Projeto - Projeto VBA) clique duas vezes no nome de sua planilha.
  • No painel direito, clique no menu suspenso à esquerda e mude geral para Planilha.
  • No menu suspenso à direita, escolha Alterar.

Isso fará com que o Excel pré-insira o seguinte macro shell para você:

Private Sub Worksheet_Change(ByVal Target As Range) UserInput = Target.Value If UserInput> 1 Then NewInput = Left(UserInput, Len(UserInput) - 2) & ":" & Right(UserInput, 2) Application.EnableEvents = False Target = NewInput Application.EnableEvents = True End If End Sub

Sempre que uma célula é alterada, a célula que foi alterada é passada para este programa na variável chamada "Destino". Quando alguém insere um tempo com dois pontos na planilha, ele será avaliado como um número menor que um. O bloco If certifica-se de alterar as células apenas se forem maiores que um. Eu uso as funções left () e right () para quebrar a entrada do usuário em horas e minutos e inserir dois pontos no meio.

Sempre que o usuário inserir "2345", o programa mudará essa entrada para 23:45.

Possíveis melhorias

Se você deseja limitar o programa para funcionar apenas nas colunas A&B, você pode verificar o valor de Target.Column e apenas executar o bloco de código se estiver nas duas primeiras colunas:

Private Sub Worksheet_Change(ByVal Target As Range) ThisColumn = Target.Column If ThisColumn 1 Then NewInput = Left(UserInput, Len(UserInput) - 2) & ":" & Right(UserInput, 2) Application.EnableEvents = False Target = NewInput Application.EnableEvents = True End If End If End Sub

Se você quiser fazer alterações na planilha sem inserir dois pontos (por exemplo, se você precisa adicionar fórmulas ou alterar títulos, etc.), você pode desligar o manipulador de eventos com esta macro curta:

Sub TurnEventHanderOff() Application.EnableEvents = False End Sub You can turn event handlers back on with this macro: Sub TurnEventHanderOff() Application.EnableEvents = True End Sub

Se você pegar esse conceito e alterá-lo, há um conceito importante a ser considerado. Quando a macro do manipulador de eventos atribui um novo valor à célula referenciada por Target, o Excel conta isso como uma alteração na planilha. Se você não ativar rapidamente os manipuladores de eventos, o Excel começará a chamar recursivamente o manipulador de eventos e você obterá resultados inesperados. Antes de fazer uma alteração em uma planilha em um manipulador de eventos de alteração, certifique-se de suspender temporariamente o tratamento de eventos com a linha Application.EnableEvents.

Artigos interessantes...