我正在尝试编写这种形式的函数:
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,并认为这将是一个很好的练习......然后我卡住了。
答案 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)
我完全希望这种方法可以针对速度和灵活性进行优化。现在正在开展一个项目,可能需要我进一步深入研究速度,但同时它也符合我的需求。如果有用的话会更新。
简要说明
<强>注意事项强>
这确实需要使用完整的dd/mm/yyyy
(2012年1月1日会失败),但仍然可以使用我首选的yyyy/mm/dd
格式以及覆盖一些其他分隔符。 dd-mm-yyyy
或dd+mm+yyyy
可以使用,但dd.mm.yyyy
不会,因为excel不会将其识别为有效数字。
为了使其成为多单元格数组公式的一部分,需要进行额外的工作,因为在这种情况下,Application.Caller会返回一个包含所有相关单元格的范围。
没有错误处理,=cont(123)
或=cont(derp)
(基本上没有任何dd / mm / yyy)自然会失败。
<强>免责声明强>
向在这里质疑UDF智慧的人们做一个快速说明:我有一大堆项目及其相关任务。没有参数,我的UDF根据许多项和任务参数计算到期日。当包含可选日期时,UDF返回实际日期与计算结果之间的差值。我使用此增量来监控和校准我计算的到期日期。
所有这一切都可以在没有UDF的情况下完成,但至少可以说批量输入会更具挑战性。
删除引号需要设置我的数据输入,以便将=cont(
加载到剪贴板允许我的左手进入F2 / ctrl-v / tab,而我的右手疯狂地在小键盘上输入日期需要经常(并且笨拙地)转移左手位置以进行班次+&#39;