簡體   English   中英

Excel:使用VBA在單元格中搜索值范圍,並返回命中

[英]Excel: Using VBA to Search a Cell, for a Range of values, and return a Hit

因此,我有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-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()嗎? 我只是不知道這件事。

我希望能夠通過引用原始字符串在電子表格的單元格中鍵入它來按需調用此函數。

謝謝!

嘗試將此代碼作為基礎,然后從那里開始學習。

Main sub使用cell(1,1)中的字符串,並使用searchForText函數將方向和地址線提取到cell(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
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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM