2013-08-02 4 views
0

В настоящее время я сталкиваюсь с проблемой, которая не кажется трудной для исправления, но, тем не менее, я не могу найти чистый способ сделать это самостоятельно.Excel - VBA: сделать функцию «replace» более конкретной

Я использую функцию «Заменить», чтобы изменить некоторые выражения в предложении, введенном пользователем. Например, если пользователь набирает «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.. 
Смежные вопросы