2013-08-02 86 views
0

我目前遇到一個似乎並不難解決的問題,但是,我無法找到一種乾淨的方式來完成自己的工作。Excel - VBA:使「替換」功能更具體

我正在使用「替換」功能來更改用戶輸入的句子中的某些表達式。例如,如果用戶輸入「va」,我希望它變成「V.A」。相反,它會更容易地與我的數據庫匹配以進一步操作。

這裏是我的簡單的代碼來做到這一點

sMain.Range("J3").Replace "VA", "V. A." 

它運作良好。
問題是,它不僅會將「VA」視爲單個表達,而且還會將其作爲單詞的一部分。

所以,如果我的用戶鍵入「梵蒂岡」,它會把它變成:「V.A.tican」......當然我不想要。

您知道嗎?如何輕鬆指定我的代碼,使其僅考慮替換匹配表達式的整個單詞? (我有幾十行這樣的替換如此理想,如果可能,最好直接採用「替換」功能)。

在此先感謝!

回答

2

這樣做:

sMain.Range("J3").Replace " VA ", "V. A." 

再處理,其中原始字符串的開始或VA 也結束了的情況下,處理分離的所有情況下這可能是(例如)選項卡,空格或逗號。 要做到這一點:

const nSep As Integer = 3 
Dim sep(nSep) As String 
sep(1) = " " 
sep(2) = vbTab 
sep(3) = "," 
for i=1 to nSep 
    for j=1 to nSep 
     sMain.Range("J3").Replace sep(i) & "VA" & sep(j), "V. A." 
    next 
next 
+0

謝謝你,就像一個魅力!祝你有美好的一天 ! – Phalanx

+0

請注意,您必須處理VA位於字符串開頭或結尾的情況。所有分隔符上的單個循環都應該這樣做。 – Tarik

1

可以分裂它,並檢查每個單詞。我已經把它變成了一個易於使用和靈活性的功能。

Function ReplaceWordOnly(sText As String, sFind As String, sReplace As String) As String 
    On Error Resume Next 
    Dim aText As Variant, oText As Variant, i As Long 

    aText = Split(sText, " ") 
    For i = 0 To UBound(aText) 
     oText = aText(i) 
     ' Check if starting with sFind 
     If LCase(Left(oText, 2)) = LCase(sFind) Then 
      Select Case Asc(Mid(oText, 3, 1)) 
       Case 65 To 90, 97 To 122 
        ' obmit if third character is alphabet (checked by ascii code) 
       Case Else 
        aText(i) = Replace(oText, sFind, sReplace, 1, -1, vbTextCompare) 
      End Select 
     End If 
    Next 
    ReplaceWordOnly = Join(aText, " ") 
End Function 

輸出示例:

?ReplaceWordOnly("there is a vatican in vA.","Va","V. A.") 
there is a vatican in V. A..