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

use*_*244 25 excel vba excel-vba

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

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

Columns("A").Select
Selection.NumberFormat = "date"
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

任何建议,将不胜感激.

小智 28

您可以使用工作表的数据►文本到列命令的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
Run Code Online (Sandbox Code Playgroud)

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

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


Sam*_*Sam 26

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

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

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

  • 万分感谢。即使 7 年后仍然有用:) (2认同)

san*_*ica 13

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

c.Value = CDate(c.Value)
Run Code Online (Sandbox Code Playgroud)

工作(仅使用Excel 2010测试您的案例描述).至于你得到类型不匹配错误的原因,你可以检查(例如)这个.

这可能是一个区域问题.


Gar*_*ent 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
Run Code Online (Sandbox Code Playgroud)

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


San*_*arn 5

我之前有一个非常相似的问题。不幸的是,我看了这个帖子,没有找到我满意的答案。希望这会帮助其他人。

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

function convDate(str as string) as Date
  Dim day as integer, month as integer, 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
Run Code Online (Sandbox Code Playgroud)