Excel:使用VBAsearch单元格,获取一系列值,并返回一个命中

所以我有超过10,000行的可怕的 – 无格式 – 半可读 – 巨型巨型。 我已经公布下面的公式。 我很快就会在配方中用尽空间,这不是一个非常有效的方法。

数据如下所示:

SCHMIDT,|JOHN|JACOB|JINGLE-HEIMER|PO|BOX|98765|1234|OCTAVIAN|ST|N|100|MILE|HOUSE| JIMBOB,|JOEY|JAN|PO|BOX|-|98765|1234|MERCER|RD|E|VANCOUVER| HEISENBERG,|RR|1|-|98765|1234|FRANKLIN|AVE|S|NORTH|VANCOUVER| MAN,|HE|98765|1234|SKELETOR|PL|W|100|POCO| RINGO,|JULIUS|CHARLES|98765|1234|SKELETOR|CRES|NE|100|POCO| BAJINGO,|DOCTOR|SCRUBS|98765|1234|HOSPITAL|RD|NW|100|EAST|VANCOUVER| 

你所看到的并不总是以它所处的顺序出现; 例如“PO BOX”不存在/存在,或者在行的开始,中间或结尾。 不是所有的Address_Lines都有一个Suite号码,并不是所有的Suite-Address_Line都有一个“ – ”来区分这两个号码。

此时,我想提取方向(N,E,S,W,NE,NW,SE,SW),以及Address_line后缀(Rd,St,Cres等)。

这些是我的公式:

=IF(ISNUMBER(SEARCH("|ST|",A2)),"ST",IF(ISNUMBER(SEARCH("|RD|",A2)),"RD",IF(ISNUMBER(SEARCH("|AVE|",A2)),"AVE",IF(ISNUMBER(SEARCH("|PL|",A2)),"PL"))))

方向=IF(ISNUMBER(SEARCH("|N|",A2)),"N",IF(ISNUMBER(SEARCH("|E|",A2)),"E",IF(ISNUMBER(SEARCH("|S|",A2)),"S",IF(ISNUMBER(SEARCH("|W|",A2)),"W"))))

我可以请帮助重写这些公式作为两个单独的function,在VBA?

我的想法是,我使用一个给定单元格上的Search_Text的CASE函数调用Search()? 我只是不知道去做这件事。

我希望能够通过在电子表格中的单元格中键入该函数,通过引用原始string来调用此函数。

谢谢!

 Function FOne(v As Variant) As String Dim vSearch As Variant, c As Variant vSearch = Array("|ST|", "|RD|", "|AVE|", "|PL|") For Each c In vSearch If InStr(1, v, c) Then FOne = Mid(c, 2, Len(c) - 2) Exit Function End If Next c End Function 

 Function FTwo(v As Variant) As String Dim vSearch As Variant, c As Variant vSearch = Array("|N|", "|E|", "|S|", "|W|") For Each c In vSearch If InStr(1, v, c) Then FTwo = Mid(c, 2, Len(c) - 2) Exit Function End If Next c End Function 

试试这个代码作为你的基础,并从那里拿。

主子接受单元格(1,1)中的string,并使用searchForText函数将方向和地址行提取到单元格(1,2)和(1,3)。

你应该能够根据你的需要修改它,如果不是让我知道的话。

 Sub Main() Dim values As Variant values = Array("|N|", "|E|", "|W|", "|S|", "|NE|", "|NW|", "|SE|", "|SW|") Cells(1, 2).Value = SearchForText(values) values = Array("RD", "ST", "CRES") 'fill in the rest of optional values Cells(1, 3).Value = SearchForText(values) End Sub Function SearchForText(values As Variant) As String Dim line As String Dim i As Long Dim j As Integer, k As Integer line = Cells(1, 1).Value For k = 0 To UBound(values) For j = Len(line) To Len(values(k)) + 1 Step -1 If Mid(line, j - Len(values(k)), Len(values(k))) = values(k) Then GoTo result End If Next j Next k result: values(k) = Left(values(k), Len(values(k)) - 1) 'remove vertical lines values(k) = Right(values(k), Len(values(k)) - 1) SearchForText = values(k) End Function