VBA - 为什么这段代码需要' CALL'声明

时间:2014-10-23 06:41:35

标签: vba class call

我有以下代码从网页收集数据。我的问题是为什么代码工作'正如我所期待的那样,CALL'陈述,但没有它就没有工作......

    Dim matchURL            As String
    Dim FixtureDetailsTab   As HTMLTable

    For Each match In FixtureCollection
        matchURL = match.getMatchURL
    '
    '  Load up the match table
    '
        oXML.Open "GET", matchURL, False
        oXML.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
        oXML.send

        Set htmlDoc = New MSHTML.HTMLDocument
        Set htmlBody = htmlDoc.body
        htmlBody.innerHTML = oXML.responseText
    '
    '  And once again look for the elements with class 'engineTable'
    '  (only interested in the first one)
    '
        Set Elements = htmlDoc.getElementsByClassName("engineTable")
        For Each element In Elements
            Set FixtureDetailsTab = element
            Exit For
        Next element

        Call match.addDetails(FixtureDetailsTab)

    Next match

匹配是一个单独的类模块中的自定义类,并且' addDetails'定义如下

    Public Sub addDetails(detailTab As HTMLTable)
        ....
    End Sub

上面的代码有效,但如果我删除了调用语句,只是尝试调用Sub,如下所示

    match.addDetails (FixtureDetailsTab)

我得到了'运行时错误13' - 类型不匹配

我很困惑。任何帮助表示赞赏。

由于

1 个答案:

答案 0 :(得分:2)

在VBA中调用function / sub时,有两种选择:

  1. 使用CALL并将参数列表括在括号中

     CALL MySub(param1, param2, param3)
    
  2. 或省略CALL并省略括号

     MySub param1, param2, param3
    
  3. 任何参数都可以是表达式,它本身包含或括在括号中:

    MySub param1, (param2 + 2), param3
    

    在没有CALL的示例中,您传递的是一个参数,该参数是括在括号中的表达式:

    match.addDetails (FixtureDetailsTab)
    

    在VBA中,enclosing an object in parentheses will typically return the default property of that object

    因此,您试图将FixtureDetailsTab的默认属性传递给您的方法,从而导致类型不匹配。

    如果添加CALL语句,括号将被解释为CALL语法的一部分,FixtureDetailsTab将作为参数传递,正如您所期望的那样。

    这种迷人的不一致是VB is loved so much

    的部分原因