【问题标题】:VBA Range.Find() function not working with large floating numbersVBA Range.Find() 函数不适用于大浮点数
【发布时间】:2020-02-07 03:29:38
【问题描述】:

我正在编写代码来查找列中的最高美元金额,并带回目标单元格中​​具有 9 个字符的相邻列中单元格的值以及值

当我设置范围变量时,它显示“12000.88”的值,它工作正常,但是一旦该值扩展到超过 9 位“123000.55”,“set fnd”就找不到它并且范围变量是没有。我测试了很多其他东西,发现唯一的区别是值的长度

Sub Populate()

    Dim Fnd As Range    
    Set Fnd = Range("L:L").Find(WorksheetFunction.Large(Range("L:L"), 1), , xlValues)

End Sub

我对较小的数字没有问题,但我不明白为什么这不适用于较大的数字。

【问题讨论】:

  • 它适用于xlformulas - 不要问我为什么!
  • 如果整列为空,则抛出 1004 错误。
  • 我已经为此苦苦思考了大约 8 个小时... xlformulas... 它起作用了... 非常沮丧但松了一口气。谢谢。
  • @JeffF - Find 有时确实有点问题,用双打和日期给出意想不到的结果。通常,如果可能的话,我会编写自己的函数(并缓慢循环)或解析为字符串。 Find bugs example

标签: excel vba range max long-integer


【解决方案1】:

问题在于 Excel 和 VBA 使用的小数分隔符不同。因此,在浮点值中,存在“隐藏特征”。 Find() 函数实际上是在寻找 string 并且 double 被“字符串化”显然不是正确的方式 - 使用逗号而不是点。考虑解析为字符串并用点替换逗号以使其工作:

Sub Populate()

    Dim foo As Range        
    Dim biggus As Double

    biggus = WorksheetFunction.Large(Range("A:A"), 1)
    Set foo = Range("A:A").Find(ReplaceCommas(biggus), , xlValues)

    Debug.Print foo.Address

End Sub

Function ReplaceCommas(valueAsString As Variant) As String

    Dim valueToReplace  As String
    valueToReplace = valueAsString
    ReplaceCommas = Replace(valueAsString, ",", ".")

End Function

xlFormulas 出现在SearchIn 参数中时,“功能”没有出现,这是因为xlFormulas 将单元格的内容转换为字符串,以便在里面搜索。例如,如果有=SUM(A1+A2),而我们正在寻找1+A,则找到它的唯一方法是将单元格的内容解析为字符串。

【讨论】:

  • @SJR - 我只是觉得它有问题。无论如何,问题出在,.。 VBA 使用点,Excel 使用逗号作为小数分隔符。我已经编辑了。
  • @JvdV - 实际上和我一样。我已经对其进行了编辑以使其正常工作。
  • 我仍然不确定答案。虽然它显然可以工作,因为您将值解析为字符串,Findcan take any excel data typeWhat 参数。如果我们首先尝试检查变量WorksheetFunction.Large(Range("A:A"), 1),我们可以看到VBA 用一个点来存储它,因为它是基于en_US 的。你确定这是一个错误,Find 只接受字符串?为什么 9 个字符以下可以工作?此外,为什么xlFormulas 会起作用。我也试图理解这个自动取款机。 =)
  • @JvdV - WorksheetFunction.Large(Range("A:A"), 1) 工作正常,并将其正确传递给biggus 类型为double 的变量。当在 A:A 列中搜索该变量时会出现问题 - 它错误地“读取”了点和逗号,因此找不到它。
  • @JvdV - 关于其他问题 - Find() 不只接受字符串,但它解析为字符串参数,因此出现了问题。 9 个字符以下的功能应该是某种优化,我猜是为了使功能快速。大约xlFormulas 自动将单元格的输入转换为字符串,因此它可以工作。毕竟,=SUM(A1+A2) 是一个纯字符串(例如,不是Long,也不是Date,也不是Double
猜你喜欢
  • 1970-01-01
  • 2013-03-22
  • 2018-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多