Преобразование строки в дату с помощью Excel VBA - PullRequest
0 голосов
/ 11 октября 2019

имеет строку datetime, которая содержит ожидающий 'AEST', который необходимо удалить, поэтому можно выполнить вычисления даты

, чтобы сделать это вручную, используя Find и заменяя 'AEST' пустыми работами. Однако хочу сделать это в VBA, который не работает. - например, когда есть 4 даты выборки, есть несоответствие, и 2 из дат конвертируются в время США вместо времени AUS. - не знаю причину этого несоответствия

Sub KPIM_RptMth()

Range("H:H").Select
Selection.Replace What:="AEST", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

End Sub
e.g. sample dates:

[REQ] WOC Date and Time
12-04-2019 01:03:32 PM AEST
22-06-2019 08:33:04 AM AEST
11-06-2019 03:30:00 PM AEST
17-06-2019 02:50:00 PM AEST

the correct output is:

[REQ] WOC Date and Time
12/04/2019 13:03
22/06/2019 8:33
11/06/2019 15:30
17/06/2019 14:50

the actual output after the VBA script above runs is:
[REQ] WOC Date and Time
4/12/2019 13:03
22-06-2019 08:33:04 AM 
6/11/2019 15:30
17-06-2019 02:50:00 PM 


Ответы [ 2 ]

1 голос
/ 11 октября 2019

Проблема в том, что компьютер не может знать, в каком формате указана эта строковая дата

12-04-2019 01:03:32 PM AEST

Это может быть как из следующегоугадай и это не удастсяДаже человек не может сказать, какой из двух форматов является правильным. Поэтому даты, которые являются строками и не имеют реальных дат, довольно бесполезны (если только у вас нет дополнительной информации о формате, который не является частью самой строки даты).

Таким образом, только рабочее решение для преобразования строки в дату , если вы знаете , какой из обоих форматов является правильным, использовать эту информацию для разбиения даты на части и использовать функцию DateSerial чтобы создать из нее реальную дату.

Вам нужно будет сделать что-то вроде ниже для каждой ячейки в качестве преобразования строки в дату.

Пример

Public Sub ConvertTimeStampToRealDateTime()
    Dim TimeStampString As String
    TimeStampString = "12-04-2019 01:03:32 PM AEST"

    'split by spaces
    Dim SplitTimeStamp As Variant
    SplitTimeStamp = Split(TimeStampString, " ")
        'SplitTimeStamp(0) = "12-04-2019"
        'SplitTimeStamp(1) = "01:03:32"
        'SplitTimeStamp(2) = "PM"
        'SplitTimeStamp(3) = "AEST"

    'split date by dash
    Dim SplitDate As Variant
    SplitDate = Split(SplitTimeStamp(0), "-")
        'SplitDate(0) = "12"
        'SplitDate(1) = "04"
        'SplitDate(2) = "2019"

    'now we add the information which of the 3 split parts is day, month and year
    'and put it together to a real date
    Dim RealDate As Date
    RealDate = DateSerial(SplitDate(2), SplitDate(1), SplitDate(0))

    'cast time string into a date
    Dim RealTime As Date
    RealTime = SplitTimeStamp(1) & " " & SplitTimeStamp(2)
        'casting from string to date works good for times but not for dates
        'so we can do that with the time

    'Add date and time to make it a datetime
    Dim RealDateTime As Date
    RealDateTime = RealDate + RealTime 'note that we need to ADD them mathematically (+) this is not a string concatenation (&)!!!

    'AEST: This information about how many hours you need to add or subtract
    '      from this datetime to convert it into your desired time zone needs
    '      needs to be done manually

    Dim RealDateTimeInMyZone As Date
    RealDateTimeInMyZone = DateAdd("h", -3, RealDateTime) 'for example subtract 3 hours
End Sub

В конце вы можете записать свое реальное время в ячейку и отформатировать его в Range("A1").NumberFormat в том формате, который вам нравится.

enter image description here Изображение 1: переменнаязначения во время преобразования строки в дату.

Обратите внимание, что приведенный выше код является лишь примером концепции. Если вам нужно сделать это твердым, вам, вероятно, потребуются некоторые проверки и обработка ошибок, потому что это приведет к сбою в неожиданных входных строках.

Также, вероятно, хорошей идеей будет сделать из нее функцию, которую вы можете использовать повторно:

Public Function ConvertDDMMYYYYTimeStampToRealDateTime(ByVal TimeStampString As String) As Date

End Function
0 голосов
/ 12 октября 2019

Вы также можете сделать это с помощью Power Query aka Get & Transform, доступной в Excel 2010 +

Все шаги можно выполнить через графический интерфейс

  • Получить данные из Таблица / Диапазон
  • Разделить столбец по space разделителю (только для самого правого экземпляра)
  • Изменить формат - по локали выбрав DateTime для формата и English(Australia) для локали

После того, как вы сделали это один раз, обновив таблицу источника данных, вы можете обновить запрос.

Теперь рабочий лист будет содержать «настоящие» даты / время Excel и, если не отформатирован так, как вы хотите, просто измените формат ячейки. 1031 *

Результаты

enter image description here

M-код ( Вы не делаетеэто действительно нужно, но если вы вставите его в расширенный редактор, он воссоздает шаги GUI, если у вас возникли проблемы.

Возможно, вам придется изменить имя Tableесли вы используете этот метод. )

let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Split Column by Delimiter" = Table.SplitColumn(Source, "[REQ] WOC Date and Time", Splitter.SplitTextByEachDelimiter({" "}, QuoteStyle.Csv, true), {"[REQ] WOC Date and Time.1", "[REQ] WOC Date and Time.2"}),
    #"Removed Columns" = Table.RemoveColumns(#"Split Column by Delimiter",{"[REQ] WOC Date and Time.2"}),
    #"Changed Type with Locale" = Table.TransformColumnTypes(#"Removed Columns", {{"[REQ] WOC Date and Time.1", type datetime}}, "en-AU")
in
    #"Changed Type with Locale"
...