将子例程转换为函数

时间:2015-09-17 01:03:08

标签: excel vba

我有以下子程序,它在A列中取一个预定义的字符串列表(称之为我的大列表),并且根据另一列中的字符串是否是我的大列表中某个字符串的子字符串,它取代了它。如果没有匹配,它就不会做任何事情(只是将字符串保留原样)。

System.ArgumentNullException: Argument cannot be null.
Parameter name: s
  at System.DateTime.ParseExact (System.String s, System.String[] formats, IFormatProvider provider, DateTimeStyles style) [0x00013] in /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System/DateTime.cs:1882 
  at System.DateTime.ParseExact (System.String s, System.String format, IFormatProvider provider, DateTimeStyles style) [0x0001c] in /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System/DateTime.cs:1870 
  at System.DateTime.ParseExact (System.String s, System.String format, IFormatProvider provider) [0x00000] in /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System/DateTime.cs:1030 
  at Parse.Internal.ParseDecoder.ParseDate (System.String input) [0x00000] in <filename unknown>:0 
  at Parse.ParseObject.MergeMagicFields (IDictionary`2 data) [0x00000] in <filename unknown>:0 
  at Parse.ParseObject.MergeFromServer (IDictionary`2 data) [0x00000] in <filename unknown>:0 
  at Parse.ParseObject.MergeAfterFetch (IDictionary`2 result) [0x00000] in <filename unknown>:0 
  at Parse.Internal.ParseDecoder.Decode (System.Object data) [0x00000] in <filename unknown>:0 
  at Parse.Internal.ParseDecoder.Decode (System.Object data) [0x00000] in <filename unknown>:0 
  at Parse.Internal.ParseCloudCodeController.<CallFunctionAsync>b__0[ParseObject] (System.Threading.Tasks.Task`1 t) [0x00000] in <filename unknown>:0 
  at Parse.Internal.InternalExtensions+<>c__DisplayClass1`2[System.Tuple`2[System.Net.HttpStatusCode,System.Collections.Generic.IDictionary`2[System.String,System.Object]],Parse.ParseObject].<OnSuccess>b__0 (System.Threading.Tasks.Task t) [0x00000] in <filename unknown>:0 
  at Parse.Internal.InternalExtensions+<>c__DisplayClass7`1[Parse.ParseObject].<OnSuccess>b__6 (System.Threading.Tasks.Task t) [0x00000] in <filename unknown>:0 
  at System.Threading.Tasks.Task+<>c__DisplayClass3`1+<>c__DisplayClass5[System.Threading.Tasks.Task`1[Parse.ParseObject]].<ContinueWith>b__2 () [0x00000] in <filename unknown>:0 

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

2 个答案:

答案 0 :(得分:0)

我还没有检查过你的其余代码,因为我在这里没有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_Bad_Replace_Good,这将是您功能的返回值。

我还将您的with更改为With ActiveSheet,因为您不再有选择权。只需将其更改为您想要的范围。

答案 1 :(得分:0)

以下假设您已经提供了大列表&#39;具有工作簿范围的名称。在选择单元格范围时,此操作就像在地址栏左侧的名称框中键入有效名称一样简单。为了向后整合,我将使用名称 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