Excel:使用VBA搜索单元格,查找值范围,然后返回命中

时间:2016-03-01 04:59:43

标签: excel vba excel-vba search

因此,我拥有10,000多行可怕的未经格式化的半清晰的mumbo-jumbo。我在下面发布了我的公式。我很快就会在公式线上用尽空间,这不是一种非常有效的方法。

数据如下所示:

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-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"))))

我可以请一些帮助将这些公式重写为VBA中的两个独立函数吗?

我的想法是我使用CASE函数为给定单元格上的Search_Text调用Search()?我根本不知道这个。

我希望能够通过在电子表格的单元格中输入原始字符串来按需调用此函数。

谢谢!

1 个答案:

答案 0 :(得分:1)

尝试使用此代码作为基础,然后从那里开始。

Main sub获取单元格(1,1)中的字符串,并使用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