VBA Range.Find 四舍五入负数的函数
VBA Range.Find function on rounded negative numbers
我写的 VBA 宏有问题,其中的部分旨在找到范围内的最低值。该行看起来像这样:
Min = Application.WorksheetFunction.Min(a0eqB)
Set MinCell = a0eqB.Find(Min, LookIn:=xlValues)
它 returns Object variable or With block variable not set
错误。现在,我知道为什么会发生这种情况 - 有时 Find
会找到 Nothing
,并且我学会了如何处理此类情况。虽然,当单元格中 dispayed 的值与 Min
变量中的值不同时,它也会找到 Nothing
。
例如,当Min = -11.2641373534338
时,单元格中的值为-11.264137
,则出现错误。但是,如果我通过 Excel UI 按钮更改该单元格显示的小数位数,直到它变为 -11.2641373534338
,一切正常。如果有帮助,单元格中的值实际上是公式计算结果。
我看到了两种处理这个问题的方法:
- 找出显示的小数位数,然后四舍五入实际值以使其匹配。但这种匹配方式实际上可能会出错,因为像 11.321 和 11.322 这样的数字如果四舍五入到小数点后两位将是相同的。另外,这是不可能的,因为我需要找到单元格的地址才能做到这一点,而这是在上面代码的第 2 行中完成的,这导致了一个问题。
- 不知何故告诉
Find
函数使用实际的而不是显示的数字,但我不知道如何做到这一点。我在谷歌上搜索了几天,但仍然没有成功。
非常感谢你的帮助。
查看了负数的问题并将其与查找函数一起使用;一个可能的解决方案是格式化您的搜索范围和数字以使用相同的数字格式查找。 (基于@Gary 的学生提供的代码)
代码如下。
如果您不想更改传播中的数字格式sheet,那么进一步的破解方法是复制作品sheet以格式化并找到地址,然后删除副本并使用原件中的地址 sheet,但这将涉及更多编码...
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
至少有两个可能的问题:
- 不要使用 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
当 运行 在:
无论格式如何,都能轻松找到 B2。
我写的 VBA 宏有问题,其中的部分旨在找到范围内的最低值。该行看起来像这样:
Min = Application.WorksheetFunction.Min(a0eqB)
Set MinCell = a0eqB.Find(Min, LookIn:=xlValues)
它 returns Object variable or With block variable not set
错误。现在,我知道为什么会发生这种情况 - 有时 Find
会找到 Nothing
,并且我学会了如何处理此类情况。虽然,当单元格中 dispayed 的值与 Min
变量中的值不同时,它也会找到 Nothing
。
例如,当Min = -11.2641373534338
时,单元格中的值为-11.264137
,则出现错误。但是,如果我通过 Excel UI 按钮更改该单元格显示的小数位数,直到它变为 -11.2641373534338
,一切正常。如果有帮助,单元格中的值实际上是公式计算结果。
我看到了两种处理这个问题的方法:
- 找出显示的小数位数,然后四舍五入实际值以使其匹配。但这种匹配方式实际上可能会出错,因为像 11.321 和 11.322 这样的数字如果四舍五入到小数点后两位将是相同的。另外,这是不可能的,因为我需要找到单元格的地址才能做到这一点,而这是在上面代码的第 2 行中完成的,这导致了一个问题。
- 不知何故告诉
Find
函数使用实际的而不是显示的数字,但我不知道如何做到这一点。我在谷歌上搜索了几天,但仍然没有成功。
非常感谢你的帮助。
查看了负数的问题并将其与查找函数一起使用;一个可能的解决方案是格式化您的搜索范围和数字以使用相同的数字格式查找。 (基于@Gary 的学生提供的代码)
代码如下。
如果您不想更改传播中的数字格式sheet,那么进一步的破解方法是复制作品sheet以格式化并找到地址,然后删除副本并使用原件中的地址 sheet,但这将涉及更多编码...
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
至少有两个可能的问题:
- 不要使用 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
当 运行 在:
无论格式如何,都能轻松找到 B2。