gtw*_*ebb 13 excel vba date excel-vba
我有一个包含许多日期的电子表格.这些通常出现在mm/dd/yyyy或mm/dd/yyyy hh:mm.
问题是日期并不总是正确放入,我想检查以确保它们是代码中的日期.
我原来的想法是用来IsDate检查或CDate但这似乎不起作用:它仍然返回字符串而不是日期.
我已经建立了一个小实验,表明这些功能不像我期望的那样工作.方法是:
=DATE(2013,10,28)=A1*1应该等于一个数字(41575)运行这个小脚本
Sub test()
MsgBox ("Start:" & TypeName(ActiveCell.Value) & " " & IsDate(ActiveCell.Value))
ActiveCell.Value = Format(ActiveCell.Value, "mm/dd/yyyy")
MsgBox ("After format: " & TypeName(ActiveCell.Value) & " " & IsDate(ActiveCell.Value))
ActiveCell.Value = CDate(ActiveCell.Value)
MsgBox ("After Cdate: " & TypeName(ActiveCell.Value) & " " & IsDate(ActiveCell.Value))
End Sub
Run Code Online (Sandbox Code Playgroud)当脚本启动时,单元格的类型为date,并IsDate返回true.在它运行之后,它是Formatstring类型但IsDate仍然返回true. CDate还会将单元格转换为字符串.单元格B1现在也将返回0(因为它是一个字符串*1).
所以我想总结一下问题:
Format和CDate改变我的细胞为字符串?Jea*_*ett 17
区分单元格的内容,它们的显示格式,通过VBA从单元格读取的数据类型,以及从VBA 写入单元格的数据类型以及Excel如何自动解释这一点非常重要.(参见例如前面的答案.)这些之间的关系可能有点复杂,因为Excel会将一种类型的值(例如字符串)解释为某种其他数据类型(例如日期),然后自动更改显示格式基于此.你最安全的赌注它明确地做了一切,而不是依赖这种自动的东西.
我运行了你的实验,但我没有得到与你相同的结果.我的单元格A1一直保持日期,B1保持41575.所以我无法回答你的问题#1.结果可能取决于您的Excel版本/设置如何根据其内容自动检测/更改单元格的数字格式.
问题#2,"我如何确保单元格将返回日期值":好吧,不确定你的意思是"返回"一个日期值,但是如果你想让它包含一个显示为日期的数值,根据你从VBA写到它的内容,你可以:
向单元格写入一个字符串值,希望Excel自动将其解释为日期和格式.交叉手指.显然这不是很强大.要么,
从VBA向单元格写入一个数值(显然,Date类型是预期的类型,但Integer,Long,Single或Double也可以这样做)并使用.NumberFormat属性将单元格的数字格式显式设置为所需的日期格式(或在Excel中手动).这更加强大.
如果要检查现有单元格内容是否可以显示为日期,那么这是一个有用的功能:
Function CellContentCanBeInterpretedAsADate(cell As Range) As Boolean
Dim d As Date
On Error Resume Next
d = CDate(cell.Value)
If Err.Number <> 0 Then
CellContentCanBeInterpretedAsADate = False
Else
CellContentCanBeInterpretedAsADate = True
End If
On Error GoTo 0
End Function
Run Code Online (Sandbox Code Playgroud)
用法示例:
Dim cell As Range
Set cell = Range("A1")
If CellContentCanBeInterpretedAsADate(cell) Then
cell.NumberFormat = "mm/dd/yyyy hh:mm"
Else
cell.NumberFormat = "General"
End If
Run Code Online (Sandbox Code Playgroud)