我正在使用脚本来允许用户在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
答案 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
传递给r
,Debug.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中删除任何空白