【问题标题】:VBA - Why IsNumeric is not evaluating correctlyVBA - 为什么 IsNumeric 没有正确评估
【发布时间】:2017-12-11 17:46:38
【问题描述】:

我在VBA 中有以下代码来评估变量lngPNumber 以将“正确”值发送到WorksheetFunction.vLookup 函数:

Dim lngPNumber As Variant
lngPNumber = ActiveSheet.Cells(objInitialCell.Row, INT_ACCP_COL_PNUMBER).Value
        If IsNumeric(lngPNumber) = False Or CDbl(lngPNumber) <> Round(CDbl(lngPNumber)) Then
        lngPNumber = CStr(ActiveSheet.Cells(objInitialCell.Row, INT_ACCP_COL_PNUMBER).Text)
        End If

lngPNumber可以是:

  • 一个整数值 (f.i. 4111)
  • 一个浮点值 (41.111111)
  • 或只是一个 字符串值(通常为“xxxx”,但也可以用字符串填充 比如“asdasd”、“dasdsadasd”等...)

在最后两种情况下,我想发送单元格文本而不是获取lngPNumber 的单元格值。

但是,如果值是列表中最后一个示例中的字符串,则会出现类型不匹配错误。有什么帮助吗?

【问题讨论】:

标签: vba excel


【解决方案1】:

If 将尝试解析 Or 的两边,无论第一个是 false 还是 true,所以如果 lngPNumber 是文本,CDbl(lngPNumber) 将出错。

所以把它们一分为二。

Dim lngPNumber As Variant
lngPNumber = ActiveSheet.Cells(objInitialCell.Row, INT_ACCP_COL_PNUMBER).Value
        If Not IsNumeric(lngPNumber) Then
            lngPNumber = CStr(ActiveSheet.Cells(objInitialCell.Row, INT_ACCP_COL_PNUMBER).Text)
        ElseIF CDbl(lngPNumber) <> Round(CDbl(lngPNumber)) Then
            lngPNumber = CStr(ActiveSheet.Cells(objInitialCell.Row, INT_ACCP_COL_PNUMBER).Text)     
        End If

现在第二个只会在 lngPNumber 是数字时触发。

【讨论】:

  • 不错的答案。嵌套第二个条件不是更好吗(假设您将第一个检查更改为If IsNumeric(lngPNumber)...)?这样它只会在它是数字时被检查,从而减少整体检查的数量。
  • 你仍然需要 Else 来做同样的事情@JosephWood,因为 op 想要负数,正数时检查整数。
  • 感谢您快速、清晰且有效的回复。我不得不承认我根本不擅长 VBA,而且似乎来自其他语言在这里没有必要帮助:) 我完全假设 Or 条件的行为与我使用过的许多其他语言一样,但似乎这不是案子。还感谢@Taelsin 明确解释为什么会发生这种情况。
  • @ScottCraner 我试图弄清楚为什么If 的真假部分是相同的表达式?有什么意义?
  • @ScottCraner 仔细查看您的代码:无论lngPNumber 是否为数字,您都将其分配为相同的CStr(...)。那么,诀窍是什么? :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多