Excel VBA – 将文本转换为date?
我有一列date(列A)以yyyy-mm-dd的格式存储为文本,我试图将其转换为date,最终我可以对它们进行查询。
我在这里读了几个主题,尝试了一些build议,但是我什么都不能做。 有人正在使用:
Columns("A").Select Selection.NumberFormat = "date"
这改变了单元格的格式,但实际上并没有改变仍然存储为文本的值的格式。
我的理解是,我需要使用CDate()从文本更改值的格式date。 我试过这样的事情:
Dim c As Range For Each c In ActiveSheet.UsedRange.columns("A").Cells c.Value = CDate(c.Value) Next c
这给我一个types不匹配的错误。 我想知道是否这是因为我试图将date值保存到一个非date格式的单元格,所以我试着把它与上面的.NumberFormat =“date”结合起来,这也没有工作。
任何build议,将不胜感激。
您可以快速地将类似date的文本列转换为实际date,其中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方法非常快。 它还允许您自由设置MDY与DMY或YMD转换蒙版,该蒙版在date格式与系统区域设置不匹配的情况下困扰许多文本导入。 请参阅TextFileColumnDataTypes属性以获取可用date格式的完整列表。
警告:导入文本时,请注意某些date尚未转换。 具有模糊的月份和date整数的基于文本的date可能已经被错误地转换; 例如07/11/2015可能被解释为2015年11月7日或2015年7月11日,具体取决于系统区域设置。 在这种情况下,放弃导入并使用数据►获取外部数据►从文本重新input文本,并在文本导入向导中指定正确的date转换掩码。 在VBA中,使用Workbooks.OpenText方法并指定xlColumnDataType。
您可以使用DateValue
在此实例中将string转换为date
Dim c As Range For Each c In ActiveSheet.UsedRange.columns("A").Cells c.Value = DateValue(c.Value) Next c
它可以将yyyy-mm-dd
格式string直接转换为本机Exceldate值。
除了其他选项,我确认使用
c.Value = CDate(c.Value)
作品(只用Excel 2010中的案例说明进行testing)。 至于你得到types不匹配错误的原因,你可以检查(例如) 这一点 。
这可能是一个语言环境问题。
也许:
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,没有标题单元格。
此代码正在为我工作
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
尝试更改列以适合您的工作表
到OP …我也有一个types不匹配的错误,我第一次尝试运行你的子程序。 在我的情况下,这是由第一个单元格中的非date类似的数据(即标题)造成的。 当我将标题单元格的内容更改为date样式的txt进行testing时,它运行得很好…
希望这也有帮助。
我已经摆脱了types不匹配的代码如下:
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”
对于DD- MM -YYYY这里是一个简单的解决方法来pipe理string和date:
例如01-11-2017 – > 01-Nov-2017通过DD- MMM -YYYY将date插入到string中
U可以使用FORMAT(date“dd- mmm -yyyy”)将dateinput到电子表格中的string中。
后来,当你从一个string输出它时, 它不会混淆日子和月份。