VBA Range.Find函数舍入负数

时间:2015-04-30 11:40:30

标签: excel-vba find rounding vba excel

我遇到过我写的VBA宏的问题,其中的部分旨在找到范围内的最低值。这条线看起来像这样:

Min = Application.WorksheetFunction.Min(a0eqB) Set MinCell = a0eqB.Find(Min, LookIn:=xlValues)

它返回Object variable or With block variable not set错误。现在,我知道为什么会发生这种情况 - 有时Find找到Nothing,我学会了如何处理这种情况。虽然,当单元格中 dispayed 的值与Nothing变量中的值不同时,它也会找到Min

例如,当Min = -11.2641373534338时,单元格中的值为-11.264137,然后发生错误。但是,如果我通过Excel UI按钮更改为该单元格显示的小数位数,直到它为-11.2641373534338,一切正常。如果有帮助,单元格中的值实际上是公式计算结果。

我认为有两种方法可以解决这个问题:

  1. 找出显示的小数位数,然后舍入实际值,使它们匹配。但这种方式匹配实际上可能会出错,因为如果舍入到2位小数位,11.321和11.322之类的数字将是相同的。此外,由于我需要找到单元格的地址才能执行此操作,并且在上面的代码的第2行中完成了这一点,这是不可能的。导致问题。
  2. 以某种方式告诉Find函数使用实际和未显示的数字,但我不知道如何做到这一点。我用谷歌搜索了几天但仍然没有成功。
  3. 我真的很感谢你的帮助。

2 个答案:

答案 0 :(得分:1)

至少有两个可能的问题:

  • 请勿使用 Min 作为变量名称
  • Dim 您使用的变量

例如:

Sub GetLowest()
    Dim wf As WorksheetFunction
    Set wf = Application.WorksheetFunction
    Dim rng As Range, Lowest As Double, WhereIs As Range
    Set rng = Range("A1:F9")

    Lowest = wf.Min(rng)
    Set WhereIs = rng.Find(What:=Lowest, After:=rng(1))
    MsgBox WhereIs.Address
End Sub

运行时:

enter image description here

无论格式如何,

都能轻松找到 B2

答案 1 :(得分:0)

查看负数问题并将其与find函数一起使用;一种可能的解决方案是格式化您的搜索范围和数字,以找到相同的数字格式。 (根据@ Gary' s学生提供的代码)

代码如下。

如果您不想更改电子表格中的数字格式,那么进一步的黑客就是制作工作表的副本以格式化并找到地址,然后删除副本并使用原始地址表格,但这将涉及更多的编码...

Sub GetLowest()

    Dim sFormat As String: sFormat = "0.000000000"
    Dim wf As WorksheetFunction: Set wf = Application.WorksheetFunction
    Dim rng As Range: Set rng = Range("MinRange")
    rng.NumberFormat = sFormat
    Dim Lowest As Double: Lowest = Format(wf.Min(rng), sFormat)
    Dim WhereIs As Range: Set WhereIs = rng.Find(What:=Lowest)

    MsgBox WhereIs.Address

End Sub