VBA中从文本格式到日期格式的日期

时间:2017-08-19 23:39:20

标签: excel vba excel-vba date

我想将日期从文本格式更改为日期格式(自定义)dd / mm / yyyy hh:mm。我一直在网站上阅读所有类似的类似问题,但似乎没有什么对我有用。即使我应用更改,日期也会保留为文本格式。有没有办法在VBA中使用Date函数。或者一般来说,任何有关我如何最终使其发挥作用的想法。我的日期是来自名为" TMS"的excel表的vlookup,它们是文本格式。目标表是" Tracker"。日期从网站导入到" 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

4 个答案:

答案 0 :(得分:3)

POC

在上图中,我已经说明了用于从文本转换为各种组件然后返回包含时间的日期序列的公式。 F2的格式设置为自定义格式以便正确显示。

答案 1 :(得分:3)

只需添加到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),)")

答案 2 :(得分:0)

我不确定您的工作表是如何组织的,但考虑到日期已导入Sheets("TMS").Range("G2:G" & lastrow),并且您无法仅使用.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

答案 3 :(得分:0)

试试这段代码。

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