当值存在时,VBA Range.Find方法返回Nothing

时间:2015-10-28 12:25:57

标签: excel-vba find vba excel

我正在尝试获取包含特定值的单元格的地址:

dim MinAdrress as Range
Set MinAddress = DetractRow.Find(Min_1, , xlValues, xlWhole)

Min_1为0.23,DetractRow范围包含以下值:

30% 26% 23% 27% -7%

所以MinAddress应该是范围内的第3个单元格。但是,在“本地”窗口中,我将其视为Nothing。我也试过没有可选的参数(xlValues, xlWhole),结果相同。非常感谢任何输入

1 个答案:

答案 0 :(得分:1)

根据我的评论,我相信Find函数将匹配单元格的值,因为它是由该单元格格式化的。所以除非你做了一些额外的工作,否则 0.23 将找不到 23%。例如,这可以起作用:rng.Cells.Find("23%", rng.Cells(1), xlValues, xlWhole, xlRows, xlNext, True)。我听说过人们采取的各种各样的,非常奢侈的行动,尤其是当谈到找到日期时(我甚至听说过人们阅读单元格格式,清除它们,然后在Find结束时重写它们。)

我不是Find功能的忠实粉丝。人们可以尽一切努力,例如,创建一个值String,以匹配特定的单元格格式,只发现你或其他人决定再多一个小数位会更好。下沉Find sub。

并不需要很大的深度费用

我仍然倾向于将值读入数组并For ... Next循环,尤其是Value2为您提供选项,例如,以Long形式搜索日期,这样就没有了格式化问题的风险。

以下是您的代码:

Dim v As Variant
Dim r As Long
Dim c As Long

'If DetractRow range is just one column
v = DetractRow.Value2
For r = 1 To UBound(v, 1)
    If v(r, 1) = Min_1 Then
        MsgBox "Gotcha at index " & CStr(r)
        Exit For
    End If
Next

'If DetractRow range is just one row
v = DetractRow.Value2
For c = 1 To UBound(v, 2)
    If v(1, c) = Min_1 Then
        MsgBox "Gotcha at index " & CStr(c)
        Exit For
    End If
Next

'If DetractRow range is more than one row and column
v = DetractRow.Value2
For c = 1 To UBound(v, 2)
    For r = 1 To UBound(v, 1)
        If v(r, c) = Min_1 Then
            MsgBox "Gotcha at index " & CStr(r) & _
                    ", " & CStr(c)
            Exit For
        End If
    Next
Next