2012-11-29 5 views
0

나는이 매크로를 만들어 나는런타임 오류 '13'VBA 매크로 엑셀

Set objDomAttribute = objDomElement3.Attributes.setNamedItem(objDomDoc.createAttribute("Name4")) 

내 엑셀 파일은 2727 개 행이 라인에서 런타임 오류 '13'를 얻을. 적은 수의 행으로 테스트했는데 완벽하게 작동하지만 2727에서는 작동하지 않습니다. 그 문제를 해결하기 위해 무엇을해야합니까?

Option Explicit 
Public Sub MakeXMLWithDom() 

Dim Q As String 
Q = Chr$(34) 

Dim objDomDoc As New MSXML2.DOMDocument60 

objDomDoc.LoadXML ("<?xml version=" & Q & "1.0" & Q & "encoding=" & Q & "utf-8" & Q & "?>") 

Dim objDomElement As MSXML2.IXMLDOMElement 
Dim objDomAttribute As MSXML2.IXMLDOMAttribute 
Dim nodeSet As MSXML2.IXMLDOMNodeList 

Set objDomElement = objDomDoc.createElement("Containers") 
Set objDomElement = objDomDoc.appendChild(objDomElement) 

'finding the amount of rows in the excel 
Dim numofrows As Long 
numofrows = Worksheets("EXAMPLE").Range("E1").Offset(Worksheets("EXAMPLE").Rows.Count - 1, 0).End(xlUp).Row 

Dim iRow As Integer 

Dim Value11 As Variant 
Dim Value12 As Variant 
Dim Value13 As Variant 

Dim objDomElement1 As Variant 
Dim objDomElement2 As Variant 
Dim objDomElement3 As Variant 

For iRow = 10 To (numofrows + 1) 

    If Worksheets("EXAMPLE").Cells(iRow - 1, 5) = Worksheets("EXAMPLE").Cells(iRow, 5) Then 
     Value11 = Worksheets("EXAMPLE").Cells(iRow - 1, 11).Value & ", " & Worksheets("EXAMPLE").Cells(iRow, 11).Value 
     Value12 = Worksheets("EXAMPLE").Cells(iRow - 1, 12).Value & ", " & Worksheets("EXAMPLE").Cells(iRow, 12).Value 
     Value13 = Worksheets("EXAMPLE").Cells(iRow - 1, 13).Value & ", " & Worksheets("EXAMPLE").Cells(iRow, 13).Value 
    Else 
     Value11 = Worksheets("EXAMPLE").Cells(iRow, 11).Value 
     Value12 = Worksheets("EXAMPLE").Cells(iRow, 12).Value 
     Value13 = Worksheets("EXAMPLE").Cells(iRow, 13).Value 
    End If 

    If Worksheets("EXAMPLE").Cells(iRow, 5) <> Worksheets("EXAMPLE").Cells(iRow + 1, 5) And Worksheets("EXAMPLE").Cells(iRow, 3) <> "" And Worksheets("EXAMPLE").Cells(iRow, 5) <> "" Then 

     Set objDomElement1 = objDomElement.appendChild(objDomDoc.createElement("Data")) 
     Set objDomAttribute = objDomElement1.Attributes.setNamedItem(objDomDoc.createAttribute("Relevant")) 
     objDomElement1.Attributes.getNamedItem("Relevant").Text = "True" 

     Set objDomElement2 = objDomElement1.appendChild(objDomDoc.createElement("Info")) 

     Set objDomElement3 = objDomElement2.appendChild(objDomDoc.createElement("Part")) 
     Set objDomAttribute = objDomElement3.Attributes.setNamedItem(objDomDoc.createAttribute("Name1")) 
     Set objDomAttribute = objDomElement3.Attributes.setNamedItem(objDomDoc.createAttribute("Name2")) 
     Set objDomAttribute = objDomElement3.Attributes.setNamedItem(objDomDoc.createAttribute("Name3")) 
     Set objDomAttribute = objDomElement3.Attributes.setNamedItem(objDomDoc.createAttribute("Name4")) 

     objDomElement3.Attributes.getNamedItem("Name1").Text = Trim$(Worksheets("EXAMPLE").Cells(iRow, 5).Value) 
     objDomElement3.Attributes.getNamedItem("Name2").Text = Value11 
     objDomElement3.Attributes.getNamedItem("Name3").Text = Value12 
     objDomElement3.Attributes.getNamedItem("Name4").Text = Value13 

    End If 
Next iRow 

objDomDoc.Save ("c:\Example.xml") 
End Sub 
+3

"유형 불일치"오류입니다. 'Dim '을 사용하여 변수의 * all *을 선언하면이 오류의 원인을 찾는 데 도움이됩니다. 예를 들어'objDomElement3'을 선언하지 않았습니다. 모듈의 맨 위에'Option Explicit'을 쓰면 항상 모든 변수에 대해 이렇게해야합니다. –

+0

Mr. Corbett, 귀하의 충고를 듣고 Option Explicit를 추가하고 objDomElements를 선언했지만 여전히 같은 줄에 같은 오류가 있습니다. – Maggie11

+0

디버그 모드에서 코드를 단계별 실행하면 지역 창을보십시오. 그 행에 포함 된 모든 변수의 유형은 무엇입니까? 예상대로입니까? –

답변

2

당신은 지역 창에서 Value13Value: Error 2015Type: Variant/Error으로 표시 말한다. 음, 알았어. 계속 조사해 ... Value13은 어디에서 왔니? Excel 시트에서 해당 줄을보십시오. 거기에 #VALUE! 오류가 표시 될 것입니다.

입력 데이터에는 문제가 있으므로 코드에는 문제가 있습니다. 문제를 해결하면 문제가 해결됩니다.

+0

코벳 씨, 도와 주셔서 감사합니다. 나는 모든 것을 선언하는 것에 대한 당신의 충고를 염두에 둘 것입니다! 나는 해결책을 찾았지만 아직도 그것을 얻지 못한다. 방금 Value13을 String이 아닌 Variant로 선언했습니다. Variant는 모든 유형의 값에 사용됩니다. 왜 그때는 효과가 없었습니까? :) – Maggie11

+0

'Error' 값을 암시 적으로'String' 유형 변수에 저장하려고 시도했기 때문입니다. 'String'에 대한 암시 적 형변환은 일부 데이터 유형에서는 작동하지만 모든 데이터 유형에서는 작동하지 않습니다. 특히 'Error'가 아닙니다. 원한다면,'CStr()'사용자에게 명시 적으로 캐스트를 수행 할 수 있지만 입력 데이터에서 오류를 제거하는 것이 더 좋지는 않습니다 ... P.S. 위의 질문에 대한 마지막 코멘트를 보았습니까? –