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

Excel-VBA:使;替换“;功能更具体,excel,vba,replace,Excel,Vba,Replace,我现在遇到了一个似乎不难解决的问题,但是,我找不到一个干净的方法来自己解决 我正在使用“Replace”函数更改用户键入的句子中的某些表达式。例如,如果用户键入“va”,我希望它改为“V.A”,这样它将更容易与我的数据库匹配,以便进行进一步的操作 以下是我的简单代码: sMain.Range("J3").Replace "VA", "V. A." 它工作得很好。 问题是,它不仅将“VA”作为一个单独的表达,而且还将其作为单词的一部分 所以如果我的用户输入“梵蒂冈”,它会变成:“V.A.tica

我现在遇到了一个似乎不难解决的问题,但是,我找不到一个干净的方法来自己解决

我正在使用“Replace”函数更改用户键入的句子中的某些表达式。例如,如果用户键入“va”,我希望它改为“V.A”,这样它将更容易与我的数据库匹配,以便进行进一步的操作

以下是我的简单代码:

sMain.Range("J3").Replace "VA", "V. A."
它工作得很好。
问题是,它不仅将“VA”作为一个单独的表达,而且还将其作为单词的一部分

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

<>你知道如何容易地指定我的代码,使它只考虑替换<强>整字< /强>匹配表达式吗?(我有几十行这样的替换,因此理想情况下,最好直接对“替换”功能进行操作——如果可能的话)

提前谢谢

这样做:

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
这样做:

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

可以将其拆分并检查每个单词。我已经把它变成了一个易于使用和灵活的功能

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

可以将其拆分并检查每个单词。我已经把它变成了一个易于使用和灵活的功能

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

请注意,您必须处理VA位于字符串开头或结尾的情况。在所有分隔符上使用一个循环就可以了。请注意,您必须处理VA位于字符串开头或结尾的情况。所有分隔符字符上的单个循环应该可以完成此操作。