2013-07-29 73 views
0

我正在使用SmartStreets API,我试图测试响应以查看“delivery_line_2”字段中是否有值。在尝试运行代码时,我一直收到一个变量在Excel中为VBA取消定义错误。任何人都有最好的方法来做这个建议?我正在使用以下代码尝试访问:在SmartyStreet的API响应中测试“delivery_line_2”

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** 

谢谢。

回答

0

SmartStreets警告您并不是每次都返回所有数据。这看起来确实如此,尽管一些回报往往在那里,其他的并不多。经常不会返回delivery_line_2。当这种情况试图获得该值可能会提高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 

除了测试每一件你必须认识到的作品将不会永远在那里,妥善处理与您的代码的回报。 SmartStreets告诉你这一点,但是他们在这个站点上提供的大量帮助有点弱。我在Access 2010中完成了自己的工作,但仍然是VBA。