簡體   English   中英

使用 Excel VBA 進行字符串到日期轉換

[英]String to date conversion with Excel VBA

有一個字符串日期時間,其中包含需要刪除的待處理“AEST”,以便進行日期計算

使用“查找和替換”空白作品手動執行此操作。 但是想在 VBA 中這樣做是行不通的。 - 例如,當有 4 個樣本日期時存在不一致,其中 2 個日期被轉換為美國時間而不是澳大利亞時間。 - 不知道這種不一致的根本原因

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 


問題是計算機無法知道該字符串日期的格式

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

可能是以下兩種

dd-mm-yyyy
mm-dd-yyyy

所以你所做的就是讓計算機猜測並且它失敗了。 即使是人類也無法說出這兩種格式中的哪一種是正確的。 因此,作為字符串且沒有實際日期的日期是毫無用處的(除非您有關於格式的其他信息,這不是日期字符串本身的一部分)。

因此,將字符串轉換為日期的唯一可行解決方案是,如果您知道這兩種格式中的哪一種是正確的,則使用此信息將日期拆分為多個片段並使用DateSerial function從中創建一個真實的日期.

您需要對每個單元格執行如下操作作為字符串日期轉換。

一個例子

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將其格式化為您喜歡的格式。

在此處輸入圖像描述 圖 1:字符串到日期轉換期間的變量值。

請注意,上面的代碼只是這個概念的一個例子。 如果您需要使其穩固,您可能需要進行一些檢查和錯誤處理,因為它會因意外輸入字符串而失敗。

此外,用它制作 function 可能是個好主意,您可以像這樣重復使用:

Public Function ConvertDDMMYYYYTimeStampToRealDateTime(ByVal TimeStampString As String) As Date

End Function

您也可以使用 Excel 2010+ 中提供的Power Query aka Get & Transform

所有步驟都可以通過 GUI 完成

  • 表/范圍獲取數據
  • space分隔符拆分列(僅限最右邊的實例)
  • 更改格式——通過語言環境選擇DateTime時間作為格式,選擇English(Australia)作為語言環境

完成此操作一次后,如果刷新數據源表,則可以更新查詢。

工作表現在將包含“真實的” Excel 日期/時間,如果未按您希望的方式格式化,只需更改單元格格式。

原來的

在此處輸入圖像描述

結果

在此處輸入圖像描述

M-Code您實際上並不需要它,但如果您將其粘貼到高級編輯器中,如果您遇到問題,它將重新創建 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"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM