更多地控制XlFind

时间:2017-06-19 10:55:43

标签: vb.net vba excel-vba excel

我正在使用脚本来允许用户在Excel工作表的列中查找序列号。但问题是搜索的灵活性。

序列号可能会出现如下例子:“12345678”,“1 345678”,“12 345678”如您所见,在导致问题的数字后面有不同数量的空格。此外,前两个(或偶尔单个)数字显示序列号的年份,可能会也可能不会用空格分隔。

有没有办法解释这些变化而无需执行多次搜索或调整数据?

Private Function ExcelFind(r As Excel.Range, s As String)
    Dim currentFind As Excel.Range = Nothing
    currentFind = r.Find(s, ,
Excel.XlFindLookIn.xlValues, Excel.XlLookAt.xlPart,
Excel.XlSearchOrder.xlByRows, Excel.XlSearchDirection.xlNext, False)

    If currentFind IsNot Nothing Then
        Debug.Print("foundrow " & currentFind.Row)
        Debug.Print("foundcol " & currentFind.Column)
        Return (currentFind)
    Else
        Debug.Print("not found (EF1)")
        Return Nothing
    End If
End Function

3 个答案:

答案 0 :(得分:2)

好吧,使用数组进行检查的方法 - 这比使用Maddy Nikam的答案检查每个单元格要快得多。 我对A1:AN10000进行了一次跑步,大约花了3秒钟。仍然不是最佳的,但比按细胞检查全范围细胞更有效。

Sub test(r As Excel.Range, s As String)
Dim arr() As Variant
Dim cl as long
Dim rw as long

arr = r.value

cl = 1
Do While cl <= r.Columns.Count
    rw = 1
    Do While rw <= r.Rows.Count
        arr(rw, cl) = Replace(arr(rw, cl), " ", "")
        If arr(rw, cl) = s Then
            Debug.Print r.Cells(rw, cl).Address
        End If
        rw = rw + 1
    Loop
    cl = cl + 1
Loop
End Sub

编辑:我假设r将是这种方法的连续范围。如果不是,你会遇到地址问题。 例如,使用Set rng = Union(Range("A1:A3"), Range("B5:B7"))调用此邮件并将rng传递给rDebug.Print找到的唯一地址将为A1:A3,而Debug.Print(rng.Address)会告诉您$ A $ 1:$ A $ 3,$ B $ 5:$ B $ 7

答案 1 :(得分:1)

试试这个

    For Each cell In Rng
    Str = cell.Value
    Str = Replace(Str, " ", "")
        If s = Str Then
            Debug.Print ("foundrow " & cell.Row)
            Debug.Print ("foundcol " & cell.Column)
        End If
    Next

答案 2 :(得分:-1)

插入

s = Replace(s, " ", "")

在你寻找之前。这将从变量s中删除任何空白