Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 将子例程转换为函数_Excel_Vba - Fatal编程技术网

Excel 将子例程转换为函数

Excel 将子例程转换为函数,excel,vba,Excel,Vba,我有下面的子例程,它接受列a中预定义的字符串列表(称之为我的大列表),并根据另一列中的字符串是否是我的大列表中某个字符串的子字符串来替换它。如果没有匹配项,则它不会执行任何操作(只保留字符串原样) 我想将其转换为一个函数,该函数接受字符串作为参数(来自单个单元格),而不是一个在整个字符串范围内工作的宏。我希望你们中的一位专家能帮助我。我想要这个,这样我可以有更多的控制,宏似乎冻结。我没有检查您的其余代码,因为我这里没有Excel。但这是转换为函数的一般语法: Function Find_Bad_

我有下面的子例程,它接受列a中预定义的字符串列表(称之为我的大列表),并根据另一列中的字符串是否是我的大列表中某个字符串的子字符串来替换它。如果没有匹配项,则它不会执行任何操作(只保留字符串原样)


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

我没有检查您的其余代码,因为我这里没有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
,它将是作为参数传递给函数的字符串。返回值也是一个字符串,与函数同名。因此,您过去将搜索结果分配给
rng
,现在我将分配给
Find\u Bad\u Replace\u Good
,这将是函数的返回值


我还使用将您的
更改为使用ActiveSheet
,因为您已经没有选择了。只需将其更改为您想要的范围。

以下假设您已为“大列表”指定了一个具有工作簿范围的名称。此操作非常简单,只要在选定单元格范围时在地址栏左侧的“名称”框中键入有效名称即可。为了向后整合,我将使用名称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

函数不能更改单元格所在区域以外的任何单元格。您可以将其编写为接受参数的子对象。谢谢你的快速回复。我只想让它改变它所在单元格的值,我想用这个函数来自动填充这个范围。我只需要它所在的单元格中的值根据它是否是我的大列表中某个单词的子字符串而改变,该大列表在列B中。如果函数在单元格中,则必须引用另一个单元格中的值或将其硬编码到函数调用中。然后,它可以将替代值返回到它所在的单元格中。啊,好的。我不确定如何解决这个问题,因为子程序太慢,导致工作簿冻结。如果有一种方法可以引用函数参数中的a列,那么我有两个参数也可以使用► 具有工作簿作用域的名称管理器)将更有效地引用“大列表”。您的
.Range
.Cells
似乎没有父单元格。vList会像Jeeped提到的那样将“大列表”硬编码到函数中吗?你是对的,@Jeeped@mrL,是的,您可以在vList中硬编码范围,或者您可以将另一个参数传递给函数,一个范围,然后使用它。像
函数Find\u Bad\u Replace\u Good(inputValue作为字符串,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