【问题标题】:Excel vba - logic failureExcel vba - 逻辑故障
【发布时间】:2017-10-05 13:24:39
【问题描述】:

我有一个电子表格 (x4),将几名员工的总工作时间加起来。一名员工的总数达到 24 小时。在我的函数中,由于 Excel 如何在内部表示小时数,因此等于 1。根据“小时数”的值,它会格式化单元格以显示每个人的总小时数:分钟。我检查过 - typename(hours)= double。当小时 = 1 时,我看不出为什么 hours>=1 不等于“真”。如果我在该人的电子表格值中添加 1 分钟,它会按预期工作吗?

Public Function format_hours(hours As Variant) As Variant   
If hours >= 1 Then
     format_hours = Application.Text(hours, "[hh]:mm")
ElseIf hours > 0 Then
     format_hours = Format(hours, "hh:mm")
Else
     format_hours = 0
End If
End Function

【问题讨论】:

  • 不推荐使用Variant。如果您指定更强的变量类型,您将受益。 (此外,您在format_hours 中缺少f - 使用Option Explicit 来避免此类错误。)
  • 我刚刚发现我的变量“小时”有一个前导空格。删除它可以让逻辑按预期工作。那个空间是从哪里来的?
  • 很难知道这个函数是如何被调用的。如果您将参数指定为数字而不是变体,那么您会更快地发现这一点。
  • 也许你的问题是 24h = 1d+0h ?
  • 其实如果这个函数是从工作表公式中调用的,那么参数有时会建议使用Variants,有时返回值会非常依赖使用情况。 Option Explicit 我绝对同意。

标签: excel vba


【解决方案1】:

问题在于Hours as Variant可能String 的形式出现,而不是日期/双精度。由于您从未明确检查/将其转换为 Date/Double,因此在您的 If hours >= 1 Then 中,它可能没有进行您期望的隐式转换和比较。

解决方案:使用显式转换和比较。隐式的很糟糕,因为它们不可避免地会产生像这样的神秘错误。

【讨论】:

  • 是的,检查过了,它以 dbl 的形式通过。也试过投射它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-14
相关资源
最近更新 更多