Excel 填充单元格并设置最新格式->;日期显示错误

Excel 填充单元格并设置最新格式->;日期显示错误,excel,vba,Excel,Vba,我用不同的日期填充了许多单元格。例如: 01.01.2020 01.02.2020 2020年3月1日 2020年4月1日 2020年5月1日 等等。。(每月一份) 用vba宏填充这些单元格后,我想将格式更改为短月份描述(“一月”、“二月”、“三月”等) 所以我用vba将格式改为“MMM”,但格式对单元格没有影响。我必须用“F2”键进入单元格,然后单元格将其格式更改为“一月、二月等…” 如何确保在更改格式后直接更改单元格值?您的单元格可能不包含日期,而是包含一个看起来像日期的字符串。将单元格

我用不同的日期填充了许多单元格。例如:

  • 01.01.2020
  • 01.02.2020
  • 2020年3月1日
  • 2020年4月1日
  • 2020年5月1日
  • 等等。。(每月一份)
用vba宏填充这些单元格后,我想将格式更改为短月份描述(“一月”、“二月”、“三月”等)

所以我用vba将格式改为“MMM”,但格式对单元格没有影响。我必须用“F2”键进入单元格,然后单元格将其格式更改为“一月、二月等…”


如何确保在更改格式后直接更改单元格值?

您的单元格可能不包含日期,而是包含一个看起来像日期的字符串。将单元格格式化为包含字符串的日期不会自动将内容转换为日期。由于单元格内容与数字格式不匹配,因此将忽略格式设置

如果您输入单元格,它将显示Excel,就像您正在编辑内容一样。离开单元格时,Excel会尝试理解您键入的内容。由于单元格格式设置为日期格式,Excel假定字符串
01.01.2020
为日期,并将其转换为日期。之后,可以应用数字格式,单元格显示为“Jan”

因此,您可能必须通过写入实际日期来更改填充单元格的宏

Dim d As Date, row As Long

d = DateSerial(2020, 1, 1)
For row = 1 To 12
    With ActiveSheet.Cells(row, 1)
        .Value = d
        .NumberFormat = "MMM"
    End With
    d = DateAdd("m", 1, d)
Next
顺便说一句:要检查单元格是否包含字符串、日期或数字,请在即时窗口中键入:

? vartype(activecell.Value)

5
=numeric,
7
=date,
8
=string

以下是输入和格式化日期的简单方法。看看这是否有用

逻辑:

Option Explicit

Sub Sample()
    Dim ws As Worksheet
    
    Set ws = Sheet1 '<~~ Change this to relevant sheet
    
    With ws
        .Range("A1").Formula = "=DATE(2020,1,1)"
        .Range("A2:A12").Formula = "=EDATE(A1, 1)"
        '~~> Optional
        .Range("A1:A12").Value = .Range("A1:A12").Value
        '~~> Format entire range in one go
        .Range("A1:A12").NumberFormat = "MMM"
    End With
End Sub
  • A1中输入开始日期
  • 一次性输入范围内的其余日期,无需循环。为此,我们使用
    Edate
  • 一次性格式化整个范围,无需循环
  • 代码:

    Option Explicit
    
    Sub Sample()
        Dim ws As Worksheet
        
        Set ws = Sheet1 '<~~ Change this to relevant sheet
        
        With ws
            .Range("A1").Formula = "=DATE(2020,1,1)"
            .Range("A2:A12").Formula = "=EDATE(A1, 1)"
            '~~> Optional
            .Range("A1:A12").Value = .Range("A1:A12").Value
            '~~> Format entire range in one go
            .Range("A1:A12").NumberFormat = "MMM"
        End With
    End Sub
    
    选项显式
    子样本()
    将ws设置为工作表
    设置ws=Sheet1'一次性格式化整个范围
    .Range(“A1:A12”).NumberFormat=“MMM”
    以
    端接头
    
    您是如何更改格式的?显示您使用的VBA代码将很有帮助。理论上,如果你有一个范围,比如说,
    rng
    ,为了做你需要的事情,使用
    rng.NumberFormat=“MMM”
    就足够了。