【发布时间】: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.Date 的
DateText模块中了解如何转换这些数据。