【问题标题】:Difficulty forcing VBA to parse dates in US/UK format难以强制 VBA 以美国/英国格式解析日期
【发布时间】:2021-09-22 01:04:39
【问题描述】:

感谢迄今为止帮助我并帮助我完善问题的所有人

我从第三方软件应用程序收到一个带有英国格式日期时间戳的 CSV 文件,VBA 可以将其读取为美国日期格式

我的机器“区域和语言设置”设置为英语(英国),但如果我使用 Application.LanguageSettings.LanguageID(msoLanguageIDUI) 结果是 1033 - 即:英语、美国和不适合我的机器设置。

CSV 是一个包含如下列的文件:

| report name | value | % | date |

由程序创建并由用户保存的 CSV - 第三方应用程序将 CSV 直接保存到磁盘会导致 CSV 表行如下: "Report name","264","2.2 %","08 Jul 2021 11:05" (正确导入)

如果用户打开 CSV 然后从 Excel 中保存,文件保存如下(注意没有引号和修改的日期格式: 报告名称,1,0.00%,01/07/2021 12:37(无法正确导入 - VBA 读取的单元格为 21 年 1 月 7 日)

我的代码应该能够处理这两种情况。

我正在按如下方式导入 CSV 数据:

    Set csvWB = Workbooks.Open(my_FileName)
    Set csvData = csvWB.Worksheets(1)
    Dim csvReportAr() As Variant 'array of reprot names from column one of the CSV
    Dim csvNumberAr() As Variant 'array of values (report results) from col 2 of the CSV
    Dim csvDateAr() As Date 'array of the dates the reports were run
    
    Do While csvData.Cells(cellRow, 1).Value <> Empty
      Do While csvData.Cells(cellRow, 1).Value <> Empty
      ReDim Preserve csvReportAr(cellRow)
      ReDim Preserve csvNumberAr(cellRow)
      ReDim Preserve csvDateAr(cellRow)
    
      csvReportAr(cellRow - 1) = csvData.Cells(cellRow, 1).Value
      csvNumberAr(cellRow - 1) = csvData.Cells(cellRow, 2).Value
        
      Debug.Print "cell value = " & csvData.Cells(cellRow, 4).Value
      Debug.Print "Month (of cell value) = " & Month(csvDateAr(cellRow - 1))
    
      csvDateAr(cellRow - 1) = convertDateUKtoUS(csvData.Cells(cellRow, 4).Value)
      Debug.Print "Date value = " & csvDateAr(cellRow - 1)
      Debug.Print "Month of date = " & Month(csvDateAr(cellRow - 1))
      cellRow = cellRow + 1
    Loop

调试语句打印以下内容:

cell value = 07/01/2021 06:45:00
Month (of cell value) = 12
Date value = 07/01/2021

困难在于,根据 CSV 的文本编辑器视图,我尝试在此处导入的日期在 CSV(7 月 1 日)中列为 01/07/2021 06:45:00。仅读取此单元格值似乎 VBA 假定这是一个日期并存储为以美国格式保存的日期。

我怀疑这是一个语言环境问题?我的区域设置似乎不协调,其他用户也可能有错误的区域设置,所以我们应该能够解决这个问题

问题:

  • 能否强制 VBA 将日期时间戳读取为字符串,然后手动解析以确保读取为英国格式的日期? - 或者 - 我可以读取指定特定格式的日期时间戳来读取吗?
  • 您能否就使用 VBA 的语言环境问题提出建议,该问题表明语言环境是美国英语,而机器设置似乎是英国英语?
  • 我可以用 VBA 临时更改语言环境吗? (我读过的其他帖子表明不建议这样做!)
  • 我对 cell.value 的使用不合适吗?

由于可能不再相关而删除了其余帖子

感谢迄今为止的所有贡献者!

【问题讨论】:

  • 不是问题,但 str = split(split(dateString," ")(0),"/") 将返回一个字符串数组,然后你会这样做:Day = str(0)Month =str(1)Year=str(2) 但我也不会使用 Day,Month,Year 作为变量,因为它们在 vba 中意味着某些东西。
  • 请注意,如果有 Office 365,可以使用公式来完成:stackoverflow.com/questions/63581292/…
  • 如果您的系统看到的一个月超过 12 个月,那么它将作为字符串导入。如果它较少,则很有可能将其作为日期导入,月份和日期被翻转。如果您通过文本编辑器解析日期或使用无需转换即可在 excel 中打开之前读取数据的语言或让提供商使用通用日期格式(如 yyyy-mm-dd)会更好或英国。
  • 你是如何导入数据的?
  • 这只会发生在某些 CSV 文件上,而不会发生在其他文件上 ...然后这些 CSV 文件具有不同的格式,必须进行相应的处理。 VBA 中的日期处理无论如何都不是“随机的”。此外,应尽可能避免对日期进行字符串处理;实际上,使用本地化月份缩写。您尚未透露您的(样本)数据,但您可能会在 VBA.DateDateText 模块中了解如何转换这些数据。

标签: vba date datetime locale


【解决方案1】:

我有部分但不优雅的解决方案 - 我希望其他人可以做得比我更好。我仍然无法弄清楚为什么英国日期会自动解析为美国日期。

感谢大家的帮助,如果没有你们的帮助,我的项目就无法完成。

我的部分解决方案: 从 CSV 读取数据,假设可能解析不正确

如果 day(importDate)

使用从 importDate 转置的天/月创建一个替代日期

使用 vbYesNo MsgBox 让用户确认哪个日期是正确的。


这适用于我的项目,因为单个 CSV 文件中的所有日期都应该相等,如果您的 CSV 中的所有日期都记录在同一文件中,您可以使用类似的错误检查日期的解决方案以美国和英国格式读取日期格式。但是,对于想要处理多个 CSV 或可能拥有包含不同日期格式的 CSV 的其他人来说,它无济于事。

【讨论】:

    【解决方案2】:

    另一种方法是使用 CSV 解析器将 csv 文件读入一个数组,该解析器允许您指定文件的日期格式,然后将该数组粘贴到工作表中。

    这是这样一个解析器(我是作者):

    https://github.com/PGS62/VBA-CSV

    在本例中,Data 被粘贴到新工作表中。

    Sub Demo()
        Dim Data As Variant
        Dim Target As Range
    
        Data = CSVRead("c:\temp\datesukformat.csv", _
            ConvertTypes:=True, _
            Delimiter:=",", _
            DateFormat:="D/M/Y")
    
        Set Target = Application.Workbooks.Add.Worksheets(1).Cells(1, 1).Resize(UBound(Data, 1), UBound(Data, 2))
    
        Target.value = Data
    
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-18
      • 1970-01-01
      • 2014-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多