VBA Range.Find方法未找到该范围内的IS值

时间:2016-07-08 18:10:50

标签: vba excel-vba excel

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

EditText

代码行

android:selectAllOnFocus="true"

总是返回任何内容,但我已经确认存在具有该值的单元格。一个例子,单元格值是66,152.61(在单元格中显示为66,153),bestPnL变量是66,152.61,所以我尝试将bestPnL四舍五入到66,153,但仍然没有找到它。调试语句显示tempRange具有正确的范围,因此它不会在错误的位置搜索。

我唯一能想到的是带有值的单元格,从一个非常长的公式中获取它的值,使用十几个命名范围,这可能会污染find方法吗?

就是这样我们都知道我并不疯狂,这里是我正在测试我所在地的部分范围的快照。

enter image description here

修改 根据Tim Williams的建议,我在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)

现在按预期工作。

2 个答案:

答案 0 :(得分:2)

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

Set f = rng.Find(what:=bestPnL, LookIn:=xlFormulas) 

即使使用千位分隔符也能正常工作(编辑:仅适用于硬编码值;使用公式失败)。

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

Sub Tester()

    Dim f As Range, v, rng As Range

    Set rng = Range("C3:C21")

    v = Application.Large(rng, 3)

    v = Format(v, rng.Cells(1).NumberFormat)

    Set f = rng.Find(what:=v, LookIn:=xlValues)

    Debug.Print f.Address   ' >> C19

End Sub

答案 1 :(得分:0)

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

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

这将在提供的范围内返回FIRST 1234值单元格的相对位置,而与格式无关。最后一个0表示您使用完全匹配。