Как создать функцию для приема объединенного исходного значения - Excel VBA - PullRequest
2 голосов
/ 15 марта 2019

Я пытаюсь создать функцию vba, чтобы заменить несколько символов из значения ячейки. Я сейчас вызываю эту функцию «TestFunction». Цель этой функции - проанализировать недопустимые символы из данных, чтобы иметь возможность использовать их, а исходные данные после анализа должны оставаться в своих собственных столбцах.

Я вставил свой код и таблицу в качестве ссылки.

+ screen capture from original test

Чтобы использовать функцию, я хотел бы использовать =TestFunction(...) для вспомогательного столбца в той же строке, где находятся данные. Код работает для одной ссылки, например, =TestFunction(A1), но при попытке передать каскадную ссылку, например =TestFunction(A1&A2) возвращает #VALUE!.

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

Кто-нибудь знает, возможно ли это достичь?

Ссылочный код:

Function TestFunction(CellContents As Range) As String
  Dim CellTextReplaced As String
  Dim char As Variant
  ' Characters to be replaced with "|" as delimiter
  Const SpecialCharacters As String = ".|,|!| |/|\|+|-|@|&"

  ' Replace all special characters
  CellTextReplaced = CellContents.Value
    For Each char In Split(SpecialCharacters, "|")
      CellTextReplaced = Replace(CellTextReplaced, char, "")
    Next
  ' Output

  TestFunction = CellTextReplaced
End Function

Справочная таблица:

  |   A    |    B     |        C           |          D           |
-------------------------------------------------------------------
1 | .test  |   .test  |  =TestFunction(A1) | =TestFunction(A1&B1) |
2 | ,test  |   ,test  |  =TestFunction(A2) | =TestFunction(A2&B2) |
3 | test-  |   test-  |  =TestFunction(A3) | =TestFunction(A3&B3) |
4 | /test\ |   /test\ |  =TestFunction(A4) | =TestFunction(A4&B4) |

1 Ответ

3 голосов
/ 15 марта 2019

Проблема в том, что ваша функция TestFunction(CellContents As Range) ожидала Range, но A1&B1 на самом деле String, потому что конкатенация с & приводит к приведению значений двух диапазонов A1 и B1 в строку.

Предлагаю следующие улучшения:

Option Explicit

Public Function TestFunction(ByVal CellContents As String) As String
    Const SpecialCharacters As String = ".,! /\+-@&"

    Dim iChar As Long
    For iChar = 1 To Len(SpecialCharacters)
        CellContents = Replace$(CellContents, Mid$(SpecialCharacters, iChar, 1), "")
    Next iChar

    TestFunction = CellContents
End Function
...