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