【问题标题】:Optimizing a date conversion loop优化日期转换循环
【发布时间】:2016-09-07 12:42:46
【问题描述】:

我有一组数据 (n),大约 1500 个项目长,以 DD.MM.YYYY 格式填充 Excel 无法识别的日期。我的目标是将它们更改为 excel 可以使用的东西,我就是这样做的。

Function date_to_excel()
Call public_dims

Dim date_i As String
date_array = ThisWorkbook.Sheets("Spread").Range(Cells(7, 5), Cells(7 + n, 5))

For i = 0 To n
date_i = ThisWorkbook.Sheets("Spread").Cells(7 + i, 5)
    If date_i <> "" Then
    date_array = Split(date_i, ".")
    date_i = date_array(1) & "/" & date_array(0) & "/" & date_array(2)
    ThisWorkbook.Sheets("Spread").Cells(7 + i, 5) = date_i
    End If
Next

End Function

该功能可以正常工作,但需要很长时间。 我向社区询问的是关于如何优化此循环的想法。我尝试将带有日期的整个范围添加到一个数组中并查看它,但它似乎与我的不兼容更改日期格式的方法(date_i = 接近末尾的行)。

【问题讨论】:

  • 也许你可以做一个Replace。找到. 并替换为/
  • 如果您将单元格格式设置为“自定义”并将自定义格式设置为“dd.mm.yyyy”,Excel 会将单元格中的值识别为日期
  • @Zac 没办法。不工作
  • 日期和月份是始终在 2 char (01..11) 还是变量 (1..11) 上?
  • 对不起,那是我的错。我在单元格中用“/”尝试了日期,它有效,但如果它用“。”它不起作用。请取消我的评论

标签: excel vba date


【解决方案1】:

您可以将文本到列功能与 DMY 列格式一起使用。

ThisWorkbook.Sheets("Spread").Range("E7:E" & 7 + n).TextToColumns _
                                DataType:=xlDelimited, FieldInfo:=Array(1, xlDMYFormat)

【讨论】:

  • 最简单最快的
  • 超级简单的解决方案,工作速度快,效果好——谢谢,我以后会多次使用它!
【解决方案2】:

“我尝试将带有日期的整个范围添加到一个数组中并查看它”...

是的,这就是要走的路。一次一个地读取和写入工作表上的单元格需要花费大量时间。

Dim vData as Variant
Dim vDates() as Date
ReDim vDates(1 to n, 1 to 1) as Date
Dim i as Long

vData = ThisWorkbook.Sheets("Spread").Range("E7").Resize(n,1).Value

For i = 1 to n
    vDates(i,1) = DateSerial(Split(vData(i,1),".")(2),vData(i,1),".")(1),vData(i,1),".")(0))
Next

ThisWorkbook.Sheets("Spread").Range("E7").Resize(n,1).Value = vDates

【讨论】:

  • OP 在他的代码中检查了一个空字符串,但做得很好 +1。
猜你喜欢
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 2021-06-20
  • 1970-01-01
  • 2019-09-19
  • 2017-07-20
相关资源
最近更新 更多