Excel VBA:将日期重新格式化为两位数年份的极短日期不起作用
我有一个从另一个应用程序导出的日期列表。最初,它们被格式化为标准格式,没有任何特殊或自动转换,格式为Excel VBA:将日期重新格式化为两位数年份的极短日期不起作用,vba,excel,date,date-formatting,Vba,Excel,Date,Date Formatting,我有一个从另一个应用程序导出的日期列表。最初,它们被格式化为标准格式,没有任何特殊或自动转换,格式为YYYY.MM.DD 以前我只是用斜线替换了点,Excel将日期识别为日期,自动将它们格式化为适当的区域设置DD.MM.YYYY,效果很好 现在,我只想删除一年中的前两位数字(新格式DD.MM.YY),但我尝试过的任何方式都不起作用。到目前为止我所做的: currentCell.Value=CDate(currentCell.Value):这会将格式切换为最新格式,但标准的长格式仍然适用 cur
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建议:与数字格式版本相比,不会更改输出格式(日期,“dd.mm.yy”)
格式(日期,年月日)
如果可以接受,这将以字符串格式为您提供答案?
为了给这一点一些背景:
Sub Datings()
Dim d As Date
d = Now
Debug.Print d, Format(d, "dd/mm/yy")
End Sub
试一试
格式(日期,年月日)
如果可以接受,这将以字符串格式为您提供答案?
为了给这一点一些背景:
Sub Datings()
Dim d As Date
d = Now
Debug.Print d, Format(d, "dd/mm/yy")
End Sub
将文本日期转换为Excel识别为日期的内容(将替换为/,就像最初那样,然后只需更新单元格中的数字格式即可
Sheet1.Range("A1") = Replace(Sheet1.Range("A1"), ".", "/")
Sheet1.Range("A1").NumberFormat = "dd.mm.yy"
将文本日期转换为Excel识别为日期的内容(将替换为/,就像最初那样,然后只需更新单元格中的数字格式即可
Sheet1.Range("A1") = Replace(Sheet1.Range("A1"), ".", "/")
Sheet1.Range("A1").NumberFormat = "dd.mm.yy"
在tom preston建议添加更多周围代码之后,我在第一个单元格上尝试了Darren Bartrup Cook的示例代码作为一个非常基本的测试。它不起作用,所以我使用断点跳过了这段代码前后的所有代码 这表明它一直工作正常,但后来其他代码通过在正确格式的单元格上调用
单元格(1,1).Value=“”&单元格(1,1).Value
,恢复了格式。我没有注意到它,因为在GUI中它仍然显示为Format:Date,尽管在内部它被覆盖
因此,完整的解决方案与使用
Range("A1:A" & lastRow).Replace What:=".", replacement:="/", LookAt:=xlPart
Sheet1.Range("A1:A" & lastRow).NumberFormat = "dd.mm.yy"
以后不要碰A列
因此,吸取的教训是:使用多个断点来缩小问题范围,并检查您以后是否不会射中自己的脚。在tom preston建议添加更多的周围代码后,我在第一个单元格上尝试了Darren Bartrup Cook的示例代码作为一个非常基本的测试。它不起作用,因此我使用断点跳过所有的测试在这段代码之前和之后的l代码 这表明它一直工作正常,但后来其他代码通过在正确格式的单元格上调用
单元格(1,1).Value=“”&单元格(1,1).Value
,恢复了格式。我没有注意到它,因为在GUI中它仍然显示为Format:Date,尽管在内部它被覆盖
因此,完整的解决方案与使用
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
- 如果系统将该值识别为日期,则只需重新格式化即可
- 如果系统无法识别该值为日期,请将其转换为日期
- 使用
点作为分隔符拆分它
- 将零件转换为真实日期
- 把它写回去并相应地格式化
- 使用
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
- 如果系统将该值识别为日期,则只需重新格式化即可
- 如果系统无法识别该值为日期,请将其转换为日期
- 使用
点作为分隔符拆分它
- 将零件转换为真实日期
- 把它写回去并相应地格式化
- 使用
如果要覆盖,而不是将值放在下一列中;如果要使用更自动的方法选择要转换的范围,则需要进行适当的修改。尝试cDate(格式(currentCell.value,“dd.mm.yy”))是否可以发布更多代码?特别是引用单元格的方式?尝试cDate(格式(currentCell.Value,“dd.mm.yy”))你能发布更多的代码吗?特别是你引用单元格的方式?谢谢你的建议,很遗憾它不起作用,仍然是4位数字。我将更新问题。谢谢你的建议,很遗憾它不起作用,仍然是4位数字。我将更新问题。