将一个子程序转换成一个函数

我有以下的子例程,在列A中获取预定义的string列表(称为我的大列表),并取决于另一列中的string是否是我的大列表中的某个string的子string,将replace它。 如果没有匹配,它不会做任何事情(只是留下string)。

Sub Find_Bad_Replace_Good() Dim rng As Range, v As Long, vList As Variant With Selection.Parent vList = .Range(.Cells(1, 1), .Cells(Rows.Count, 1).End(xlUp)).Value2 For Each rng In Selection For v = LBound(vList, 1) To UBound(vList, 1) If CBool(InStr(1, rng.Value2, vList(v, 1), vbTextCompare)) Then rng = vList(v, 1) Exit For End If Next v Next rng End With End Sub 

我想将它转换为一个函数,它接受一个string作为参数(来自单个单元格),而不是一个在整个string范围内工作的macros。 我希望你们中的一位专家能帮助我。 我想这个,所以我可以有更多的控制和macros观似乎冻结。

我没有检查你的代码的其余部分,因为我没有在这里的Excel。 但是,这是转换为函数的一般语法:

 Function Find_Bad_Replace_Good(inputValue as String) As String Dim v As Long, vList As Variant With ActiveSheet vList = .Range(.Cells(1, 1), .Cells(Rows.Count, 1).End(xlUp)).Value2 For v = LBound(vList, 1) To UBound(vList, 1) If CBool(InStr(1, inputValue, vList(v, 1), vbTextCompare)) Then Find_Bad_Replace_Good = vList(v, 1) Exit For End If Next v End With End Function 

看到你用来访问rng.Value2我已经切换到inputValue ,这将作为parameter passing给函数的string。 返回值也是一个string,并且与函数名称相同。 因此,在您将search结果分配给rng ,现在我将分配给Find_Bad_Replace_Good ,这将成为您函数的返回值。

我也改变了With ActiveSheet ,因为你没有select了。 只要把它改成你想要的范围。

下面假定你已经给你的“大列表”一个工作簿范围的名字。 这个操作可以像在地址栏左边的名称框中input一个有效的名字一样简单,同时select单元格的范围。 为了向后一致,我将使用名称vList

 Function udf_Alternate_Word(str As String) udf_Alternate_Word = "no match" If Not IsError(Application.Match(Chr(42) & str & Chr(42), Range("vList"), 0)) Then _ udf_Alternate_Word = Range("vList").Cells(Application.Match(Chr(42) & str & Chr(42), Range("vList"), 0), 1).Value2 End Function