Excel VBA - 将文本转换为日期?

时间:2013-12-04 12:20:50

标签: excel vba excel-vba

我有一列日期(A列)以yyyy-mm-dd格式存储为文本,我正在尝试将其转换为日期,最终我可以对它们进行查找。

我已经在这里阅读了一些主题,并尝试了一些建议,但我无法得到任何工作。一个人正在使用:

Columns("A").Select
Selection.NumberFormat = "date"

这改变了单元格的格式,但实际上并没有改变仍然存储为文本的值的格式。

我的理解是我需要使用CDate()将值的格式从文本更改为日期。我尝试过这样的事情:

Dim c As Range
For Each c In ActiveSheet.UsedRange.columns("A").Cells
    c.Value = CDate(c.Value)
Next c

这给了我一个类型不匹配的错误。我想知道这是不是因为我试图将日期值保存回非日期格式化的单元格中,所以我尝试将它与上面的.NumberFormat =“date”结合起来,这也不起作用。

任何建议都将不胜感激。

11 个答案:

答案 0 :(得分:27)

您可以快速将类似日期的文本列转换为实际日期,其中VBA等效于工作表的数据►文本到列的命令。

With ActiveSheet.UsedRange.Columns("A").Cells
    .TextToColumns Destination:=.Cells(1), DataType:=xlFixedWidth, FieldInfo:=Array(0, xlYMDFormat)
    .NumberFormat = "yyyy-mm-dd"   'change to any date-based number format you prefer the cells to display
End With

批量操作通常比循环遍历单元格快得多,而VBA的Range.TextToColumns method非常快。它还允许您自由设置MDY与DMY或YMD转换掩码,这些掩码会困扰许多文本导入,其中日期格式与系统的区域设置不匹配。有关可用日期格式的完整列表,请参阅TextFileColumnDataTypes property

  

警告:在导入某些日期尚未转换的文本时要小心。具有模糊月和日整数的基于文本的日期可能已被错误地转换;例如2015年7月11日可能已被解释为2015年11月7日或2015年7月11日,具体取决于系统区域设置。在这种情况下,放弃导入并将文本带回数据►获取外部数据►从文本中,并在文本导入向导中指定正确的日期转换掩码。在VBA中,使用Workbooks.OpenText method并指定xlColumnDataType。

答案 1 :(得分:21)

您可以使用DateValue将字符串转换为此实例中的日期

Dim c As Range
For Each c In ActiveSheet.UsedRange.columns("A").Cells
    c.Value = DateValue(c.Value)
Next c

它可以将yyyy-mm-dd格式字符串直接转换为本机Excel日期值。

答案 2 :(得分:12)

除了其他选项,我确认使用

c.Value = CDate(c.Value)

有效(仅使用Excel 2010对您的案例进行测试)。至于您收到类型不匹配错误的原因,您可以检查(例如)this

这可能是区域设置问题。

答案 3 :(得分:6)

也许:

Sub dateCNV()
    Dim N As Long, r As Range, s As String
    N = Cells(Rows.Count, "A").End(xlUp).Row
    For i = 1 To N
        Set r = Cells(i, "A")
        s = r.Text
        r.Clear
        r.Value = DateSerial(Left(s, 4), Mid(s, 6, 2), Right(s, 2))
    Next i
End Sub

这假设列 A 包含文本值,如2013-12-25,没有标题单元格。

答案 4 :(得分:3)

此代码对我有用

Dim N As Long, r As Range
N = Cells(Rows.Count, "B").End(xlUp).Row
For i = 1 To N
    Set r = Cells(i, "B")
    r.Value = CDate(r.Value)
Next i

尝试更改列以适合您的工作表

答案 5 :(得分:2)

我之前有一个非常相似的问题。不幸的是,我看着这个线程,却没有找到自己满意的答案。希望这会帮助其他人。

使用VBA.DateSerial(year,month,day)可以克服Excel对美国日期格式的内在偏见。这也意味着您可以完全控制数据,这是我个人更喜欢的:

function convDate(str as string) as Date
  Dim day, month, year as integer
  year  = int(mid(str,1,4))
  month = int(mid(str,6,2))
  day   = int(mid(str,9,2))
  convDate = VBA.DateSerial(year,month,day)
end function

答案 6 :(得分:1)

到OP ... 我第一次尝试运行子程序时也遇到了类型不匹配错误。在我的情况下,它是由第一个单元格中的非日期数据(即标题)引起的。 当我将标题单元格的内容更改为日期样式的txt进行测试时,它运行得很好......

希望这也有帮助。

答案 7 :(得分:1)

过去的爆炸,但我想我找到了一个简单的答案。以下对我有用。我认为这等同于选择单元格并单击F2,然后按Enter,这使Excel将文本识别为日期。

Columns("A").Select
Selection.Value = Selection.Value

答案 8 :(得分:0)

我通过以下代码摆脱了类型不匹配:

Sub ConvertToDate()

Dim r As Range
Dim setdate As Range

'in my case I have a header and no blank cells in used range,
'starting from 2nd row, 1st column
Set setdate = Range(Cells(2, 1), Cells(2, 1).End(xlDown)) 

    With setdate
        .NumberFormat = "dd.mm.yyyy" 'I have the data in format "dd.mm.yy"
        .Value = .Value
    End With

    For Each r In setdate
        r.Value = CDate(r.Value)
    Next r

End Sub

但在我的特殊情况下,我的数据格式为" dd.mm.yy"

答案 9 :(得分:0)

对于DD- MM -YYYY这里有一个简单的解决方法来管理字符串和日期:

通过DD- MMM -YYYY将日期插入字符串 例如01-11-2017 - > 01-NOV-2017

您可以使用FORMAT(日期,“dd- mmm -yyyy”)将日期输入到电子表格中的字符串中。

稍后,当您从字符串中输出时,它不会混淆日期和月份。

答案 10 :(得分:0)

为我解决了这个问题:

Color