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 方法时收到此错误 -

在我的例子中,问题在于我的变量 Seting 不是函数顶部的 Dimd。

我的例子

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 编译错误 - 参数不是可选的,的主要内容,如果未能解决你的问题,请参考以下文章

编译错误:参数不是可选的

访问编译错误:参数不是可选的

VBA:右键单击用户表单

(Excel)带有可选参数的vba程序将无法启动

VBA:将二维数组传递给集合函数[重复]

VBA 可选参数