Excel VBA:将日期重新格式化为非常短的日期,两位数年份不起作用

时间:2016-10-05 08:44:40

标签: excel vba excel-vba date date-formatting

我有一个从其他应用程序导出的日期列表。最初,它们的格式为标准,无需任何特殊或自动转换,格式为YYYY.MM.DD

以前我只是用斜线替换了点,Excel将日期识别为日期,自动将它们格式化为适当的区域设置DD.MM.YYYY,这很好。

现在,我只想删除年份的前两位数字(新格式DD.MM.YY),但它无法以我尝试过的任何方式工作。到目前为止我做了什么:

  • currentCell.Value = CDate(currentCell.Value):这会将格式切换为日期,但标准长格式仍然适用。
  • currentCell.NumberFormat = "dd.mm.yy;@"从录制宏并手动更改值可以看出。似乎没有对输出格式产生任何影响。
  • currentCell.Value = FormatDateTime(currentCell.Value, vbShortDate):不起作用,因为短日期为DD.MM.YYYY,而不是当前区域设置中的DD.MM.YY
  • 根据Tom Preston和msaint的建议
  • format(date, "dd.mm.yy"):与NumberFormat版本相比,不会更改输出。

我观察到的另一件奇怪的事情是:在每个VBA应用日期更改后,不再可能通过GUI手动更改日期格式/似乎没有任何效果。

这可能是什么原因,我怎么能在VBA中实现真正的短暂日期?

4 个答案:

答案 0 :(得分:2)

尝试 format(date, "dd.mm.yy")

如果可以接受,这将以字符串格式给出答案吗? 为此提供一些背景信息:

Sub Datings()
    Dim d As Date
    d = Now
    Debug.Print d, Format(d, "dd/mm/yy")
End Sub

答案 1 :(得分:2)

将文本日期转换为Excel识别为日期的内容(将替换为原来的 / ,然后只更新单元格中的数字格式。< / p>

Sheet1.Range("A1") = Replace(Sheet1.Range("A1"), ".", "/")
Sheet1.Range("A1").NumberFormat = "dd.mm.yy"

答案 2 :(得分:1)

在建议添加汤姆普雷斯顿的更多周边代码之后,我在第一个单元格上尝试了Darren Bartrup-Cook的示例代码作为一个非常基本的测试。它不起作用,所以我使用断点来跳过这段代码之前和之后的所有代码。

这表明, 一直正常工作,但以后其他代码通过在正确格式化的单元格上调用Cells(1,1).Value = "" & Cells(1,1).Value来恢复格式化。我没有注意到它,因为在GUI中它仍然显示为格式:日期,虽然它在内部被覆盖。

因此,完整的解决方案就像使用

一样简单
Range("A1:A" & lastRow).Replace What:=".", replacement:="/", LookAt:=xlPart
Sheet1.Range("A1:A" & lastRow).NumberFormat = "dd.mm.yy"

稍后点击A列。

所以,经验教训:使用许多断点来缩小问题的范围,并确定你以后不会用脚射击自己。

答案 3 :(得分:1)

试试这个:

Option Explicit
Sub ReformatDate()
    Dim C As Range
    Dim V As Variant
    For Each C In Selection
        With C.Offset(0, 1)
            .NumberFormat = "dd.mm.yy"
            If IsDate(C) Then
                .Value = C
            Else
                V = Split(C.Text, ".")
                .Value = DateSerial(V(0), V(1), V(2))
            End If
        End With
    Next C
End Sub
  • 如果您的系统将该值识别为日期,则只需重新格式化
  • 如果您的系统未将该值识别为日期,请转换它
    • 使用dot作为分隔符
    • 拆分它
    • 将零件转换为实际日期
    • 将其写回并格式化

如果要覆盖它,则需要进行适当的修改,而不是将值放在下一列中;如果您想使用更自动的方法来选择要转换的范围。