0

have a string datetime that contains a pending 'AEST' that needs to be removed so can do date calculations

to do this manually using Find and Replace 'AEST' with blank works. However want to do this in VBA which does not work. - for example when there are 4 sample dates there is inconsistency and the 2 of the dates get converted to US time instead of AUS time. - dont know the root cause of this inconsistency

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 


Pᴇʜ
  • 56,719
  • 10
  • 49
  • 73
da3data
  • 13
  • 3

2 Answers2

1

The issue is that the computer cannot know which format this string date has

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

It could be both of the following

dd-mm-yyyy
mm-dd-yyyy

So what you did is let the computer guess and it fails. Even a human cannot say which one of the both formats is the correct one. Therefore dates that are strings and no real dates are pretty useless (unless you have additional information about the format, which is not part of the date-string itself).

So the only working solution to convert a string into a date is that if you know which of the both format is the correct one, to use this information to split the date into pieces and use the DateSerial function to create a real date out of it.

You will need to do something like below for every cell as a string-date conversion.

An example

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

In the end you can write your real datetime into a cell and format it with Range("A1").NumberFormat into which format you like.

enter image description here Image 1: Variable values during string to date conversion.

Please note that the code above is just an example of the concept. If you need to make it solid you probably will need some checkings and error handling because it will fail on unexpected input strings.

Also it is probably a good idea to make a function out of it that you can re-use like:

Public Function ConvertDDMMYYYYTimeStampToRealDateTime(ByVal TimeStampString As String) As Date

End Function
Pᴇʜ
  • 56,719
  • 10
  • 49
  • 73
0

You can do this also with Power Query aka Get & Transform available in Excel 2010+

All of the steps can be done via the GUI

  • Get the data from Table/Range
  • Split the column by space delimiter (right-most instance only)
  • Change the format -- by Locale selecting DateTime for the format and English(Australia) for the locale

After you've done this once, if you refresh the data source table, you can update the query.

The worksheet will now contain "real" Excel date/times and, if not formatted how you wish, merely change the cell format.

Original

enter image description here

Results

enter image description here

M-Code (you don't really need this, but if you paste it into the Advanced Editor, it will recreate the GUI steps if you're having a problem.

You may need to change the Table name if you use this method.)

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"
Community
  • 1
  • 1
Ron Rosenfeld
  • 53,870
  • 7
  • 28
  • 60