VBA中的CDate功能问题

时间:2010-06-18 08:41:51

标签: excel vba user-defined-functions

我正在使用CDate将格式化为字符串的特定日期转换为Excel日期类型。我为这次转换写了一个小UDF;但是,当我将该函数作为单元格函数运行时,它返回一个数字,并且调用单元格的默认格式设置为数字类型。当我手动将其转换为日期类型时,Excel将显示正确的日期条目。

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

e.g

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

4 个答案:

答案 0 :(得分:1)

调用单元格通过Application.ThisCell公开,但是您必须在调用之前/之后手动格式化为Excel UDF,无法修改单元格的物理特性。

答案 1 :(得分:1)

也许你可以在输入单元格后运行某些东西?

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

答案 2 :(得分:0)

听起来你想要做的事实上是一个由两部分组成的过程:将单元格(或单元格范围)中的值转换为日期,然后将其显示为日期,而不是简单地转换文本值看起来像是日期值的日期。

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

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

然后,用户需要选择应该应用格式的单元格并运行宏;听起来好像你不希望这种情况发生,但我不确定这是否可能。

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

答案 3 :(得分:0)

如果您将数据作为字符串以Excel自动转换为日期的格式返回,则可以使单元格正确格式化。

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

这适用于美国Excel,但如果您需要它与语言无关,我认为您会遇到问题。