在没有引号的情况下输入日期,返回日期

时间:2014-05-07 19:13:58

标签: vba date excel-vba excel

我正在尝试编写这种形式的函数:

Function cont(requestdate As Date)
    cont = requestdate
End Function

不幸的是,当我将=cont(12/12/2012)输入一个单元格时,我没有得到我的约会。我得到一个非常小的数字,我认为等于12除以12除以2012.我怎么能得到这个给我回去约会?我不希望用户必须输入=cont("12/12/2012")

我试图谷歌寻求答案,不幸的是,我没有发现任何有用的东西。如果我的词汇是正确的,请告诉我。

假设我的用户提取了包含3列a,b和c的报告。 a具有季度余额的开头,b具有季度末余额,c具有名字和姓氏。我希望我的用户放入d:=cont(a1,b1,c1,12/12/2012)列,并使其创建如下:

BOQ IS 1200, EOQ IS 1300, NAME IS EDDARD STARK, DATE IS 12/12/2012

因此我们可以将其加载到数据库中。我为第一次缺乏信息而道歉。说实话,这个功能不会给我节省大量时间。我只是想学习VBA,并认为这将是一个很好的练习......然后我卡住了。

3 个答案:

答案 0 :(得分:1)

很难说出你真正想要完成的事情。

        Function cont(requestdate As String) As String
            cont = Format(Replace(requestdate, ".", "/"), "'mm_dd_YYYY")
        End Function

此代码将采用Excel无法识别为数字的字符串,例如12.12.12并对其进行格式化(关于我能想到的这个UDF的唯一有用的东西)并将其作为字符串(不是数字或日期)返回到格式化为文本的单元格。

在处理输入的字符串并格式化返回的字符串时,您可以随心所欲 - 只是BOTH永远不能是数字或日期(或Excel识别的任何其他内容。)

答案 1 :(得分:1)

没有办法完全你正在尝试做什么。我会尝试解释原因。

你可能会认为,因为你的函数需要一个Date参数,这会以某种方式强迫或者强制12/12/2012被视为Date。并且它被视为日期 - 但仅 它被评估(仅当评估的表达式不能被解释为日期时,那么您将收到错误)。

为什么Excel会在函数收到之前评估此

如果不需要字符串限定符,应用程序怎么可能知道您想要的类型数据,或者您是否打算将其用于评估?它不可能知道,所以会有混乱。

也许这是最好的例子。使用你的功能:

=Cont(1/1/0000)应该引发错误。

或者考虑一个非常简单的公式:

=1/2

此公式应该返回.5(double)还是January 2(date)还是应该返回"1/2"(字符串文字)?最终,它必须执行其中之一,并且始终如一地完成这一点,Excel在这种情况下将要做的一件事就是评估表达式。

<强> TL; DR

你的问题是,在传递之前,评估 ,这样做是为了避免混淆或含糊不清(按照例子)。

答案 2 :(得分:1)

这是我允许快速日期输入用户定义函数而不用引号括起日期的方法:

Function cont(requestdate As Double) As Date

    cont = CDate((Mid(Application.Caller.Formula, 7, 10)))

End Function

UDF呼叫与OP的初始请求对齐:

=cont(12/12/2012)

我相信这种方法可以适应OP更复杂的问题,但建议将日期移至电话会议的开头:

=cont(12/12/2012,a1,b1,c1)

我完全希望这种方法可以针对速度和灵活性进行优化。现在正在开展一个项目,可能需要我进一步深入研究速度,但同时它也符合我的需求。如果有用的话会更新。

简要说明

  • Application.Caller返回一个包含调用UDF的单元格的Range。 (见警告#2)
  • Mid从指定长度(10)的指定字符数(7)开始返回字符串的一部分(在本例中调用UDF的范围中的公式)。
  • CDate实际上可能不是必需的,但如果可能,请将值强制为日期格式。

<强>注意事项

  1. 这确实需要使用完整的dd/mm/yyyy(2012年1月1日会失败),但仍然可以使用我首选的yyyy/mm/dd格式以及覆盖一些其他分隔符。 dd-mm-yyyydd+mm+yyyy可以使用,但dd.mm.yyyy不会,因为excel不会将其识别为有效数字。

  2. 为了使其成为多单元格数组公式的一部分,需要进行额外的工作,因为在这种情况下,Application.Caller会返回一个包含所有相关单元格的范围。

  3. 没有错误处理,=cont(123)=cont(derp)(基本上没有任何dd / mm / yyy)自然会失败。

  4. <强>免责声明

    向在这里质疑UDF智慧的人们做一个快速说明:我有一大堆项目及其相关任务。没有参数,我的UDF根据许多项和任务参数计算到期日。当包含可选日期时,UDF返回实际日期与计算结果之间的差值。我使用此增量来监控和校准我计算的到期日期。

    所有这一切都可以在没有UDF的情况下完成,但至少可以说批量输入会更具挑战性。

    删除引号需要设置我的数据输入,以便将=cont(加载到剪贴板允许我的左手进入F2 / ctrl-v / tab,而我的右手疯狂地在小键盘上输入日期需要经常(并且笨拙地)转移左手位置以进行班次+&#39;