【问题标题】:Excel VBA Userform IIf(IsDate) doesn't save blankExcel VBA Userform IIf(IsDate)不保存空白
【发布时间】:2016-07-27 21:40:24
【问题描述】:

大家早上好, 我有一个工作簿,其中包含许多用户窗体,允许在其上输入多种类型的数据,包括文本、数字和许多日期字段。一切似乎都运行良好,除非用户想要删除日期,使用适当的用户表单,它不会覆盖工作表中的值。下面是我用来检查用户表单中的值是否为日期的代码,然后填充工作表,但它什么也没做。任何帮助表示赞赏。

ws.Cells(lastRow, txtCollectionDate.Tag).Value = IIf(IsDate(txtCollectionDate), CDate(txtCollectionDate), "")  

更新:txtCollectionDate 是一个文本框,它的值最初是 09/01/2016,但用户想删除它,因为它输入错误。用户应该能够突出显示该值,按删除(键盘),然后保存。

【问题讨论】:

  • 如果txtCollectionDate 什么都不做,请显示它的内容,并说明您在 Excel 和您的操作系统中的短日期默认日期设置是什么。
  • 感谢 Axel,更新了主要问题。 Excel/OS 中的默认日期设置为 dd/mm/yyyy(英国风格)
  • it doesn't overwrite the value in the worksheet - 这是否意味着它什么都不做?还是将值替换为空白?
  • 嗨,Macro Man,它什么也没做。我希望它用空白替换值

标签: excel vba date userform


【解决方案1】:

似乎与IIf 一样,即使条件部分不正确,也会处理 then 部分。这会导致错误 13 类型与 CDate("") 不匹配。

所以你应该这样做:

If IsDate(txtCollectionDate) Then
 ws.Cells(lastRow, txtCollectionDate.Tag).Value = CDate(txtCollectionDate)
Else
 ws.Cells(lastRow, txtCollectionDate.Tag).Value = ""
End If

编辑:

删除“似乎”。该行为已记录在案: https://msdn.microsoft.com/en-us/library/office/gg264412.aspx

【讨论】:

  • 感谢 Axel,这是一种享受。我曾考虑过这一点,但试图让代码尽可能“干净”……虽然这可行,所以谢谢。现在将相同的逻辑应用于其他 8 个日期:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多