VBA奇怪的行为转换stringdate,有些是好的,有些不是

就像标题所说的那样,有些单元最终会得到正确的值,有些单元会得到一个月和一天的切换,如果这是一个常数,我可以修复它,但是它只是混淆了一些值,我不明白为什么。

这里是代码:

For v2temp = 0 To 4 form1(v2temp) = Trim(form1(v2temp)) & ";" tmpp = Left(form1(v2temp), Len(form1(v2temp)) - 1) arr = Split(tmpp, "-") ActiveWorkbook.Worksheets("TEMP2").Range("I2").NumberFormat = "dd-mm-yyyy" If tmpp <> vbNullString Then dt = DateSerial(arr(2), arr(1), arr(0)) ActiveWorkbook.Worksheets("TEMP2").Range("I2").Value = dt form1(v2temp) = ActiveWorkbook.Worksheets("TEMP2").Range("I2").Value Else form1(v2temp) = "" End If Next For v2temp = 0 To 4 ActiveWorkbook.Worksheets("TEMP2").Range("C7").Offset(v2temp, 0).Value = form1(v2temp) Next 

所以,这应该写入一些date到单元格C7 C8 C9 C10和C11,它确实,但已经描述的问题。

我已经在代码中添加了一些debug.print来一步一步地写出接收到的值和转换后的值,你会发现两者都是正确的,但是单元格上的值是错误的。

这是debugging打印:

 ---------MARK-------- var TMPP is 10-08-2013 var DT is 10-08-2013 ---------MARK-------- var TMPP is 03-08-2013 var DT is 03-08-2013 ---------MARK-------- var TMPP is 28-07-2013 var DT is 28-07-2013 ---------MARK-------- var TMPP is 14-07-2013 var DT is 14-07-2013 ---------MARK-------- var TMPP is 26-06-2013 var DT is 26-06-2013 ---------MARK-------- 

你可以看到它正确地通过了5次,并且所有5个进出date都没问题,但是这就是单元格上的结果,值被认为是从最早到最早sorting:

 28-07-2013 26-06-2013 14-07-2013 > this should be before the cell up from this, so it's wrong formated 08-10-13 > this should be 10-08-2013 08-03-13 > this should be 03-08-2013 

谁能帮帮我吗? 我试过search和search,找不到任何解决scheme。

谢谢


>编辑1

我已经添加:

 For v2temp = 0 To 99 ActiveWorkbook.Worksheets("TEMP2").Range("C2").Offset(v2temp, 0).NumberFormat = "dd-MM-yyyy" Next ActiveWorkbook.Worksheets("TEMP2").Range("I2").NumberFormat = "dd-MM-yyyy" 

现在的结果是:28-07-2013 26-06-2013 14-07-2013 08-10-2013 08-03-2013

他们仍然缝到达string,因为sorting选项甚至不显示datesorting,但string。

我稍后用这个代码对它们进行sorting:

 ActiveWorkbook.Worksheets("TEMP2").Visible = True Sheets("TEMP2").Select Range("B1:D1").Select Sheets("TEMP2").AutoFilterMode = False Selection.AutoFilter ActiveWorkbook.Worksheets("TEMP2").AutoFilter.Sort.SortFields.Clear ActiveWorkbook.Worksheets("TEMP2").AutoFilter.Sort.SortFields.Add Key:=Range("C1:C11"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("TEMP2").AutoFilter.Sort .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With 

您可以使用此function将string值转换为date:

 ' Convert String to Date Public Function stringToDate(ByRef dateString As String, ByRef dateFormat As String) As Date stringToDate = CDate(Format(dateString, dateFormat)) End Function 

例如,dateFormat可以是“MM / dd / yyyy”或“dd-MM-yyyy”。

请查看格式string中间的-mm- 。 你可能是指-MM-

请参阅Excelmacros:如何获取“yyyy-MM-dd hh:mm:ss”格式的时间戳? 使用:mm:分钟, -MM-用于月份。