我有一个从其他应用程序导出的日期列表。最初,它们的格式为标准,无需任何特殊或自动转换,格式为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
。format(date, "dd.mm.yy")
:与NumberFormat版本相比,不会更改输出。我观察到的另一件奇怪的事情是:在每个VBA应用日期更改后,不再可能通过GUI手动更改日期格式/似乎没有任何效果。
这可能是什么原因,我怎么能在VBA中实现真正的短暂日期?
答案 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
作为分隔符如果要覆盖它,则需要进行适当的修改,而不是将值放在下一列中;如果您想使用更自动的方法来选择要转换的范围。