VBA - 将混合行(数据类型明智)转换为日期

时间:2016-03-23 15:23:03

标签: excel vba excel-vba date

我有一张excel表,其中一列与日期和日期混合在一起,已经复制到文本中(见下文)。

我没有设法将文本类型转换为Date类型,我需要通过VBA将其添加到我正在处理的某些自动化中。有没有办法做到这一点?

我注意到excel正在寻找像这样的格式03/09/2016 23:39:57并且它不喜欢3/21/16 11:07:22 PM,显然这是我的情况:)每一个看起来我运行得到(显然数据不匹配),在下面的图像中,语音列是" C"

thx:)

ExcelSheet bad Date format

2 个答案:

答案 0 :(得分:1)

Excel已根据您的Windows区域设置短日期格式解析日期。它无法解析的那些(月份> 12)作为文本留下的。由于文本文件中的日期格式与Windows区域设置中的日期格式之间最初存在差异,因此很可能许多日期(或未格式化的数字)的日期转换不正确。

您有几个选择:

  1. Import文本文件使用Get External Data上的From Text标签Data Ribbon选项。这将打开文本导入向导,并允许您指定要导入的数据的日期格式。
  2. 更改Windows区域设置的短日期格式以匹配文本文件中的格式。
  3. 这些可能是两个最简单的选择。第一个可以通过VBA自动化。第二,不是那么多。

答案 1 :(得分:1)

假设错误的日期是MM / DD / YYYY,那么您可以使用我为您编写的以下代码:

   Sub main()

    Dim celda As Range
    Dim s_date As String
    Dim s_time As String
    Dim validate_date As String
    Dim valid_date As String
    Dim date_arr() As String
    Dim rango As Range
    Dim limit As Long

    limit = Columns("B").Find("", Cells(Rows.Count, "B")).Row - 1
    Set rango = ActiveSheet.Range("B2:B" & limit)


    ' works only for date values, another value would return non expected values
    For Each celda In rango
        validate_date = Left(celda.Value, 1)
        If validate_date <> "" Then
            If Not celda.Rows.Hidden Then
                If validate_date <> "0" Then
                    s_date = Trim(Mid(celda.Value, 1, InStr(1, celda.Value, " ") - 1))
                    s_time = Trim(Mid(celda.Value, InStr(1, celda.Value, " "), Len(celda.Value) - InStr(1, celda.Value, " ")))

                    date_arr = Split(s_date, "/")

                    valid_date = date_arr(1)
                    valid_date = valid_date & "/0" & date_arr(0)
                    valid_date = valid_date & "/" & date_arr(2)
                    valid_date = valid_date & " " & s_time

                    celda.Offset(0, 1).Value = CDate(valid_date)
                End If
            End If
        End If
    Next celda

End Sub

为了使用此代码,您应该从目标向右插入一个空列。其次,您应该选择整个C列并运行宏。

编辑1。好的,此宏自动选择列B.现在不需要选择列日期。