EXCEL VBA CSV日期格式问题

时间:2009-02-04 21:19:26

标签: excel-vba vba excel

我是Excel VBA的新手。如果我问的是一个显而易见的问题,我表示歉意。 我有一个CSV文本文件,我在Excel工作表中打开。该文件的一行包含格式为“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选项列表。

如果你能指出我的方向,我将非常感激。

4 个答案:

答案 0 :(得分:3)

只是回答你问题的一部分,这里是日期格式选项列表(不包括时间):

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

你可以将它们组合起来并将你喜欢的任何分隔符放入其中

e.g。

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

答案 1 :(得分:1)

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

正如Simon解释的那样,您当前日期格式的术语不正确。 9-FEB对应于d-mmm格式和02-19-2009(NB故意更改为此示例的明确日期; 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之类的日期作为文本,那么假设您始终希望年份部分成为当前年份,则可以将其更改为{{1中的月份的第一天VBA中的格式。此示例仅更改一个单元格,但您可以将其用作更广泛解决方案的基础:

mm/dd/yyyy

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)从已经在单元格中的数据获取月份部分,我们想要该月的第一天

答案 2 :(得分:0)

为了阅读日期,你可以这样做:

myDate = DateValue(dateText)

虽然有一些警告说明excel如何解释日期,以及它在可能存储的日期有哪些技术限制。 (您可能需要阅读最长和最短日期,以及excel如何解释两位数年份> 30 vs< 30等等)

为了格式化日期,您可以使用以下三种功能之一:

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

或者

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

或者

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

您可以在Google上搜索有关每项功能的更多文档。对于格式化功能,你需要找到一个很好的参考 - 我已经看到了一些相当不完整的参考。 MSDN往往有好的,但并非总是如此。如果您想了解更多细节,请随意提出这个答案。

答案 3 :(得分:-2)

这假设您的2位数年份是2000.一旦您最终错误日期9月2日= 02/02/2009,您可以使用以下公式将其转换为您想要的日期:= DATE(Day(B11) + 2000,月(B11),1)