【问题标题】:comparing the content of two cells in VBA比较VBA中两个单元格的内容
【发布时间】:2017-03-30 18:41:46
【问题描述】:

我需要比较宏中两个单元格的内容

RC1=2.0
RC2=2

我为此使用if(RC1=RC2,"''","x"),它为上述输入打印x,但2.0和2是相同的,在这种情况下我需要它是'',请建议

【问题讨论】:

  • 我的问题是使用上述方法比较2和2.0后返回false,有没有其他方法可以比较并得到结果为true?
  • 尝试使用Val Function
  • Prakash Singh 请考虑将正确答案更改为 @CLR ,正如 Ralph 的评论所解释的那样,我的答案确实不正确。

标签: excel vba


【解决方案1】:

你失败的“代码”表明你只是在使用一个公式:

if(RC1=RC2,"''","x")

如果您乐于使用公式来测试它们,您可以使用:

IF(VALUE(RC1)=VALUE(RC2),"''","x")

但请注意,空白单元格的 VALUE 为 0(零),因此空单元格将匹配包含 0.00 的单元格

【讨论】:

  • 万一 OP 真的在使用 VBA(如标签所示),您可能还希望将 VBA 解决方案包含在 Val() 而不是 Value()MsgBox Val("2.0")=2
  • 但是通过使用上面的公式,我将无法验证 1.9999 和 1 等其他情况,如果我使用您建议的公式,它将返回 true
  • 不,value(1) 绝对不等于 value(1.9999) 与该公式。它将返回FALSE
【解决方案2】:

首先

您正在尝试比较两种不同的数据类型,假设一种是integer,它没有十进制值,另一种是double,有一个小数。

我建议你仔细看看data types in VBA

因此,我们需要将convert the types 转换为与CDbl() 相同的两个单元格以将它们转换为double。简单来说,由于integersdoubles 的更简单形式,我们将使用两者中更完整的类型。

比较类型的代码

Sub COMPARING_TYPES()

Dim a As Double, b As Double

' Let's assume the both values are numeric
a = CDbl(Cells(1, 1))
b = CDbl(Cells(2, 1))

If a = b Then
    ' Other code to execute when the values are matching
End If

End Sub

这都是考虑到您要比较 VBA 代码中的数字。

【讨论】:

  • Excel 不关心您是否将IntegerDoubleByteLong 进行比较。考虑Dim a as Integer, b as Byte, c as Double, d as Long,然后考虑a = 2b = 2c = 2d = 2,然后您可以验证自己MsgBox a = bTrue 一样多,MsgBox b = cMsgBox c = d 也是如此(自动/隐式转换)。因此,@CLR 是正确的,唯一可能的问题是 RC1 包含字符串 2.0(并且 不是 格式化为显示一位小数的数字)。因此,他/她提议将字符串转换为带有Value 的数字。
  • 您确实是对的,我刚刚尝试过,无论变量的类型是什么,它都有效。带来不便敬请谅解。我不知道为什么 OP 给了我正确的答案。
  • 完全没有不便之处。不用担心。此外,您的评论对于大多数编程语言(如 C++、Java、SQL 等)都是正确的。然而,VBA 非常宽容,并允许在其他 real 编程中被认为是不可思议的许多事情语言。在这方面,这不是唯一的事情。其他的事情是 (1) 隐式转换 (2) 非限定引用 (3) 不需要将对象设置为 Nothing 以进行垃圾回收......等等。
猜你喜欢
  • 2019-12-22
  • 1970-01-01
  • 2014-11-28
  • 1970-01-01
  • 2011-07-20
  • 2017-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多