Analisando dados de data / hora não padrão em uma célula da planilha do Excel

0

Estou procurando alguns conselhos sobre isso mais do que qualquer outra coisa. Eu tenho uma planilha que contém horas de loja para cada local no trabalho. Os formatos variam disso:

"Mon-Sat 9:30am-9:00pm 
Sunday 11:00am-6:00pm"

Para o extremo disso:

"Mon-Thurs 9:30am-9:00pm 
Fri & Sat 9:30am-11:00pm
Sunday 9:30am-6:00pm
Stat Hol 11:00am-6:00pm"

A prioridade dessa célula é estar em formato legível, mas preciso analisar esses dados para exibir a hora que a loja fecha (sempre 18h, 21h ou 23h) para cada dia da semana.

É melhor modificar esses dados em um formato de data / hora que o Excel goste, então concatená-los para a célula legível, ou é possível (ou até mesmo preferido) analisar os dados existentes para obter esses horários de fechamento sem mudando o formato?

    
por David Metcalfe 06.10.2015 / 22:03

3 respostas

2

Aqui está uma função definida pelo usuário que pode analisar os dados nos formatos mostrados e "preencher os espaços em branco". Ele retorna uma matriz de valores - uma vez para cada dia da semana, mais uma entrada para "hol". Se o horário de encerramento de um determinado dia não estiver definido, o item conterá uma string nula "" .

Para usar essa fórmula, insira =ClosingTime($B2) como uma fórmula de matriz em um intervalo horizontal de oito células. No exemplo abaixo, você inseriria a fórmula em C2 . Em seguida, selecione C2:J2 . Por fim, confirme mantendo pressionado ctrl+shift ao atingir enter . Você poderia então, com c2:j2 selecionado, arrastar para baixo para quantos locais forem necessários.

O UDF usa uma expressão regular para analisar os dados. Se houver dois nomes de dias da semana em uma linha, preenche os dias entre eles com o mesmo horário de encerramento; se apenas um único dia da semana, apenas preenche esse dia da semana.

Para inserir essa função definida pelo usuário (UDF), alt-F11 abre o Editor do Visual Basic. Certifique-se de que seu projeto esteja destacado na janela Explorador de Projetos. Em seguida, no menu superior, selecione Inserir / Módulo e cole o código abaixo na janela que é aberta.

Option Explicit
Function ClosingTime(S As String)
    Dim RE As Object, MC As Object, M As Object
    Const sPat As String = "(?:(?:\b(mon|tue|wed|thu|fri|sat|sun|hol).*\b(mon|tue|wed|thu|fri|sat|sun|hol))|\b(mon|tue|wed|thu|fri|sat|sun|hol)).*?(\b\d+:?\d*)p"
    Dim arWkDays As Variant
    Dim I As Long, J As Long
    Dim sTemp As String
    Dim V(0 To 7) As Variant

For I = 0 To 7
    V(I) = ""
Next I

arWkDays = VBA.Array("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Hol")

Set RE = CreateObject("vbscript.regexp")
With RE
    .Global = True
    .MultiLine = True
    .ignorecase = True
    .Pattern = sPat
    If .test(S) = True Then
        Set MC = .Execute(S)
        For Each M In MC
            With WorksheetFunction
            'submatches 0-1 is range; 2 is single day; 3 is the closing time
            If M.submatches(0) <> "" And M.submatches(1) <> "" Then
                For I = .Match(M.submatches(0), arWkDays, 0) To .Match(M.submatches(1), arWkDays, 0)
                    V(I - 1) = CDate(M.submatches(3) & "PM")
                Next I
            ElseIf M.submatches(2) <> "" Then
                V(.Match(M.submatches(2), arWkDays, 0) - 1) = CDate(M.submatches(3) & "PM")
            End If
            End With
        Next M
    End If
End With

ClosingTime = V

End Function

    
por 08.10.2015 / 13:37
2

Eu atualizei algo juntos apenas para demonstrar o conceito. Tenho certeza de que isso poderia ser muito simplificado com fórmulas de matriz, mas eu estava indo para rápido e fácil de seguir.

Explicaçãodaestrutura

ColunasAeBsãoseusdadosdeamostra.ObservequeincluíoIDdalojaemcadalinha.Estaéapenasumaboapráticanocasodeosdadosficaremembaralhados,masnãonecessários.Vocêquerfecharashoraspordiaparacadalojaeaslojastêmnúmerosvariadosderegistros,entãoadicioneiumalinhaderesumodalojaqueeventualmenteconteráumaentradaparacadadia.Aslinhasderesumopodemestaremum"relatório" separado de sua saída.

A tarefa requer a conversão de informações do dia em forma utilizável, e isso é uma bagunça. Tentar escrever fórmulas para analisar seus registros seria um pesadelo, dada a variedade de formatos. A abordagem que usei foi criar uma lista de frases de "dia" à medida que você as encontra e traduzir manualmente cada frase uma vez.

Isso também permite que você salve algumas entradas usando frases com o menor denominador comum. Por exemplo, você usou abreviações de três letras no primeiro exemplo, mas usou "qui" no segundo. Usando "Mon-Thu" irá coincidir com os dois casos.

A maior parte do seu período de dias é hifenizada, mas você usou "&" para "sex & sat". Sobre a chance de que também possa haver uma "Sexta-feira", acabei de fazer essa outra entrada na lista.

Se a capitalização não for a mesma, você poderá limpá-la manualmente ou usar funções de texto para forçar tudo em maiúsculas ou minúsculas.

Nesta captura de tela, ocultei algumas colunas temporariamente. A lista de frases do dia começa na coluna N, com as frases do dia na linha 1. Você acabou de adicionar outra frase na próxima coluna, conforme necessário. A linha 2 contém a lista de dias associada à frase, usando a numeração padrão do dia do Excel. Eu fiz feriado dia 0 (vejo que não está mostrando na minha tela, mas S2 seria 0 . Seg / Qua / Sex seria 246.

Primeira fórmula

As células sob as traduções diárias usam a mesma fórmula, então copie e cole conforme necessário:

=IF(ISERROR(FIND(N$1,$B3)),"",N$2)

Isso procura a frase do dia do cabeçalho da coluna no registro da agenda dessa linha. Se a frase for encontrada, a célula recebe a lista de dias incluída da linha 2, caso contrário, ela ficará em branco. Portanto, para cada registro de agendamento, uma frase deve corresponder e essa é a lista de dias que será exibida para a linha.

Colunas auxiliares

Estacapturadetelareveladuascolunasauxiliaresparamanteraexplicaçãosimples.AcolunaLresumealistadedias.Haveráapenasumaentradacorrespondenteeissoapenasaconsolida.AcélulaL3contém:

=SUM(N3:AB3)

Vocêpodeaumentarointervaloarbitrariamenteparanãoprecisarajustá-lotodavezqueadicionarumafrasedodia.Issopodesercopiadonacolunaconformenecessário.

AcolunaKcontémohoráriodefechamentoextraídodoregistrodeagendamento.AfórmulaemL3é:

=IF(ISBLANK(B3),"",REPT(MID(B3,LEN(TRIM(B3))-5,1),IF(MID(B3,LEN(TRIM(B3))-5,1)="1",2,1))&":00pm")

Qualquer método de análise será confuso porque os horários têm diferentes números de dígitos. Esta fórmula localiza o dígito da unidade de hora de fechamento. Ele usa uma vez se for 6 ou 9 e repetir o 1 se o tempo for 11 . Em seguida, concatena o ": 00:00". Eu adicionei um teste ISBLANK porque meu layout tem algumas linhas em branco.

Decodificação vezes por dia

Isso nos leva à carne do problema.

Estacapturadetelarevelaumacolunaparacadadiadasemanamaisferiados.Novamente,háumaúnicafórmulausadaparatodasascélulas,excetoaslinhasderesumo.AcélulaC3contém:

=IF(ISERROR(FIND(COLUMN()-3,$L3)),"",$K3)

Meu exemplo inicia os dias na terceira coluna, e o primeiro deles é Holidays, que é codificado como dia 0. Essa fórmula calcula o número do dia associado à coluna e verifica se está na lista de dias para essa linha. Se estiver, obtém o valor de tempo extraído para a linha, caso contrário, um espaço em branco. Assim, todos os dias incluídos na frase do dia do registro obtêm o horário de encerramento do registro. Os dias não cobertos pela programação dessa linha não recebem nada.

A programação diária completa da semana é uma consolidação das linhas dessa loja. Se as linhas de resumo estiverem em outro lugar, você poderá usar o ID da loja para identificar as linhas que entram em cada resumo.

Para esta demonstração do conceito, não gostei da linha de resumo. Célula C5 é:

=C3&C4

A célula C11 é:

=C7&C8&C9&C10

Isso pode ser automatizado com base nas contagens de linha ou a linha de resumo pode ser criada diretamente em vez de consolidar as linhas do componente.

    
por 07.10.2015 / 06:38
1

Eu usaria o suplemento de consulta de energia para isso. No Excel 2016, o Power Query é incorporado à faixa de opções Dados na seção "Obter e transformar".

O Power Query pode começar a partir de uma tabela do Excel existente. O truque crucial é usar a opção "Dividir Coluna por Delimitador" para dividir no delimitador mais à direita. Você pode então retroceder as porções de tempo da string em novas colunas de Hora.

Um resultado da consulta pode ser entregue como uma tabela do Excel. Você pode construir isso sem escrever código de macro ou função - basta clicar na janela Power Query.

Eu criei uma solução de trabalho que você pode baixar do meu OneDrive e experimentar:

link

É o arquivo: Demonstração do Power Query - Analisando dados de data / hora não padrão

    
por 07.10.2015 / 01:53