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 制作一种替代数组函数的主要内容,如果未能解决你的问题,请参考以下文章
创建一个 Spark udf 函数以迭代字节数组并将其转换为数字