如何创建一个函数来接受串联的源值 - Excel VBA

Posted

技术标签:

【中文标题】如何创建一个函数来接受串联的源值 - Excel VBA【英文标题】:How to create a function to accept concatenated source value - Excel VBA 【发布时间】:2019-03-15 10:39:19 【问题描述】:

我正在尝试创建一个 vba 函数来替换单元格值中的多个字符。我现在称这个函数为“TestFunction”。该函数的目的是从数据中解析出非法字符才能使用,原始数据需要在解析后保留在自己的列中。

我已经粘贴了我的代码和表格作为参考。

要使用该函数,我想在与数据所在行位于同一行的辅助列上使用 =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) |

【问题讨论】:

连接起来的是字符串,不是范围。 UDF() 改为接受String 而不是Range. 【参考方案1】:

问题在于您的函数 TestFunction(CellContents As Range) 正在等待 RangeA1&B1 实际上是 String 因为与 & 的串联会转换两个范围的值 A1B1变成一个字符串。

我建议以下改进:

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

【讨论】:

以上是关于如何创建一个函数来接受串联的源值 - Excel VBA的主要内容,如果未能解决你的问题,请参考以下文章

Select与SelectMany的区别

LINQSelect与SelectMany的区别

如何展平 IEnumerables 的 IEnumerables 的串联

SQL中的cast()函数

sql中的cast()用法

sql CAST用法