VBA заменить одну и ту же букву разными значениями - PullRequest
0 голосов
/ 10 апреля 2020

Я пытаюсь написать код vba, который будет искать букву в строке и заменять ее указанным c значением ячейки.

Проблема в том, что буква может появляться в строке максимум 3 раза и каждый раз, когда необходимо заменить букву другим значением.

Пример строки I have x and x and x

Первый х следует заменить на 1, второй на 2 и третий на 3.

Мой код на данный момент

for i = 0 to lim

range("B" & lim +13).Value = replace (range("B" & lim +13), "x",range("K" & lim +13).Value)

Next i

Проблема с приведенным выше кодом состоит в том, что он заменит каждый x одинаковым значением; Я хотел бы сделать это с указанным c порядком замены.

В идеале, вторая и третья замена должны исходить из другого значения ячейки по моему выбору.

Ответы [ 3 ]

3 голосов
/ 10 апреля 2020

вы можете использовать Replace() функцию:

Dim s As String
Dim i As Long

s = "I have x and x and x"
Do While InStr(s, "x") > 0
    i = i + 1
    s = Replace(s, "x", i, , 1)
Loop

, чтобы вы могли обернуть ее в функцию:

Function Rep(s As String, x as string) As String
    Dim i As Long

    Do While InStr(s, x) > 0
        i = i + 1
        s = Replace(s, x, i, , 1)
    Loop
    Rep = s
End Function

для использования как:

range("B" & lim +13).Value = Rep(range("B" & lim +13).Value, "x")
2 голосов
/ 10 апреля 2020

Попробуйте функцию разделения:

Sub XTest()
Dim s As String
s = "I have x and x and x"
Dim parts As Variant
parts = Split(s, "x")
Dim i As Long
For i = 0 To UBound(parts) - 1
    parts(i) = parts(i) & i + 1
Next i
s = Join(parts, "")
Debug.Print s
End Sub

1 голос
/ 10 апреля 2020

Расположите замены в массиве по порядку, затем для каждой ячейки замените 1-ю "x" на 1-е значение массива, 2-ю на 2-е значение массива и т. Д.

Dim newString As String, i As Long, j As Long, replacements As Variant

For i = 0 To lim

    replacements = Array(1, 2, "some other value or cell", "4th replacement")

    newString = Range("B" & i + 13).value

    For j = 0 To UBound(replacements)
        If InStr(newString, "x") = 0 Then Exit For
        newString = Replace$(newString, "x", replacements(j), 1, 1)
    Next

    Range("B" & i + 13).value = newString

Next

(я использовал i в Range вставке lim, поскольку lim никогда не изменится в течение l oop)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...