【问题标题】:Fill a cell and format to date -> date is displayed wrong将单元格和格式填入日期 -> 日期显示错误
【发布时间】:2020-11-11 09:27:46
【问题描述】:

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

  • 01.01.2020
  • 01.02.2020
  • 01.03.2020
  • 01.04.2020
  • 01.05.2020
  • 等等..(每个月一个条目)

用 vba 宏填充这些单元格后,我想将格式更改为短月份描述(“Jan”、“Feb”、“Mar”等)

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

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

【问题讨论】:

  • 你是如何改变格式的?显示您使用的 VBA 代码会很有帮助。理论上,如果你有一个范围,让我们说rng,为了做你需要的事情,使用rng.NumberFormat = "MMM"就足够了。

标签: excel vba


【解决方案1】:

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

如果您输入单元格,它在 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 = 数字,7 = 日期,8 = 字符串

【讨论】:

    【解决方案2】:

    这是一种输入和格式化日期的简单方法。看看这是否有帮助?

    逻辑:

    1. 在A1 中输入开始日期
    2. 一次性输入范围内的其余日期,无需循环。为此,我们使用Edate。
    3. 无需循环即可一次性格式化整个范围。

    代码:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-19
      • 1970-01-01
      相关资源
      最近更新 更多