【问题标题】:How to standardize data formats in excel如何标准化excel中的数据格式
【发布时间】:2017-02-15 01:21:38
【问题描述】:

我正在从许多工作簿中收集数据。问题是,在每个文档中,日期格式并不一致: 16/01/2015 2015-01-06 24.03.2014

我想要实现的是“YYYY-MM-DD”格式。在我的代码中,我有一个案例负责清除日期列。现在我越来越绝望,我在代码中添加了愚蠢的日期格式,但在点格式(上面加粗的格式)方面没有任何变化。即使我手动选择列并更改格式类型,或者将值复制到 .txt 文件然后复制回原始工作表,也尝试使用新的 WorkBook,但没有任何反应。为什么在这几个例子中无法更改日期值?任何帮助,将不胜感激。代码如下:

        Case 6:

    sourceWorkbook.Activate
    sourceWS.Activate

    sourceWS.Columns(i).Select
    Selection.NumberFormat = "YYYY-MM-DD;@"
    sourceWS.Range(Cells(2, i), Cells(lastrw, i)).NumberFormat = "YYYY-MM-DD;@"


        For j = startRow To lastrw Step 1
            'Assign the header to the first row
            NewWorksheet.Cells(1, i) = sourceWS.Cells(startRow, i).Value

            On Error Resume Next
                textToFormat = CStr(sourceWS.Cells(j, i).Value)

                d = CDate(textToFormat)
                finalDate = Format(textToFormat, "YYYY-MM-DD")

                NewWorksheet.Cells(j - adjustRows, i) = finalDate
                'This error handler purpose to handle the header name!
                If Err Then

                    NewWorksheet.Cells(j - adjustRows, i) = textToFormat

                End If

            On Error GoTo 0

        Next j
        Set fckFormat = NewWorksheet.Columns(i)
        fckFormat.NumberFormat = "YYYY-MM-DD;@"
        NewBook.Activate
        NewWorksheet.Activate
        NewWorksheet.Columns(i).Select
        Selection.NumberFormat = "YYYY-MM-DD;@"

【问题讨论】:

  • 查看开头的答案:很多人似乎遇到了这个问题。
  • @R3uK ,您的意思是在源代码表中还是在代码中?我测试了它适用于除上述格式之外的所有其他格式的代码。
  • 24.03.2014 格式保存日期值的单元格,它们的格式是日期还是字符串?
  • +1 @Jordan 问题!手动更改格式会影响日期单元格中显示的内容吗?我建议您可以在此处找到该实用程序:onedrive.live.com/…

标签: vba excel


【解决方案1】:

正如 Jordan 所建议的,问题在于这些数据被格式化为字符串而不是日期。例如,如果我在新工作簿中输入上述每个日期,则前两个日期被正确检测为日期(并且可以这样格式化),而最后一个日期被视为文本字符串。这可能因您的区域设置而异。

很遗憾,CDate 函数也无法将此格式识别为有效日期。尝试运行以下命令,您将收到类型不匹配错误:

MsgBox CDate("24.03.2016")

您可以使用 Replace 方法将其转换为有效日期,方法是将点替换为斜线:

Set datecol = Sheets(1).Columns(1) 
datecol.Replace What:=".", Replacement:="/", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False

单元格仍将被格式化为字符串,但您现在可以使用现有循环使用 CDate 将其转换为日期:

            d = CDate(textToFormat)
            NewWorksheet.Cells(j - adjustRows, i) = d

然后 NumberFormat 将正常工作。

注意:我建议使用 CDate 而不是 Format,以便日期仍然存储为值而不是文本。

【讨论】:

    猜你喜欢
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多