簡體   English   中英

日期從文本格式轉換為VBA中的日期格式

[英]Date from Text format to Date format in VBA

我想將日期從文本格式更改為日期格式(自定義)dd / mm / yyyy hh:mm。 我已經閱讀了網站內所有類型的類似問題,但似乎對我沒有任何幫助。 即使我應用更改,日期仍保持為文本格式。 有沒有一種方法可以在VBA中使用Date函數。 或一般而言,關於我最終將如何工作的任何想法。 我的日期是來自名為“ TMS”的excel工作表中的vlookup,它們以文本格式顯示。 目標工作表為“跟蹤器”。 日期從網站導入到“ TMS”表中,因此我必須在Excel中自動執行格式更改。 我的代碼在下面提供。 非常感激!!

下面的代碼是固定的代碼,其日期格式適用於此代碼,但它不會為每一行運行循環,而是僅將第一行的值復制粘貼到其他行。 換句話說,它完美地適用於第一行,但不適用於另一行!

Sub Tracker()

 Sheets("TMS").Select
lastrow = Range("B" & Rows.Count).End(xlUp).Row
With Range("G2:G" & lastrow)
If Not IsEmpty(Range("G2:G" & lastrow)) Then
.value = .Parent.Evaluate("DATE(MID(" & .Address & ",7,4),MID(" & .Address & ",4,2),LEFT(" & .Address & ",2))+RIGHT(" & .Address & ",4)")
End If
End With
Sheets("Tracker").Select
lastrow = Range("B" & Rows.Count).End(xlUp).Row
With Range("AG2:AG" & lastrow)
.Formula = "=VLOOKUP(B2,TMS!B:G,6,FALSE)"
.value = .value
End With

End Sub

POC

在上圖中,我已說明了用於從文本轉換為它們的各個組成部分然后返回到包含時間的日期序列的公式。 F2的格式設置為自定義格式以正確顯示。

只需添加到With Range("G2:G" & lastrow)部分:

.Value = .Parent.Evaluate("DATE(MID(" & .Address & ",7,4),MID(" & .Address & ",4,2),LEFT(" & .Address & ",2))+RIGHT(" & .Address & ",4)")

這應該一步將所有字符串更改為數值:)

編輯
由於Evaluate不想以此方式返回數組,因此我們只需通過INDEX對其進行強制:

.Value = .Parent.Evaluate("INDEX(DATE(MID(" & .Address & ",7,4),MID(" & .Address & ",4,2),LEFT(" & .Address & ",2))+RIGHT(" & .Address & ",4),)")

我不確定您的工作表的組織方式,但是考慮到日期已導入到Sheets("TMS").Range("G2:G" & lastrow) ,並且您無法僅通過使用.NumberFormat = "mm/dd/yyyy hh:mm"來更改其格式。 .NumberFormat = "mm/dd/yyyy hh:mm"那么您需要刪除完整的文本並將其粘貼為日期。

您還應該避免選擇工作表。 您的代碼應類似於此。 如果我猜錯了,請更正零件。

Sub Tracker()
Dim lastrow As Long
Dim arr() As Date
With Sheets("TMS")
    lastrow = .Range("B" & .Rows.Count).End(xlUp).Row
    ReDim arr(lastrow) As Date
    For i = 2 To lastrow
        arr(i) = .Range("G" & i).Value
    Next i

    .Range("G2:G" & lastrow).Delete
    For i = 2 To lastrow
        .Range("G" & i) = arr(i)
    Next i
    .Range("G2:G" & lastrow).NumberFormat = "mm/dd/yyyy hh:mm"
End With
With Sheets("Tracker")
    lastrow = .Range("B" & .Rows.Count).End(xlUp).Row
    With .Range("AG2:AG" & lastrow)
        .Formula = "=VLOOKUP(B2,TMS!B:G,6,FALSE)"
        .NumberFormat = "mm/dd/yyyy hh:mm"
    End With
End With
End Sub

試試這個代碼。

Sub Tracker()
    Dim vDB, vT, vD
    Dim i As Long
    With Sheets("TMS")
        lastrow = .Range("B" & Rows.Count).End(xlUp).Row
        With .Range("G2:G" & lastrow)
            vDB = .Value
            If IsDate(vDB(1, 1)) Then
            Else
                For i = 1 To UBound(vDB, 1)
                    vT = Split(vDB(i, 1), " ")
                    vD = Split(vT(0), "/")
                    vDB(i, 1) = DateSerial(vD(2), vD(1), vD(0)) + Val(Trim(vT(1)))
                Next i
            End If
            .Value = vDB
            .NumberFormat = "mm/dd/yyyy hh:mm"
        End With
    End With
    With Sheets("Tracker")
        lastrow = .Range("B" & Rows.Count).End(xlUp).Row
        With .Range("AG2:AG" & lastrow)
            .Formula = "=VLOOKUP(B2,TMS!B:G,6,FALSE)"
            .NumberFormat = "mm/dd/yyyy hh:mm"
            .Value = .Value
        End With
    End With
End Sub

暫無
暫無

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

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