0

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

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

这是我的简单代码

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

它运作良好。
问题是,它不仅将“VA”作为一个单独的表达,而且作为单词的一部分

因此,如果我的用户键入“梵蒂冈”,它会将其变成:“梵蒂冈”……这当然是我不想要的。

您知道如何轻松指定我的代码以使其仅考虑替换与表达式匹配的整个单词吗?(理想情况下,我有几十行这些替换,最好直接对“替换”功能采取行动 - 如果可能的话)。

提前致谢 !

4

2 回答 2

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
于 2013-08-02T02:54:58.680 回答
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..
于 2013-08-02T03:27:50.083 回答