Tenho um documento do Word que é uma exportação de um longo histórico de bate-papo e cada entrada inclui um carimbo de data/hora UNIX de 13 dígitos. Preciso converter cada carimbo de data/hora para data/hora convencional/legível (por exemplo, sexta-feira, 17 de janeiro de 2025, 2h47 EST) e anexar a conversão convencional após o carimbo de data/hora original. Tenho uma macro que FUNCIONA NA MAIORIA das vezes, mas meu loop não está iterando corretamente.
A macro tem como objetivo:
- Pesquise cada carimbo de data/hora de 13 dígitos
- Converta esse registro de data e hora em data/hora convencional
- Adicione a data/hora convencional após o registro de data e hora
- Iterar e encontrar o próximo registro de data e hora e repetir
Não consigo descobrir como fazer a variável Range colar/inserir o valor anexado ao documento e depois iterar para encontrar o próximo registro de data e hora (sou muito inexperiente para saber o que estou fazendo errado)
Por exemplo, o primeiro registro de data e hora é "1702654591899" e o texto de substituição pretendido é: "1702654591899; Sexta-feira, 15 de dezembro de 2023 - 10:36:32 AM EST" e quero repetir para o próximo registro de data e hora, iterando até o final do documento.
Aqui está o código que tenho com comentários:
'Function converts UNIX 13 Digit Timestamp to date/time in Eastern Standard Time
'Subtracts 18,000,000 miliseconds to subtract 5 hours for Eastern Standard Time
'Adapted from FaneDuru's Solution at:
'https://stackoverflow.com/questions/73011816/excel-vba-convert-unix-timestamp-to-date-time
Function fromUNIX13DigitsEST(uT) As Date
''Original line that converts to UTC or GMT (I'm not sure which but it's
''5 hours later than intended so I commented it out but left it for info purposes)
'fromUNIX13DigitsEST = CDbl(uT) / 86400000 + DateSerial(1970, 1, 1)
'Modified from line above to account for Eastern Standard Time
fromUNIX13DigitsEST = (CDbl(uT) - 18000000) / 86400000 + DateSerial(1970, 1, 1)
End Function
'Loops and Finds all 13 digit Unix Timestamps and replaces them with the Timestamp plus
'conventional date/time
Sub FindUnix13DigitTimestampsAndAddConventionalDateAndTime()
Dim TimestampInstance As Range
Dim TimestampAndConverted As String 'Artifact of the learning process kept to prevent loops
Set TimestampInstance = ActiveDocument.Range
With TimestampInstance.Find
'Do I need more of these? Is this section the problem?
.Text = "[0-9]{13}"
.MatchWildcards = True
Do While .Execute(Forward:=True) = True
TimestampInstance.Select
' Used to test before adding the "TimestampInstance.Text = ..." line below
' Sets string variable equal to the original Timestamp and adds the standard date/time/time zone
' Uses the Function above to convert the UNIX TimeStamp
' Kept to use in the MsgBox line below as a failsafe against a runaway loop
' Adapted from FaneDuru's Solution at
' https://stackoverflow.com/questions/73011816/excel-vba-convert-unix-timestamp-to-date-time
TimestampAndConverted = TimestampInstance + "; " + Format(fromUNIX13DigitsEST(TimestampInstance), "dddd, mmmm d, yyyy - hh:nn:ss AM/PM") + " EST"
' PROBLEMATIC LINE THAT PARTIALLY DOES WHAT I INTENDED IT TO DO
' Duplicates the Function call above and adds standard date items
' Meant to replace each 13-digit timestamp with the timestamp plus standard date/time/time zone
' If commented out then loop iterates as intended and the MsgBox below displays each successive
' output from the TimestampAndConverted variable
TimestampInstance.Text = TimestampInstance + "; " + Format(fromUNIX13DigitsEST(TimestampInstance), "dddd, mmmm d, yyyy - hh:nn:ss AM/PM") + " EST"
'Displays variable TimestampAndConverted above in a message box & helps prevent a runaway loop
MsgBox TimestampAndConverted
'
'
' Should there be code here to allow the loop to iterate to next 13-digit timestamp
' or reset "TimestampInstance" variable??
'
'
''This isn't the solution since it ends up replacing the 13-digit timestamps with "" so I commented it out
'TimestampInstance.Text = ""
Loop
End With
End Sub
Consegui exibir a saída pretendida em uma MsgBox para cada iteração usando uma variável de string, mas quando tento repetir o processo com a variável Range e inserir o texto de substituição no Range, ele fica preso no primeiro registro de data e hora e adiciona novamente a data/hora convencional continuamente em um loop.
Usando o primeiro registro de data e hora ("1702654591899") como exemplo, o texto adicionado depois é "; Sexta-feira, 15 de dezembro de 2023 - 10:36:32 AM EST", mas o loop continua adicionando novamente "; Sexta-feira, 15 de dezembro de 2023 - 10:36:32 AM EST", então termina como:
"1702654591899; Sexta-feira, 15 de dezembro de 2023 - 10:36:32 AM EST ... 15, 2023 - 10:36:32 AM EST; Sexta-feira, 15 de dezembro de 2023 - 10:36:32 AM EST; Sexta-feira, 15 de dezembro de 2023 - 10:36:32 AM EST..."
nesse ponto eu pressiono CTRL+Quebro o loop e encerro a macro.
Como adiciono a data/hora convencional uma vez após cada registro de data e hora encontrado e depois continuo para o próximo registro de data e hora?