Excel vba 编译错误 - 参数不是可选的,
Posted
技术标签:
【中文标题】Excel vba 编译错误 - 参数不是可选的,【英文标题】:Excel vba Compile error - Argument not optional, 【发布时间】:2017-09-30 09:41:27 【问题描述】:我正在尝试解决这个问题,但无法解决。
我不断收到错误消息:“编译错误 - 参数不是可选的”。我正在提供参数,它们被设置为可选!
试图将一个字符串和一个数组传递给一个函数,并计算传递的字符串中数组字符串的出现次数。
代码在该行停止运行:
Public Function countTextInText(Optional text As String, Optional toCountARR As Variant) As Integer
带有“编译错误:参数不是可选”消息突出显示该行中的 Val
:
For Each Val In toCountARR
完整代码:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim nameR As Range
Dim colR As Range
Dim TKRcnt As Integer
Dim TKRarr() As Variant
TKRarr = Array("TKR", "THR", "Bipolar")
Dim ORIFcnt As Integer
Dim ORIFarr() As Variant
TKRarr = Array("ORIF", "Ilizarov", "PFN")
Set nameR = Range("P2:P9")
Set colR = Range("B2:B50,G2:G50,L2:L50")
For Each namecell In nameR
For Each entrycell In colR
If entrycell.text = namecell.text Then
TKRcnt = countTextInText(entrycell.Offset(0, 2).text, TKRarr)
ORIFcnt = countTextInText(entrycell.Offset(0, 2).text, TKRarr)
End If
Next entrycell
MsgBox (namecell.text & " TKR count: " & TKRcnt & " ORIF count: " & ORIFcnt)
Next namecell
End Sub
Public Function countTextInText(Optional text As String, Optional toCountARR As Variant) As Integer
Dim cnt As Integer
Dim inStrLoc As Integer
For Each Val In toCountARR
inStrLoc = InStr(1, text, Val)
While inStrLoc <> 0
inStrLoc = InStr(inStrLoc, text, Val)
cnt = cnt + 1
Wend
Next Val
Set countTextInText = cnt
End Function
【问题讨论】:
(a) 哪一行给出了“Argument not optional”错误? (b) 不能Set countTextInText = cnt
,应该是Let countTextInText = cnt
,一般写成countTextInText = cnt
。
错误行是:Public Function countTextInText(Optional text As String, Optional toCountARR As Variant) As Integer
忽略我之前的 (a) 评论,我看到您在 Val
上收到编译错误。 Val
是一个 Excel 函数,需要将强制参数传递给它。如果您希望将其用作变量名,则需要将其声明为变量。但最好选择一个更合适的变量名。 (但无论如何声明变量是一个非常好的主意!)
如果我没记错的话,我认为你需要一个可选参数的默认值。未提供参数时,您期望什么值?
@YowE3K 谢谢伙计,这帮我解决了那个烦人的问题!我如何评价/投票给您的回复? :)
【参考方案1】:
Val
是一个 VBA 函数,它需要一个 强制 参数 - 因此,如果您不提供该参数,编译器会生成消息“Argument not optional”。 (MSDN documentation of Val
)
使用 VBA 函数名作为变量名是个坏主意,因此我建议您不要使用 Val
作为变量名 - 使用 myVal
或其他任何 VBA 尚未使用的名称。
如果您真的想使用Val
(并且您确定根本不需要访问Val
函数),您可以将其用作变量名如果您只是这样声明,例如
Dim Val As Variant
你的台词也会有问题
Set countTextInText = cnt
因为countTextInText
已被声明为Integer
,并且Set
仅应在将变量设置为对对象的引用时使用。所以那条线应该是
countTextInText = cnt
【讨论】:
【参考方案2】:对于那些因为问题标题而迟到的人,就像我一样,在使用 .Find 方法时收到此错误 -
在我的例子中,问题在于我的变量 Set
ing 不是函数顶部的 Dim
d。
我的例子
Sub MyTest()
Dim tst, rngAll
rngAll = [a1].CurrentRegion
tst = fnFix1Plus1InValues(ByVal rngAll As Range)
End Sub
Public Function fnFix1Plus1InValues(ByVal rngAll As Range) As Boolean
Dim t1, t2, arr, Loc '<=== Needed Loc added here
Set Loc = rngAll.Find(What:="+", LookIn:=xlValues, LookAt:=xlPart, MatchCase:=False)
If Not Loc Is Nothing Then
Do Until Loc Is Nothing
t1 = Loc.Value
If fnContains(t1, "+") Then
'Do my stuff
End If
Set Loc = rngAll.FindNext(Loc)
Loop
End If
End Function 'fnFix1Plus1InValues
【讨论】:
以上是关于Excel vba 编译错误 - 参数不是可选的,的主要内容,如果未能解决你的问题,请参考以下文章