2016-04-18 4 views
0
Function Schaltfläche1_Klicken() 

Dim Zeile As Integer 
Zeile = 0 
Dim Node As String 
Dim pfad As String 

Set dlg = Application.FileDialog(msoFileDialogOpen) 
    dlg.Title = "Bitte geben Sie den Pfad an" 
    dlg.ButtonName = "Laden" 
    dlg.Filters.Clear 
    dlg.Filters.Add "XML", "*.xml" 

If dlg.Show Then 
    pfad = dlg.SelectedItems(1) 
End If 

If pfad = "" Then 
    MsgBox "Sie haben keine Datei ausgewählt." 
End If 

Set xmlDoc = CreateObject("Microsoft.XMLDOM") 
    xmlDoc.SetProperty "SelectionLanguage", "XPath" 
    xmlDoc.Async = False 
    xmlDoc.Load (pfad) 



While Zeile <> 100 
    Zeile = Zeile + 1 

    Node = Cells(Zeile, 1).Value 
    Node = Replace(Node, ".", "/") 

    If Node = "" Then 
     Cells(Zeile, 2).Value = " " 
    Else 
     Set nodeXML = xmlDoc.getElementsByTagName(Node) 

     For i = 0 To nodeXML.Length - 1 
      Cells(Zeile, i + 2).Value = nodeXML(i).Text 

      If nodeXML(i).Text = "" Then 
       MsgBox ("Keinen Wert in Node: " & Node & " (Zeile: " & Zeile & ") gefunden. " & nodeXML(i).Text) 
       End If 

      Next 
    End If 
Wend 

End Function 

Здравствуйте сообщества,VBA Looped MsgBox появляется только один раз

я написал этот простой код, чтобы импортировать XML_Nodes в лист Excel.

Функция должна начинаться каждый раз, когда я нажимаю кнопку Schaltfläche1, а затем отображает диалоговое окно «Файл», чтобы пользователь мог «импортировать» XML-файлы.

Функция теперь переходит к повторению каждого узла, который он может найти в Листе (A-1, до A-X) и записать его в файл excel.

Кодекс до сих пор работает нормально, но:

Я хочу, чтобы сообщение вол всплывал, когда узел пуст. На мгновение он просто появляется один раз.

Надеюсь, вы можете мне помочь.

+0

на первый взгляд, если у вас нет сообщения об ошибке, я не вижу причин, почему она отображает только MsgBox один раз, если у вас есть несколько пустых 'nodeXML (I). Text'. Ваш код выглядит правильно –

+0

Я вижу много необъявленных переменных и ошибок в именах переменных, таких как 'Dim pfas As String', а затем вы используете' pfad = ..'. Я предлагаю вам включить «Инструменты, параметры, Требовать переменную Объявление». –

+0

@PaulOgilvie Я включил опцию и объявил все переменные/исправил опечатку в pfad. Однако это не влияет на ошибку Msg. –

ответ

0

Разница между узломXML пуста (длина = 0) или подпункт пуст (nodeXML(i).Text = "")? Так может быть проверить как:

While Zeile <> 100 
    Zeile = Zeile + 1 

    Node = Cells(Zeile, 1).Value 
    Node = Replace(Node, ".", "/") 

    If Node = "" Then 
     Cells(Zeile, 2).Value = " " 
    Else 
     Set nodeXML = xmlDoc.getElementsByTagName(Node) 
     If (nodeXML.Length = 0) Then 
      MsgBox ("Keinen Wert in Node: " & Node & " (Zeile: " & Zeile & ") gefunden. ") 
     Else  
      For i = 0 To nodeXML.Length - 1 
       If nodeXML(i).Text = "" Then 
        MsgBox ("Keinen Wert in Node(" & i &"): " & Node & " (Zeile: " & Zeile & ") gefunden. " & nodeXML(i).Text) 
       Else 
        Cells(Zeile, i + 2).Value = nodeXML(i).Text 
       End If 
      Next i 
     End If 
    End If 
Wend 
+0

Ps: Правила защитного программирования требуют, чтобы вы писали 'While Zeile <100' –

+0

Да, это не нужно для этого приложения, но, возможно, полезно для Другие люди. Вы должны добавить +1 к i в сообщение об ошибке, поскольку nodeXML.Length выполняет итерацию с 1 и i на 0. –

+0

Я не понимаю, что вы имеете в виду с +1. Цикл for выполняет итерацию с 0 и узлов XML. Я взял цикл из вашего исходного кода. –

0
Function Schaltfläche1_Klicken() 

Dim Zeile As Integer 
Zeile = 0 
Dim Node As String 
Dim pfad As String 

Set dlg = Application.FileDialog(msoFileDialogOpen) 
    dlg.Title = "Bitte geben Sie den Pfad an" 
    dlg.ButtonName = "Laden" 
    dlg.Filters.Clear 
    dlg.Filters.Add "XML", "*.xml" 

If dlg.Show Then 
    pfad = dlg.SelectedItems(1) 
End If 

If pfad = "" Then 
    MsgBox "Sie haben keine Datei ausgewählt." 
End If 

Set xmlDoc = CreateObject("Microsoft.XMLDOM") 
    xmlDoc.SetProperty "SelectionLanguage", "XPath" 
    xmlDoc.Async = False 
    xmlDoc.Load (pfad) 



While Zeile <> 100 
    Zeile = Zeile + 1 

    Node = Cells(Zeile, 1).Value 
    Node = Replace(Node, ".", "/") 

    If Node = "" Then 
     Cells(Zeile, 2).Value = " " 
    Else 
     Set nodeXML = xmlDoc.getElementsByTagName(Node) 
     If (nodeXML.Length = 0) Then 
      MsgBox ("Keinen Wert in Node: " & Node & " (Zeile: " & Zeile & ") gefunden. ") 

     End If 

     For i = 0 To nodeXML.Length - 1 
      Cells(Zeile, i + 2).Value = nodeXML(i).Text 


     Next 
    End If 
Wend 

End Function 

Глупый меня, ошибка, что nodeXML.Length возвращается 0, когда узел был пуст, поэтому для Loop не будет работать, я переработан код, поэтому он работает, и я надеюсь, что вы простите мою немоту ,

+0

Действительно ... выполните код в отладчике ... :-) –

+0

Разница между 'nodeXML' пуста (длина = 0) или (nodeXML (i) .Text = "" '? Так может быть и проверка? –

+0

@PaulOgilvie, но я новичок в vba, поэтому отладчик сначала выглядел как темная магия, но я понял это Да, есть разница, но мы можем игнорировать это по крайней мере для этого приложения, так как пользователь заботится только о полностью пустых узлах. –

Смежные вопросы