Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.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
Vba 字符串值的用户输入要求_Vba_Excel - Fatal编程技术网

Vba 字符串值的用户输入要求

Vba 字符串值的用户输入要求,vba,excel,Vba,Excel,好的,我正在尝试创建一个用户定义的函数,该函数将接受一个字符的输入,然后返回一个字符串。虽然我不能让Char数据类型为VBA工作(不确定为什么?),但如果我将单个字符值作为字符串输入,我就可以让它正常工作 当前,当UDF在Excel中运行时,只要在字符串输入周围加上引号,它就会工作,如图所示: =tradeClass("o") 这将起作用并返回正确的结果。但我真正想做的是能够以这种方式编写Excel函数: =tradeClass(o) 我编写了将“”连接到用户输入端的代码: Public F

好的,我正在尝试创建一个用户定义的函数,该函数将接受一个字符的输入,然后返回一个
字符串
。虽然我不能让Char数据类型为VBA工作(不确定为什么?),但如果我将单个字符值作为
字符串输入,我就可以让它正常工作

当前,当UDF在Excel中运行时,只要在字符串输入周围加上引号,它就会工作,如图所示:

=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函数,例如:

=LEN(String)
vs

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

但是,如果您所关注的交易类位于它们自己的列中,那么您的代码将很好地工作,如下所示:

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


我无法想象你为什么要这么做。如果你真的下定决心了,那么有一个黑客/解决方法/难题可以让它发挥作用

我强烈建议你不要用这个,但你问了一个问题,我有答案。下面是:


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

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

现在,在你的情况下,我们可以滥用这一权力,命名一组细胞
s
r
i
o
x
k
m
,和
w
。在名为
s
的单元格中,我们将输入字母“s”作为单元格的值,依此类推。因此,当您调用
=tradeClass(o)
时,Excel将查找名为
o
的单元格并获取其值(我们将其设置为“o”),然后将名为
o
的单元格的值“o”传递给您的tradeClass函数


这是对Excel单元命名功能的严重滥用,违反了各种良好的编程实践。只要你开口,你就会得到

免责声明:请不要实际使用这个。
最后一点注意:有一天,当有人出现并将名为
o
的单元格的值更改为字母“s”时,请参阅上述免责声明。

我知道这是一个老问题,但也遇到了同样的错误,并找到了原因,类似的事情对我起了作用:您应该使用
公共函数tradeclass(class)
然后
class=class.address
。希望这有帮助

即使是excel中以
字符串作为输入的内置函数也必须包含引号,因此我认为这是不可能的:(对,这正是我开始怀疑的。我将不得不接受引号。简单的人如果你想把它作为一个答案,我可以接受它谢谢你的好意,但我认为这更多的是一个评论而不是一个答案。也许有人会找到一个解决办法:)这并没有回答问题,只是陈述了一个事实。我很抱歉@simpLEMAn,看起来我们都指向了内置的Excel函数。不用担心,只要确保你的答案实际上是对OP问题的回答。你很快就可以写评论了;还有27分:)现在一切都有意义了。我绝对不会这样做。感谢您解释为什么Excel需要为字符串加引号,如果它假定单元格引用,则不需要加引号。这就是我一直在寻找的答案,尽管我问的时候没有意识到。顺便说一句,你有没有想过为什么VBA不让我将输入设置为Char类型?不管我最后的评论是什么,VBA似乎没有Char类型的数据。我发现这里列出了灵长类数据类型@AdamJ:很高兴我能帮上忙。我更高兴的是你不用这个!
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