VBA范围。查找方法找不到范围内的值

VBA范围。查找方法找不到范围内的值,vba,excel,Vba,Excel,我有下面的方法,可以找到一个范围内的最大值和最小值。然后我使用这些值来定位它们所在的实际单元格,因为我需要从该列的标题单元格中获取值。Range.Find始终不返回任何内容,即使正在搜索的范围中有一个具有该值的单元格 Sub GetTopAndBottomFiveCommodities() Dim tempRange As Range, x As Integer, bestPnL As Double, worstPnL As Double Dim strTopRangeName

我有下面的方法,可以找到一个范围内的最大值和最小值。然后我使用这些值来定位它们所在的实际单元格,因为我需要从该列的标题单元格中获取值。Range.Find始终不返回任何内容,即使正在搜索的范围中有一个具有该值的单元格

Sub GetTopAndBottomFiveCommodities()
    Dim tempRange As Range, x As Integer, bestPnL As Double, worstPnL As Double
    Dim strTopRangeName As String, strBottomRangeName As String
    Dim cCell As Range, commodityName As String

    Set tempRange = dataSourceSheet.Range("A:A").Find(What:="Year Totals")
    Set tempRange = Range(tempRange.Offset(0, 1), tempRange.End(xlToRight).Offset(0, -1))
    For x = 1 To 5
        strTopRangeName = "TopCommodity" & CStr(x)
        strBottomRangeName = "BottomCommodity" & CStr(x)
        bestPnL = WorksheetFunction.Large(tempRange, x)
        worstPnL = WorksheetFunction.Small(tempRange, x)
        Debug.Print tempRange.Address
        ' get the top commodity name and PnL       
        **Set cCell = tempRange.Find(What:=bestPnL, LookIn:=xlValues)**
        commodityName = dataSourceSheet.Cells(5, cCell.Column).Value
        Range(strTopRangeName).Value = commodityName
        Range(strTopRangeName).Offset(0, 1).Value = bestPnL
    Next x
End Sub
代码行

Set cCell = tempRange.Find(What:=bestPnL, LookIn:=xlValues)
总是不返回任何内容,但我已验证是否存在具有该值的单元格。例如,单元格值为66152.61(在单元格中显示为66153),bestPnL变量为66152.61,因此我尝试将bestPnL四舍五入为66153,但仍然没有找到它。debug语句显示tempRange具有正确的范围,因此它没有在错误的位置进行搜索

我唯一能想到的就是带值的单元格,从一个很长的公式中得到它的值,使用了十几个命名范围,这会影响find方法吗

我们都知道我不是疯了,这是我正在测试的部分范围的快照

编辑 根据Tim Williams的建议,我在Find调用之前更改了搜索范围的数字格式

 tempRange.NumberFormat = "0.00"
然后,Find调用会正常工作。然后,在例行程序结束时,我将数字格式恢复到我想要的方式

tempRange.NumberFormat = "$#,##0;[Red]$#,##0"

现在可以正常工作。

尝试从单元格的数字格式中删除千位分隔符。当我在测试范围内这样做时,它工作得很好,但使用分隔符时,它找不到值

Set f = rng.Find(what:=bestPnL, LookIn:=xlFormulas) 
即使使用千位分隔符(编辑:仅对硬编码的值有效;对公式无效)

EDIT2:这对我来说很有效,使用了千分位符并使用了值的公式(EDIT3!:不适用于货币格式)


尝试从单元格的数字格式中删除千位分隔符。当我在测试范围内这样做时,它工作得很好,但使用分隔符时,它找不到值

Set f = rng.Find(what:=bestPnL, LookIn:=xlFormulas) 
即使使用千位分隔符(编辑:仅对硬编码的值有效;对公式无效)

EDIT2:这对我来说很有效,使用了千分位符并使用了值的公式(EDIT3!:不适用于货币格式)


这是一个老问题,但我发现了一个在某些情况下有效且简单的替代方案:

dim idx as long, rng as range
set rng = someRange
idx = application.WorksheetFunction.Match(1234,rng,0)

这将返回所提供范围内第一个1234值单元格的相对位置,与格式无关。最后一个0表示使用精确匹配。

这是一个老问题,但我发现了一个在某些情况下有效且简单的替代方法:

dim idx as long, rng as range
set rng = someRange
idx = application.WorksheetFunction.Match(1234,rng,0)


这将返回所提供范围内第一个1234值单元格的相对位置,与格式无关。最后一个0表示使用精确匹配。

可能是小数的问题,您看不到吗?如果在find参数中设置lookat:=xlpart,会发生什么情况?另外,bestPnL是你要找的,它是双人的。确保您查看的值也是数字,我以前也遇到过这个问题。例如,如果您编写
What:=Cstr(bestPnL)
查看它是否有效?尝试强制转换为字符串,但不起作用可能是因为您没有看到小数的问题?如果在find参数中设置lookat:=xlpart,会发生什么情况?另外,bestPnL是你要找的,它是双人的。确保您查看的值也是数字,我以前也遇到过这个问题。例如,如果您编写
What:=Cstr(bestPnL)
查看它是否有效?尝试强制转换为字符串,但在不更改任何其他内容的情况下不起作用,我尝试使用无效的xlFormulas,因为您以“即使使用千位分隔符也能起作用”结尾我还添加了Searchorder:=xlByColumns,因为它是一个水平的单行范围。它的searching您是否尝试删除千位分隔符?…因为我不想从工作表中删除分隔符,我将把它添加到搜索变量中,看看是否有效。是啊,那不行。我将尝试在搜索时重新设置范围的格式,然后将其放回末尾。很抱歉,我正在使用范围内的硬编码数字进行测试:如果我将这些数字切换到公式(具有相同的值),则
Find()
失败。我尝试在查找之前设置tempRange.NumberFormat=“0.00”,然后将其改回LookIn:=xlValues,这样做很有效。编辑你的帖子,我会接受。在不改变任何其他内容的情况下,我尝试使用xlFormulas,但它不起作用,因为你以“即使使用千位分隔符也能起作用”结尾我还添加了Searchorder:=xlByColumns,因为它是一个水平的单行范围。它的searching您是否尝试删除千位分隔符?…因为我不想从工作表中删除分隔符,我将把它添加到搜索变量中,看看是否有效。是啊,那不行。我将尝试在搜索时重新设置范围的格式,然后将其放回末尾。很抱歉,我正在使用范围内的硬编码数字进行测试:如果我将这些数字切换到公式(具有相同的值),则
Find()
失败。我尝试在查找之前设置tempRange.NumberFormat=“0.00”,然后将其改回LookIn:=xlValues,这样做很有效。编辑您的帖子,我会接受您的问题,但这不是关于寻找0吗?或者你只是把它作为一个例子?事实上,我在我的想法中迷失了方向,但这应该适用于任何整数值。对于小数,我们都知道Excel可能会…非常复杂,即使对于小数和货币格式,它也会起作用,所以如果OP只想搜索一行/列,那么它可能比
Find
Find更好。Find的优点是它允许向后搜索。但问题不是查找0?或者你只是把它作为一个例子?事实上,我在我的想法中迷失了方向,但这应该适用于任何整数值。对于小数,我们都知道Excel可能会…很复杂。它确实有效,即使对于小数和货币格式也是如此