我有以下代码从网页收集数据。我的问题是为什么代码工作'正如我所期待的那样,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' - 类型不匹配
我很困惑。任何帮助表示赞赏。由于
答案 0 :(得分:2)
在VBA中调用function / sub时,有两种选择:
使用CALL并将参数列表括在括号中
CALL MySub(param1, param2, param3)
或省略CALL并省略括号
MySub param1, param2, param3
任何参数都可以是表达式,它本身包含或括在括号中:
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。
的部分原因