2016-11-28 11 views
2

私はVBで書かれたマクロにms excelを使用しています。私はxmlファイルを読んでいます。以下のxmlの例を参照してください。Excelマクロで欠落しているXMLノードを処理する方法

<document> 
    <element> 
    <fname></fname> 
    <age></age> 
    </element> 
    <element> 
    <fname></fname> 
    </element> 
</document> 

年齢= Nothingの場合は動作しません。私は、 "オブジェクトはプロパティまたはメソッドをサポートしていません"と設定しています。下のマクロコードの例を参照してください。

Sub TestXML() 
Dim mainWorkBook As Workbook 
Set mainWorkBook = ActiveWorkbook 

mainWorkBook.Sheets("Sheet1").Range("A:E").Clear 

Dim XDoc As Object 
Set XDoc = CreateObject("MSXML2.DOMDocument") 

XDoc.async = False 
XDoc.validateOnParse = False 
XDoc.Load ("C:\MyUnzipFolder\XML_test.XML") 

Set fname= XDoc.SelectNodes("/Document/element/fname/text()") 
Set age = XDoc.SelectNodes("/Document/element/age/") 

If age Is Nothing Then 
     MsgBox ("element not found.") 
    Else 
     MsgBox ("element found.") 
End If 

Set XDoc = Nothing 
End Sub 

答えて

1

"要素/年齢" で終わると "文書" で始まるすべてのパス:あなたのコメントを読んだ後

Dim ages As IXMLDOMSelection 
Set ages = XDoc.SelectNodes("/document//element/age") 

' Add reference to Microsoft XML, v6.0 

Sub TestXML() 

    Dim XDoc As MSXML2.DOMDocument 
    Set XDoc = New MSXML2.DOMDocument 

    XDoc.async = False 
    XDoc.validateOnParse = True 

    If Not XDoc.Load("c:\MyUnzipFolder\XML_test.XML") Then 
     MsgBox XDoc.parseError.reason, vbOKOnly, "Error " & XDoc.parseError.ErrorCode 
     Exit Sub 
    End If 

    ' all paths that end in element 
    Dim elements As IXMLDOMSelection 
    Set elements = XDoc.SelectNodes("//element") 

    Dim element As IXMLDOMElement 
    Dim age As IXMLDOMElement 

    ' loop through each element and try getting its age 
    Dim r As Long 
    For Each element In elements 
     r = r + 1 
     Set age = element.SelectSingleNode("age") 
     If Not age Is Nothing Then 
      ' element has age sub element, print its text 
      ActiveSheet.Cells(r, 1).Value = age.Text 
     Else 
      ' if nothing then keep cell blank 
      ActiveSheet.Cells(r, 1).Value = "blank" 
     End If 
    Next element 

    Set XDoc = Nothing 
End Sub 

XML_test。 XML

<?xml version="1.0" encoding="utf-8"?> 
<document> 
    <element> 
    <fname></fname> 
    <age>10</age> 
    </element> 
    <element> 
    <fname></fname> 
    </element> 
    <element> 
    <age>40</age> 
    <fname></fname> 
    </element> 
    <element> 
    <fname></fname> 
    <age>20</age> 
    </element> 
    <element> 
    <fname></fname> 
    </element> 
    <element> 
    <fname></fname> 
    </element> 
    <element> 
    <fname></fname> 
    </element> 
    <element> 
    <fname></fname> 
    <age>30</age> 
    </element> 
    <element> 
    <fname></fname> 
    </element> 
</document> 

結果

enter image description here

+0

まだそれが仕事を得ることができます。私はあなたの以前の提案だけでなく、運を試してみました。私はスプレッドシートの列にバリュー年齢を表示しようとしています。何もしない場合は、セルを空白にしてください。 – Jag

+0

別のテストを行いました。私は次のエラーで再開しようとしました。それはfname列100行を入力し、ノードは80で満たされなくなります(ノードが1つだけ欠落しています)。技術的な年齢のループは1つの行をスキップしてから投入を開始する必要があります。エラーが発生した後に残りの部分が空白になります。それ以上のアイデア? – Jag

+0

@Jag - コード内のXPathで 'age'の後に'/'を削除しましたか?それが原因であるかどうかは分かりませんが、その場合は... –

関連する問題