VBA中的CDate函数有问题

我正在使用CDate将格式为string的特定date转换为Exceldatetypes。 我为这个转换写了一个小的UDF; 但是,当我作为一个内嵌函数运行该函数时,它将返回一个数字,并且调用单元默认格式被设置为数字types。 当我手动将其转换为datetypes时,Excel将显示正确的date条目。

所以,我需要知道是否有方法通过我的date转换macros将调用单元格的默认格式设置为datetypes。 否则,用户必须手动更改每个单元格的格式。

例如

Function Test() Test = CDate("2010/12/23") End Function 

调用单元通过Application.ThisCell暴露,但是您将不得不在调用之前/之后手动格式化,因为Excel UDF不能修改单元的物理特性。

也许你可以在单元格input后运行一些东西?

 Dim c As range For Each c In ActiveSheet.UsedRange.Cells ''Case sensitive If c.Formula = "=test()" Then c.NumberFormat = "d/mm/yyy" End If Next 

这听起来像你想要做的实际上是一个两部分的过程:将单元格(或单元格区域)中的值转换为date,然后将其显示为date,而不是简单地将文本值转换为date到date值。

如果是这样,那么我会build议像这样修改Remou的build议(在包含大量数据的工作表上使用UsedRange可能会有问题):

 Dim c As Range For Each c In Selection.Cells c.Value = CDate(c.Value) c.NumberFormat = "m/d/yyyy" Next c 

用户然后需要select格式应该被应用的单元格并且运行macros; 这听起来好像你不希望这种情况发生,但我不知道这是可能的。

根据您想要如何使用macros,您可以添加额外的检查:例如,您可以将格式仅应用于当前格式化为文本的非空白单元格( c.Value <> "" and c.NumberFormat = "@" )。

如果以stringforms返回数据,并以Excel自动转换为date的格式返回,则可以使单元格格式正确。

 Function Test() As String Test = Format(DateValue("2010/12/23"), "mm/dd/yyyy") End Function 

这在美国Excel中有效,但如果你需要它是语言不可知的,我想你会遇到问题。