【问题标题】:VBA Range.Find function on rounded negative numbersVBA Range.Find 舍入负数的函数
【发布时间】:2015-04-30 11:40:29
【问题描述】:

我编写的 VBA 宏存在问题,该宏的部分旨在查找范围内的最低值。该行如下所示:

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

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

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

我看到了两种处理这个问题的方法:

  1. 找出显示的小数位数,然后将实际值四舍五入以使其匹配。但是这种匹配方式实际上可能会出错,因为如果四舍五入到小数点后 2 位,像 11.321 和 11.322 这样的数字将是相同的。此外,这是不可能的,因为我需要找到单元格的地址才能做到这一点,而这是在上面代码的第 2 行中完成的,这会导致问题。
  2. 不知何故告诉Find 函数使用实际而不是显示的数字,但我不知道该怎么做。我用谷歌搜索了几天,但仍然没有成功。

非常感谢您的帮助。

【问题讨论】:

    标签: excel find rounding vba


    【解决方案1】:

    至少有两个可能的问题:

    • 不要使用 Min 作为变量名
    • 调暗你使用的变量

    例如:

    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
    

    运行时:

    无论格式如何,都能轻松找到 B2

    【讨论】:

    • 这些函数似乎不适用于负值。我在单元格中的 -46/13 范围内尝试了您的代码,并收到与 OP 相同的错误消息。
    • @Flephal ........非常奇怪.......它适用于我的旧电脑......... Win 7 - Excel 2007
    • 感谢您的回复!两种方法都试过了,都不适合我:(@Flephal 可能是对的,在我的文件中,最小数字总是应该是负数,所以这可能是原因
    【解决方案2】:

    查看了负数的问题并将其与查找功能一起使用;一个可能的解决方案是格式化您的搜索范围和数字以使用相同的数字格式查找。 (基于@Gary's Student 提供的代码)

    代码如下。

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

    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
    

    【讨论】:

    • 这是一个非常奇怪的Find 行为。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多