2013-08-02 63 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..