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