【问题标题】:VBA Function gets "Argument Not Optional" errorVBA 函数得到“参数不是可选的”错误
【发布时间】:2016-09-25 04:42:40
【问题描述】:

我正在尝试修复使用 Selenium1.0.23 打开站点并登录的 VBA。我的客户说一切正常,除了 VBA 必须输入错误的用户名和密码,因为该站点提供了错误的用户名和密码消息。 现在我得到了脚本并尝试运行它,但我被困在给出“Argument Not Optional”的函数上。下面是脚本:

这是有错误的部分。它突出显示“.setVariation”部分。

Private Function setVariationOnPage(browser As SeleniumWrapper.WebDriver, variations As Scripting.Dictionary) As Long
Dim name
For Each name In variations.keys
    ProductVariations.setVariation browser, variations(name)
Next name 
End Function

我相信上面的函数是在一个单独的模块上调用另一个函数,因为其中有一个模块名称 ProductVariations 和一个名为 setvariation 的函数。

Public Function setVariation(browser As SeleniumWrapper.WebDriver, ByVal name As String, value As String)
On Error GoTo setVariationError

Dim li As WebElement
Dim lis As Collection

Set lis = getVariationListItems(browser, name)
If lis Is Nothing Then
    GoTo setVariationError
    Exit Function
End If


For Each li In lis

    Dim link As WebElement
    Set link = getLinkFromVariationListItem(li)

    If LCase(Trim(getVariationValueNameFromListItem(li))) = LCase(Trim(value)) Then
        If InStr(li.getAttribute("class"), "active") = 0 Then
            link.Click
            ScrapingUtil.waitForPageToLoad browser
            If InStr(li.getAttribute("class"), "active") = 0 Then
                GoTo setVariationError
            End If
        End If
        Exit Function
    End If
Next li

setVariationError:
Dim msg As String
msg = "Unable to set variation: ""{name}"" = ""{value}"""
msg = Replace(msg, "{name}", name)
msg = Replace(msg, "{value}", value)
Err.Description = msg
Err.raise 1
End Function

那么显然这个函数调用了另一个函数,而那个函数又调用了另一个函数。解决问题太麻烦了,我真的需要帮助。

【问题讨论】:

  • setvariation 函数需要传递 3 个参数。根据上面它传递两个browser, variations(name).
  • 基于键被称为“名称”的事实,也许调用应该是ProductVariations.setVariation browser, name, variations(name)
  • 如果第三个参数不需要将其设为可选Public Function setVariation(browser As SeleniumWrapper.WebDriver, ByVal name As String, optional value As String)
  • @fakedad tnx 试图提供帮助。
  • 将第三个参数设为Optional 似乎不是正确的解决方案。它当然可以避免编译时错误,但很可能会导致运行时问题(请参阅我的 cmets @HA560 答案)。我认为您必须尝试理解 value 参数角色并有意识地传递它。我会先用 fakedad 提议去

标签: vba excel function selenium-webdriver arguments


【解决方案1】:

将参数设为可选..

 Public Function setVariation(browser As SeleniumWrapper.WebDriver, ByVal name As String, optional value As String).

【讨论】:

  • value 参数用于If LCase(Trim(getVariationValueNameFromListItem(li))) = LCase(Trim(value)) Then。将其设为Optional 将在任何时候调用该函数而不传递第三个参数(如ProductVariations.setVariation browser, variations(name))将其设置为空字符串"",因此该检查将始终可能导致False 这样永远不会触发其内部的代码If-Then-Else
  • 除了提问者之外,还有很多人会访问这个网站。因此,虽然后者可能主要根据其有用性来评价答案,但其他用户会根据其准确性和完整性来评价它,有利于所有会碰到这篇文章的用户。
猜你喜欢
  • 1970-01-01
  • 2014-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
相关资源
最近更新 更多