【问题标题】:VBA strange behavior converting string to date, some are ok, some are notVBA奇怪的行为将字符串转换为日期,有些可以,有些不行
【发布时间】:2013-08-14 03:48:50
【问题描述】:

就像标题说的那样,有些单元格最终得到了正确的值,有些单元格的月份和日期被切换了,如果这是一个常数,我可以修复它,但它只是弄乱了一些值,我无法理解为什么。

代码如下:

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

所以,这应该在单元格 C7 C8 C9 C10 和 C11 中写入一些日期,并且确实如此,但是问题已经描述了。

我在代码中添加了一些 debug.print 来逐步编写接收到的值和转换后的值,您会看到两者都是正确的,但是最终在单元格上的值是错误的。

这是调试打印:

---------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 个进出日期都可以,但这就是单元格上的结果,值应该从最早到最旧排序:

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

谁能帮帮我?我已经尝试搜索和搜索,但找不到任何解决方案。

谢谢


> EDIT1

我已经添加:

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

它们仍然会以字符串形式出现,因为排序选项甚至不显示日期的排序,而是显示字符串的排序。

稍后我会使用以下代码对它们进行排序:

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

【问题讨论】:

  • 排序顺序是字符串排序(与日期排序相比)所期望的。你是如何对它们进行排序的?另外,为什么你分配给一个临时单元只是为了立即读回它?我看到您为单元格 I2 而不是 C7:C11 设置了正确的数字格式 - 您是否已经为它们设置了格式?
  • 请注意,您必须在日期格式中用大写“MM”标记月份。小写格式“mm”是为分钟设计的。
  • 对 mm 到 MM 以及其他单元格的格式进行了更改,有两个建议,但仍然没有效果。看我的编辑1。谢谢

标签: string excel vba date


【解决方案1】:

您可以使用此函数将字符串值转换为日期:

' 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”。

【讨论】:

  • 我已经尝试过你的建议,我已经添加了 form1(v2temp) = stringToDate(tmpp, "dd-MM-yyyy") 但没有成功,我最终得到 28-07-2013, 26-06-2013, 14-07-2013, 08- 10-2013, 08-03-2013; cell3 不是日期,cell4 和 cell5 切换了月份和日期
  • 解决了,感谢您的提示,我已将在单元格上写入值的代码更改为ActiveWorkbook.Worksheets("TEMP2").Range("C7").Offset(v2temp, 0).Value = stringToDate(form1(v2temp), "dd-MM-yyyy"),现在它可以正常工作了!!!谢谢
【解决方案2】:

请查看格式字符串中间的-mm-。你的意思可能是-MM-

请参阅 Excel Macro : How can I get the timestamp in "yyyy-MM-dd hh:mm:ss" format? 使用 :mm: 表示分钟和 -MM- 表示月份。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 2021-12-24
    • 1970-01-01
    相关资源
    最近更新 更多