1

我正在使用 SmartyStreets API,我正在尝试测试响应以查看“delivery_line_2”字段中是否有值。尝试运行代码时,我在 VBA for Excel 中不断收到变量未定义错误。有人对最好的方法提出建议吗?我正在使用以下代码尝试访问:

    Dim candidates, candidate, components, metadata, analysis As MSXML2.IXMLDOMNode
    Set candidates = xmlDoc.DocumentElement
    
    For Each candidate In candidates.ChildNodes
        Set components = candidate.SelectSingleNode("components")
        Set metadata = candidate.SelectSingleNode("metadata")
        Set analysis = candidate.SelectSingleNode("analysis")

        Cells(RowIndex, DPVColumn).Value = analysis.SelectSingleNode("dpv_match_code").nodeTypedValue
        Cells(RowIndex, DPVColumn + 1).Value = components.SelectSingleNode("zipcode").nodeTypedValue & "-" & components.SelectSingleNode("plus4_code").nodeTypedValue
        Cells(RowIndex, DPVColumn + 2).Value = candidate.SelectSingleNode("delivery_line_1").nodeTypedValue
        **If Len(candidate.SelectSingleNode("delivery_line_2").nodeTypedValue) > 1 Then
            Cells(RowIndex, DPVColumn + 3).Value = candidate.SelectSingleNode("delivery_line_2").nodeTypedValue
        End If**

谢谢。

4

1 回答 1

1

SmartyStreets警告您并非每次都返回所有数据。这几乎适用于任何看起来的事情,尽管有些回报往往存在,而其他的则不然。delivery_line_2往往不归还。在这种情况下,尝试获取该值可能会引发 an Error 91 "Object variable or with block variable not set",因为它不存在。因为它甚至还没有被实例化,所以最简单的测试,如IsEmpty, IsError,IsMissing等都无法检查这一点。它添加了很多代码,但最好的办法是首先设置一个等于 XML 返回的引用部分的变量,就像使用元数据一样。也为delivery_line_2 执行此操作。如果引用不在返回中,则变量将设置为"Nothing". 由于某种原因,这不会引发错误。现在您可以测试变量:

Set DeliveryLine2 = candidate.SelectSingleNode("delivery_line_2")  'Note lack of nodeTypedValue
    
If Not DeliveryLine2 Is Nothing Then
    
  Cells(RowIndex, DPVColumn + 3).Value = candidate.SelectSingleNode("delivery_line_2").nodeTypedValue
    
End If

除了测试返回的每一部分之外,您还需要认识到这些部分并不总是存在,并使用您的代码正确处理它。SmartyStreets 会告诉您这一点,但是他们对诸如此类的网站上的大量帮助的引用有点薄弱。我在 Access 2010 中完成了我的工作,但它仍然是 VBA。

于 2014-01-09T15:06:31.747 回答