Excel - VBA:使“替换”功能更具体

时间:2013-08-02 02:40:33

标签: excel vba replace

我目前遇到的问题似乎并不难解决,但是,我找不到一个干净的方法来自己做。

我正在使用“替换”功能来更改用户键入的句子中的某些表达式。例如,如果用户键入“va”,我希望将其转换为“V. A.”相反,它将更容易与我的数据库匹配以进行进一步的操作。

这是我的简单代码

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

效果很好。
问题是,它不仅将“VA”视为单个表达,而且还将其视为单词的一部分

因此,如果我的用户键入“梵蒂冈”,它会变成:“V. A.tican”......当然我不想要。

您是否知道如何轻松指定我的代码以使其仅考虑替换匹配表达式的整个单词? (理想情况下,我有几十行这样的替换,如果可能的话,直接采取“替换”函数会更好。

提前致谢!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

可以将其拆分并检查每个单词。我把它放在一个易于使用和灵活的功能中。

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..