字符串值的用户输入要求

时间:2014-03-25 14:19:09

标签: vba excel-vba excel

好吧,我正在尝试创建一个用户定义的函数,它将接受一个字符输入,然后返回String。虽然我无法使Char数据类型适用于VBA(不知道为什么?)但是如果我将单个字符值输入为String,我能够正常工作。

目前,当UDF在Excel中运行时,只要在String输入周围放置引号,它就会起作用,如下所示:

=tradeClass("o")

将起作用并返回正确的结果。但我真正想做的是能够以这种方式编写Excel函数:

=tradeClass(o)

我写出了将连接的代码""在我的用户输入的末尾:

Public Function tradeClass(class As String)
    Dim result As String
    Dim before As String
    Dim after As String

    before = """"
    after = """"

    class = before & class & after  'my attempt to concatenate " on either side of the class input
    Select Case LCase(class)
        Case "s"
            result = "Sale"
        Case "r"
            result = "Redemption"
        Case "i"
            result = "Exchange In"
        Case "o"
            result = "Exchange Out"
        Case "x"
            result = "Ignore"
        Case "k"
            result = "Settle"
        Case "m"
            result = "Transfer"
        Case "w"
            result = "ML PR3 Redemption (No longer in use)"
        Case Else
            result = "Invalid Entry"

    End Select

    tradeClass = result

End Function

它在Excel中返回#VALUE!错误,因此我开始认为我将始终使用我的角色输入引号。是这种情况吗?

3 个答案:

答案 0 :(得分:2)

我无法想象你有什么令人信服的理由想要这样做。如果你真的有决心,那就有一个黑客/解决方法/克服可以让它发挥作用。

我强烈建议你不要使用它,但你问了一个我有答案的问题。所以这里:


当您将未加引号的字符串传递给Excel中的函数时,它会假定它是对另一个单元格的引用。这在函数调用中很明显,例如=tradeClass(A1)。该函数将单元格A1的值传递给函数tradeClass。

Excel还支持命名单元格以使公式更易于遵循。例如,您可以将名称“StartYear”指定给单元格A1。因此,您可以使用=DATE(A1, 1, 1)而不是使用=DATE(StartYear, 1, 1),而这将更容易维护。

现在,在您的情况下,我们可以滥用此权力并命名一堆单元格srioxkmw。在名为s的单元格中,我们将输入字母“s”作为单元格的值,依此类推。因此,当您调用=tradeClass(o)时,Excel将查找名为o的单元格并获取其值(我们设置为“o”)并传递名为{{1的单元格的值“o”你的tradeClass函数。


这是对Excel的单元命名功能的可怕滥用,并且违反了各种良好的编程习惯。但是问,你会收到。

免责声明:请不要实际使用它。

最后一点说明:有一天某人出现并将名为o的单元格的值更改为字母“s”时,请参阅上述免责声明。

答案 1 :(得分:0)

不幸的是,如果您希望此函数按指定的方式处理用户输入,那么您将需要传入引号。尝试内置的Excel功能,例如:

=LEN(String)

VS

=LEN("String")

第二个给你6,而第一个给你一个错误。

但是,如果你所追求的交易类在他们自己的专栏中,你的代码会很好地运作,如下所示:

enter image description here

Public Function tradeClass(Str As Variant)

Str = CStr(Str) 'force the variant to a string

    Select Case LCase(Str)
        Case "s"
            result = "Sale"
        Case "r"
            result = "Redemption"
        Case "i"
            result = "Exchange In"
        Case "o"
            result = "Exchange Out"
        Case "x"
            result = "Ignore"
        Case "k"
            result = "Settle"
        Case "m"
            result = "Transfer"
        Case "w"
            result = "ML PR3 Redemption (No longer in use)"
        Case Else
            result = "Invalid Entry"
    End Select

tradeClass = result

End Function

答案 2 :(得分:0)

我知道这是一个老问题,但是遇到了同样的错误,并且找到了原因,类似的事情对我有用:您应先使用Public Function tradeclass(class),然后再使用class = class.address。希望这会有所帮助!