【问题标题】:EXCEL VBA CSV Date formatting issueEXCEL VBA CSV 日期格式问题
【发布时间】:2009-02-04 21:19:26
【问题描述】:

我是 Excel VBA 新手。如果我问的是一个明显的问题,我深表歉意。 我有一个在 Excel 工作表中打开的 CSV 文本文件。文件的一行包含格式为“YY-MMM”的日期信息(即:9-FEB 或 10-MAY)。当 Excel 电子表格打开文件时,日期信息将更改为“mm/dd/yyyy”格式并读作 02/09/2009 或 05/10/2009,其中 YY-MMM 现在是 MM/YY/2009,(即:9-FEB 变为 02/09/2009,10-MAY 变为 05/10 /2009)。

我想知道是否可以将字段从 YY-MMM 重新格式化为 mm/01/yyyy。

我尝试在使用

将日期字段转换为文本后对其进行解析
Range("B11", "IV11").NumberFormat = "text"

但是,那么该值是一个序列日期并且不可解析。

我一直未能成功寻找 NumberFormat 选项的列表。

如果您能指出我的方向,将不胜感激。

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    只是为了回答您的部分问题,以下是日期格式选项列表(不包括时间):

    d = day of month, e.g. 7
    dd = zero-padded day of month, e.g. 07
    ddd = abbreviated day name, e.g. Thu
    dddd = full day name, e.g. Thursday
    

    一个月差不多...

    m = month number, e.g. 7
    mm = zero padded month number, e.g. 07
    mmm = abbreviated month name, e.g. Jul
    mmmm = full month name, e.g. July
    

    岁月更简单...

    yy = 2 digit year number, e.g. 09
    yyyy = 4 digit year number, e.g. 2009
    

    您可以将它们组合起来,并在其中放置您喜欢的任何分隔符

    例如

    YY-MMM, 09-FEB
    DDDD-DD-MMM-YY, Wednesday-04-Feb-09
    dd/mm/yyyy, 04/02/2009
    mm/dd/yyyy, 02/04/2009
    

    我刚刚尝试了一些事情,我认为最好的办法是更改文本文件中的格式以符合更标准的日期安排。如果您可以反转它们(例如 MMM-YY),您会很好,或者将它们拆分为单独的列(如果您在导入时定义 - 作为分隔符和逗号怎么办?)。这是 Excel 试图变得聪明的一种情况。

    HTH

    【讨论】:

      【解决方案2】:

      如果您当前使用File > Open 打开 CSV 文件,请尝试使用Data > Import External Data > Import Data。这会调出文本导入向导,这可能会让您更灵活地导入文件。具体来说,它允许您将文件中的列声明为文本,以便 Excel 不会尝试解析值

      正如 Simon 所解释的,您对当前日期格式的术语不正确。 9-FEB 对应于d-mmm 格式和02-19-2009(注意在此示例中故意更改为明确的日期;02-09-2009 在美国是 2 月 9 日,但在英国是 9 月 2 日)对应于 mm-dd-yyyy

      如果您想将 NumberFormat 更改为从单元格 B11 开始并以单元格 IV11 结束的范围的文本,那么您可以使用:

      Range("B11:IV11").NumberFormat = "@"

      @ 表示文本格式,您需要 : 运算符来指示连续的单元格范围。 Range("B11","IV11") 的原始示例实际上表示单元格 B11 和 IV11 的联合,因此只会影响两个单元格

      将数据结构化为行而不是列是不常见的。与其将您的日期放在第 11 行,不如将它们放在 K 列中,这样您就可以使用 Range("K2:K65535") 或只是 Rows("K") 大多数内置的 Excel 东西,如 Sort 和 AutoFilter无论如何都是按列布置的。第 1 行传统上包含列名,然后每个后续行包含一个单独的记录。您可能想看看您的 CSV 文件是如何生成的,看看您是否可以将其切换为更可用的基于列的结构

      如果您在单元格中有像 19-FEB 这样的日期作为文本,那么假设您始终希望年份部分是当前年份,您可以将其更改为 mm/dd/yyyy 格式的月份的第一天VBA。此示例仅更改了一个单元格,但您可以将其用作更广泛解决方案的基础:

      Option Explicit
      
      Sub main()
      
      Dim strOrigValue As String
      
      With ThisWorkbook.Worksheets("Sheet1").Range("B11")
          strOrigValue = .Value
      
          .NumberFormat = "mm/dd/yyyy"
          .Value = DateSerial(Year(Date), Month(strOrigValue), 1)
      End With
      
      End Sub
      

      DateSerial 根据给定的年、月和日创建日期序列号。 Year(Date) 从当前系统日期中提取年份部分,Month(strOrigValue) 从单元格中已经存在的数据中提取月份部分,我们想要一个月的第一天

      【讨论】:

        【解决方案3】:

        为了读取日期,您可以执行以下操作:

        myDate = DateValue(dateText)
        

        虽然对于 excel 如何解释日期以及它在存储日期方面有哪些技术限制存在一些警告。 (您可能需要阅读最大和最小日期,以及 excel 如何解释两位数 >30 与

        为了格式化日期,您可以使用以下三个函数之一:

        myDateText = DatePart("yyyy", myDate) & "/" & DatePart("mm", myDate) & "/" & DatePart("dd", myDate)
        

        或者这个

        Format (myDate, "yyyy/mm/dd")
        

        或者这个

        FormatDateTime(#1/1/2020#, vbShortDate)
        

        您可以在 google 上搜索有关每个功能的更多文档。对于 format 函数,你会想找到一个很好的参考——我见过一些相当不完整的参考。 MSDN 往往有好的,但并非总是如此。如果您想了解更多详细信息,请随时提出此答案。

        【讨论】:

          【解决方案4】:

          假设您的 2 位数年份是 2000。一旦您的日期不正确 9-Feb = 02/02/2009,您可以使用以下公式将其转换为您想要的日期:=DATE(Day(B11) +2000,月(B11),1)

          【讨论】:

            猜你喜欢
            • 2016-08-12
            • 1970-01-01
            • 1970-01-01
            • 2013-02-08
            • 2021-12-23
            • 2016-08-03
            • 2013-11-17
            • 2015-08-31
            • 1970-01-01
            相关资源
            最近更新 更多