Проблема с использованием WorksheetFunction.Substitute в сочетании с Offset - PullRequest
0 голосов
/ 08 января 2019

Мне нужно написать функцию для выполнения ряда подстановок в строку на основе поиска значений в листе.

Мое намерение состоит в том, чтобы выполнить итерацию по списку пар замещения на листе и вызывать функцию рабочей книги «заменять» для каждой итерации.

Function multiSub(original As Range, replaceList As Range)
Dim temp1 As String
Dim temp2 As String
Dim temp3 As String

  '  temp1 = replaceList.Offset(0, 0).Value
  '  temp2 = replaceList.Offset(0, 1).Value
  temp1 = "from"
  temp2 = "to"
    multiSub = Application.WorksheetFunction.Substitute(original, temp1, temp2)
End Function

Если вы возьмете код как есть, тогда он будет работать, так как он заменит слово «от» словом «на», если первый аргумент в созданной мной функции указывает на ячейку со словом « откуда-то в этом.

Если, однако, я закомментирую назначения для temp1 или temp2 и откомментирую другие строки, я получу #Value! ошибка в рабочем листе.

Интересно, что даже если я назначу несвязанную переменную (скажем, temp3) для одного из этих смещений диапазона и сохраню temp1 и temp2 как относящиеся к жестко закодированным строкам, она все равно не будет работать таким же образом.

Почему это происходит и как я могу это исправить?

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Код, который я написал в конце, похож на это, хотя он не проверяет, что есть только два столбца:

Function multiSub(original As Range, replaceList As Range)
Dim temp1 As String
Dim temp2 As String
Dim row As Range

multiSub = original
    For Each row In replaceList.Rows
        multiSub = Application.WorksheetFunction.Substitute(multiSub, row.Cells(1, 1), row.Cells(1, 2))
    Next row
End Function

Я оставлю ответ Скотта как принятый, когда он решил мою проблему.

0 голосов
/ 08 января 2019

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

Function multiSub(original As Range, replaceList As Range)
Dim temp1 As String
Dim temp2 As String
If replaceList.Rows.Count <> 1 Or replaceList.Columns.Count <> 2 Then
    multiSub = "error"
End If

  temp1 = replaceList.Cells(1, 1).Value
  temp2 = replaceList.Cells(1, 2).Value


    multiSub = Replace(original, temp1, temp2)
End Function

Для многократной замены:

Function multiSub(original As Range, replaceList As Range)

If replaceList.Columns.Count <> 2 Then
    multiSub = "error"
End If

Dim temp1 As Variant
 temp1 = replaceList

Dim i As Long
For i = LBound(temp1, 1) To UBound(temp1, 1)
    multiSub = Application.Trim(Replace(" " & original & " ", " " & temp1(i, 1) & " ", " " & temp1(i, 2) & " "))
Next i
End Function

Это будет выполнять итерацию строк диапазона из двух столбцов и заменять элементы в первом столбце значениями в столбце 2.

...