Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA:将日期重新格式化为两位数年份的极短日期不起作用_Vba_Excel_Date_Date Formatting - Fatal编程技术网

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
  • 格式(日期,“dd.mm.yy”)
    由Tom Preston和msaint建议:与数字格式版本相比,不会更改输出
我观察到的另一件奇怪的事情是:在根据VBA应用日期更改后,通过GUI手动更改日期格式不再可能/似乎没有任何效果

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

试试看
格式(日期,年月日)

如果可以接受,这将以字符串格式为您提供答案? 为了给这一点一些背景:

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位数字。我将更新问题。