UDF 制作一种替代数组函数

Posted

技术标签:

【中文标题】UDF 制作一种替代数组函数【英文标题】:UDF to make a kind of Substitute Array-Function 【发布时间】:2015-10-02 21:29:57 【问题描述】:

我正在尝试制作一个功能,不仅可以用一个文本替换另一个文本, 但是用另一组横向值替换一个范围中的一组值。

我有这个:

Public Function SubstituteRange(RangeWithText As Range, TwoColumnMatrix As Range) As String
Dim Text As String
Text = "/" & RangeWithText.Value & "/"
'as example st like this: "/" & "1/2/3/4/5/6/7/8" & "/" = "/1/2/3/4/5/6/7/8/"
Dim SearchForRange As Range
Set SearchForRange = TwoColumnMatrix.Columns(1)
'let us say "A1:A4" with /2/ /3/ /4/ /5/ in each cell    
Dim ReplaceWithRange As Range
Set ReplaceWithRange = TwoColumnMatrix.Columns(2)
'let us say "B1:B4" with /9/ /10/ /11/ /12/ in each cell
Dim i As Integer
SubstituteRange = Text
For i = 1 To SearchForRange.Rows.Count '4 rows
SubstituteRange = Application.WorksheetFunction.Substitute(SubstituteRange, _
SearchForRange.Item(i), ReplaceWithRange.Item(i))
Next i
End Function

但这会返回一个“#Value!”错误, 有人可以帮我吗? 我希望从这个例子中得到类似“/1/9/10/11/12/6/7/8/”的东西,但我没有得到它。 提前谢谢你。

【问题讨论】:

VBA 有Replace(),它将完成Application.WorksheetFunction.Substitute() 的工作 就像问题一样,。两者中哪一个使用的资源更少? Replace() 在我刚刚运行的快速测试中快了大约 6-7 倍。 【参考方案1】:
Function MultiReplace(v, rng)
    Dim rw As Range, rv
    rv = "/" & v & "/"
    For Each rw In rng.Rows
        rv = Replace(rv, rw.Cells(1).Value, rw.Cells(2).Value)
    Next rw
    MultiReplace = rv
End Function

【讨论】:

谢谢蒂姆,这超过了我所做的,。你结合了速度和易于阅读。我将为此更改我的代码【参考方案2】:

尝试将替换语句更改为此(已测试):

SubstituteRange = Application.Substitute(SubstituteRange, _
SearchForRange.cells(i).Text, ReplaceWithRange.Cells(i).Text)

【讨论】:

你是对的!!非常感谢,我做了这些更改并且效果很好,但是为什么适用于单元格(I)而不适用于项目(I)?还有一个,为什么使用 application.substitute 而不是 application.worksheetfunction.substitute ?? 对于第二个问题,它更短,两者都有效。对于第一个问题,两者都应该可以,但我和大多数开发人员都习惯使用单元格。 我认为我的代码不起作用,因为我使用 item(I) 并且它在 OOP 环境中使用得更多,可能是因为它不仅有一个值(默认值也是如此Cell的值,即Value)

以上是关于UDF 制作一种替代数组函数的主要内容,如果未能解决你的问题,请参考以下文章

从工作表将二维数组传递给 VBA/UDF 函数

创建一个 Spark udf 函数以迭代字节数组并将其转换为数字

Scala UDF 函数对数组列进行操作并返回自定义值

自定义UDF函数vector_trans:遍历两个数组,将其转为目标向量数组(XGBoost模型)

如何将二维数组传递给用户定义的函数?

替代 Application.Volatile 以自动更新 UDF [重复]