2012-06-11 53 views
1

我對VBA有點新,而且我確實嘗試搜索該主題的論壇,但我不確定是否使用了正確的詞進行搜索。這是我的問題:使用正則表達式搜索表中缺少的信息不會提取所有匹配的值

我正在使用VBA提取與正則表達式缺少的信息。假設我有一張包含電話號碼和傳真號碼的文字表格。我想將這些數字收集到一張表格中。到目前爲止,我的代碼工作正常,但是當出於某種原因我有多個數字(比如常規和800#)時,只有一個數字被檢索到,而其他數字則沒有。我怎樣才能將所有結果添加到表格中?

查詢:

SELECT regxtr(![表1] [字段1])AS電話FROM表1;

爲(regxtr)函數

VBA代碼:

Option Compare Database 

Function regxtr(ByVal Target As String) As String 'Target is the field we are 'extracting from 

Dim re As New RegExp 
Dim oMatches As Object 
Dim oMatch As Object 
Dim n As Long 
n = 0 

'Set re = CreateObject("vbscript.regexp") 
With re 
.Global = True 
.IgnoreCase = True 
.Multiline = True 
.Pattern = "(\d\d\d.\d\d\d\.\d\d\d\d)" 'keeping the pattern simple for now just to test 
End With 

    'test before executing 
If re.Test(Target) = True Then 
Set oMatches = re.Execute(Target) 

     'attempt to get all matches. THIS IS WHERE I AM FAILING 
For n = 0 To oMatches.Count - 1 
Set oMatch = oMatches(n) 

    regxtr = oMatch.Value 
    n = n + 1 ' does this even belong here? 

    Next 
End If 


End Function 

我怎樣才能使所有的比賽將填充在查詢該領域[電話]?任何幫助將不勝感激。

+0

它如果您從電話號碼字段中提供了示例數據,將會更容易地爲您提供幫助,並且更準確地解釋了代碼中無法使用的內容。 – alan

+0

回答你的問題「這是否屬於這裏?」答案是否定的。 For'循環會在每次迭代時自動增加'n'的值。就像@alan所說的那樣,一些示例數據和示例輸出會很有用。 – JimmyPena

+0

在你的循環中,你每次都重置regxtr的值:'regxtr = oMatch.Value'。所以它一次只能保持一個值。那是對的嗎? – JimmyPena

回答

0

首先,在術語修正。你不是在尋找'submatches'(在其他regex實現中也被稱爲「捕獲組」)。您正在尋找你的正則表達式「匹配」,這樣就可以把括號,只需使用\d{3}.\d{3}.\d{4}那說,這可能是你所需要的:

Function regxtr(ByVal Target As String) As String 'Target is the field we are 'extracting from 
Dim re As New RegExp 
Dim oMatches As Object 
Dim oMatch As Object 

With re 
    .Global = True 
    .IgnoreCase = True 
    .Multiline = True 
    .Pattern = "\d{3}.\d{3}.\d{4}" 'keeping the pattern simple for now just to test 
End With 

If re.Test(Target) = True Then 
    Set oMatches = re.Execute(Target) 
    For Each oMatch In oMatches 'Note: you may get multiple matches because you set re.Global = True above, otherwise you would only get the first match 
     regxtr = regxtr & " " & oMatch 'Note: this is awkward and not advisable as a way to return the values. This is just an example. 
    Next oMatch 
End If 
End Function 

作爲一個測試:

?regxtr("foo 993-242.1231bar994.425-1234hello987.234.2424 world 999.342-5252") 
993-242.1231 994.425-1234 987.234.2424 999.342-5252 
+0

Alan和JP,感謝您的快速回復。 艾倫的解決方案看起來像獲得所有比賽。 有沒有辦法讓這些數字無論是每行一個,或 重複源表中的字段的其餘部分,因此,如果 table1的樣子: 公司\t \t地址\t \t電話 ABC公司\t 123拉拉RD ,\t 800-333-4444或客戶服務:444-555-6666 產量: 公司\t \t地址\t \t電話 ABC公司\t 123拉拉RD,\t 800-333-4444 \t \t ABC公司\t 123 Lala rd,\t 444-555-666 我很滿意正則表達式,但VBA是一個新的轉向。 非常感謝您的幫助 – user1449493

+0

@ user1449493您尚未提供足夠的關於您的源表的信息來向電話號碼添加其他數據。你可能想問一個關於這個問題的新問題。同時,如果這回答了您的正則表達式問題,您可能想要接受答案。 – alan

+0

嗨。至於源表,這是一個靈活的事情:我使用正則表達式爲我們有一個列表的合作關係公司提取公司信息。那些有部分信息,我想在數據庫中完成。我想我們可以調用db myDB,然後將表myTable - fields,domain,url contact_text和phone,其中contact_text是網頁上contact_us頁面的複製/粘貼文本。地址我用合適的模式得到了好處,因爲地址只有一個,手機可以是少數。我們希望將電話(普通電話和免費電話)保留在域thx – user1449493