Excel VBA:重新格式化date到两位数年份的非常短的date不起作用

我有从另一个应用程序导出的date列表。 最初它们被格式化为标准格式,没有任何特殊或自动转换,格式为YYYY.MM.DD

以前,我只是用斜线代替点,Excel将date识别为date,自动将它们格式化为适当的语言环境DD.MM.YYYY ,这很好地工作。

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

  • currentCell.Value = CDate(currentCell.Value) :这将格式切换到date,但标准的长格式仍然适用。
  • currentCell.NumberFormat = "dd.mm.yy;@"从录制macros和手动更改值中可以看出。 似乎没有在输出格式上有所作为。
  • currentCell.Value = FormatDateTime(currentCell.Value, vbShortDate) :不起作用,因为短date是DD.MM.YYYY ,而不是当前语言环境中的DD.MM.YY
  • format(date, "dd.mm.yy")如Tom Preston和msaint所build议:与NumberFormat版本相比,不会更改输出。

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

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

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

如果可以接受的话,这会给你string格式的答案吗? 为了给这个背景:

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

将文本date转换为Excel所识别的date(用原来的方式replace./,然后只更新单元格中的数字格式)。

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

在Tom Preston添加更多周边代码的build议之后,我尝试了第一个单元格上的Darren Bartrup-Cook代码作为非常基本的testing。 它没有工作,所以我使用断点来跳过这段代码之前和之后的所有代码。

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


完整的解决scheme就像使用一样简单

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

以后再不碰A栏。


所以,经验教训:使用许多断点来缩小问题的范围,并检查你是不是在后来的脚射自己。

尝试这个:

 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 
  • 如果您的系统将该值识别为date,则只需重新格式化即可
  • 如果您的系统不能将该值识别为date,则将其转换
    • 使用dot作为分隔符来分割它
    • 将零件转换为实际date
    • 回写并相应地格式化

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