2017-01-17 2 views
3

Ich bin ein technischer Schriftsteller und nicht viel von einem Coder, ich habe Tausende von. XML-Dateien, die kombiniert ein Buch zu erstellen. Ich habe ein VBA-Skript von dieser Website verwendet, um alle Dateien umzubenennen, damit sie in die neuen Richtlinien passen. Jetzt muss ich in den XML-Code gehen und alle Referenzen zu diesen Links finden und sie durch den neuen Dateinamen ersetzen.Wie ändere ich mehrere Referenz-Tags in XML basierend auf Tabellenwerten

Ich habe eine Excel-Tabelle, in Spalte A hat es den alten Dateinamen und in Spalte B hat es den neuen Dateinamen.

Der Tag sieht wie folgt aus:

<?iads.link docref="R381"?> 

Es braucht "R381" in Spalte A zu finden und ersetzen Sie es mit "R01081-1-1520-237", der Dateiname in der benachbarten Zelle in Spalte B

Der Tag muss wie folgt aussehen:

<?iads.link docref="R01081-1-1520-237"?> 

ich den Code von der Frage versucht, mit How can I Find/Replace multiple strings in an xml file? aber es hat nicht funktioniert und ich bin nicht einmal sicher, ob das ist die richtige Frage

Meine aktuellen Code zu fragen, sieht dies liegen:

Option Explicit ' Use this ! 

Public Sub ReplaceXML(rFindReplaceRange As Range) ' Pass in the find-replace range 

    Dim sBuf As String 
    Dim sTemp As String 
    Dim iFileNum As Integer 
    Dim sFileName As String 
    Dim i As Long 

    ' Edit as needed 
    sFileName = "C:\Users\s37739\Desktop\chap3" 

    iFileNum = FreeFile 
    Open sFileName For Input As iFileNum 

    Do Until EOF(iFileNum) 
     Line Input #iFileNum, sBuf 
     sTemp = sTemp & sBuf & vbCrLf 
    Loop 

    Close iFileNum 

    ' Loop over the replacements 
    For i = 1 To rFindReplaceRange.Rows.Count 
     If rFindReplaceRange.Cells(i, 1) <> "" Then 
      sTemp = Replace(sTemp, rFindReplaceRange.Cells(i, 1), rFindReplaceRange(i, 2)) 
     End If 
    Next i 

    ' Save file 

    iFileNum = FreeFile 

    ' Alter sFileName first to save to a different file e.g. 
    sFileName = "C:\Users\s37739\Desktop\chap3" 
    Open sFileName For Output As iFileNum 

    Print #iFileNum, sTemp 

    Close iFileNum 

End Sub 
Sub mike1() 

End Sub 
+0

Können Sie uns sagen, mehr darüber, warum die referenzierte Code nicht für Sie arbeiten? Was sind die Probleme mit dem Code, die Sie nicht lösen konnten? Erhalten Sie Fehler? –

+0

Wenn ich F5 drücke, um das Skript auszuführen, passiert nichts. Auf dem Umbenennungsskript, das ich ausführte, würde es mich bitten, es in einen Ordner zu richten, in dem sich die Dateien befanden. mit dem find replace script tat es nichts ... deshalb war ich mir nicht sicher ob ich das richtige skript hatte oder nicht. –

+0

Haben Sie die Parameter vom Skript geändert? Das Find/Replace-Skript enthält Werte direkt im Code, z. B. 'sFileName =" C: \ temp \ filelocation.xml "'. Bitte [bearbeiten] (http://stackoverflow.com/posts/41702769/edit) Ihre Frage und fügen Sie Ihren aktuellen Code ein, so dass es einfacher sein wird, zu helfen :) –

Antwort

0

Sie den Dateipfad vorbei, wenn sie in der Tat sollten Sie den vollständigen Dateinamen (Dateipfad und Dateiname) vorbei sein . Sie müssen diese Zeilen bearbeiten

' Edit as needed 
sFileName = "C:\Users\s37739\Desktop\chap3" 

'... 

' Alter sFileName first to save to a different file e.g. 
sFileName = "C:\Users\s37739\Desktop\chap3" 

Mit

' Edit as needed 
sFileName = "C:\Users\s37739\Desktop\chap3\yourfilename.xml" 

'... 

' Alter sFileName first to save to a different file e.g. 
sFileName = "C:\Users\s37739\Desktop\chap3\yourNEWfilename.xml" 

Denken Sie auch daran den richtigen Bereich zu liefern, wenn die Prozedur ausgeführt wird. Gesetzt Ihre Reichweite geht von „A1: B50“ Sie mike1 Unter bearbeiten können wie folgt:

Sub mike1() 
    ' Change range as desired 
    Call ReplaceXML(ThisWorkbook.Worksheets("YourSheetName").Range("A1:B50")) 
End Sub 

Danach wird alles, was Sie tun müssen, mike1 aus dem Direkt-Fenster ausgeführt wird.
Zugriff mit Alt + F11 für den VBA-Editor dann Ansicht -> Sofort.
Sie sollten ein neues Fenster am unteren Bildschirmrand sehen. Geben Sie einfach mike1 dort und traf Geben Sie


UPDATE:
Im Idealfall sollten Sie zunächst versuchen, den Code zu verstehen, Sie haben derzeit und ändern Sie es anstelle eines einzelnen auf mehrere Dateien funktioniert pro Lauf. Es gibt viele Orte in der Umgebung, die Ihnen Beispiele geben können, wie Sie das tun, entweder rekursiv oder in einer Schleife direkt in eine Funktion. Es gibt viele Möglichkeiten, es zu tun und auch viele Materialien um es herum.

Das gesagt, Sie können unten einen der vielen Ansätze finden, um Ihr Problem zu lösen. Der folgende Code besteht aus zwei Sub s, die Sie in Ihr Modul kopieren/einfügen können.

Sie müssen den Wert von HOST_PATH mit dem Hauptordner und findReplaceRange mit dem Bereich ändern, mit dem Sie arbeiten.Sie müssen "Sheet1" mit dem Namen Ihres Arbeitsblatts und "A1:B10" mit Ihrem tatsächlichen Bereich ändern. Danach starten Sie einfach die ReplaceXML2() Sub.

Hinweis: diese aktualisiert alle XML-Dateien unter dem Ordner zur Verfügung gestellt, so stellen Sie sicher, dass Sie es genug Tests gab (vorzugsweise ein Backup Ihrer Dateien), bevor er für den gesamten Ordner ausgeführt wird. Wenn Sie weitere Probleme haben, schlage ich vor, eine andere Frage zu stellen.

Code:

Public Sub ReplaceXML2() 

    Const HOST_PATH = "C:\Users\s37739\Desktop\chap3\" ' change accordingly 
    Dim findReplaceRange As Range 
    Set findReplaceRange = ThisWorkbook.Worksheets("Sheet1").Range("A1:B10") ' change accordingly 

    Dim FileSystem As Object 
    Set FileSystem = CreateObject("Scripting.FileSystemObject") 
    Call RecursivelyReplaceXML(FileSystem.GetFolder(HOST_PATH), findReplaceRange) 

End Sub 

Public Sub RecursivelyReplaceXML(parentFolder, rFindReplaceRange As Range) ' Pass in the folder and the find-replace range 

    Dim subFolder As Object 
    For Each subFolder In parentFolder.SubFolders 
     RecursivelyReplaceXML subFolder, rFindReplaceRange 
    Next 

    Dim file As Object 
    For Each file In parentFolder.Files 

     If Right(file.Name, 4) = ".xml" Then 

      Dim iFileNum As Integer 
      Dim sTemp As String 
      Dim sBuf As String 
      Dim i As Long 
      Dim fullFileName As String 

      fullFileName = file.Path 
      iFileNum = FreeFile 
      Open fullFileName For Input As iFileNum 

      sTemp = "" ' clean up to read the next file 
      Do Until EOF(iFileNum) 
       Line Input #iFileNum, sBuf 
       sTemp = sTemp & sBuf & vbCrLf 
      Loop 

      Close iFileNum 

      ' Loop over the replacements 
      For i = 1 To rFindReplaceRange.Rows.count 
       If rFindReplaceRange.Cells(i, 1) <> "" Then 
        sTemp = Replace(sTemp, rFindReplaceRange.Cells(i, 1), rFindReplaceRange(i, 2)) 
       End If 
      Next i 

      ' Save file 
      iFileNum = FreeFile 

      ' WARNING: New name definition commented out, 
      ' which means all files will be replaced with newer versions!! 
      '=== 
      ' Alter fullFileName first to save to a different file e.g. 
      ' fullFileName = "C:\Users\s37739\Desktop\chap3\" 
      Open fullFileName For Output As iFileNum 

      Print #iFileNum, sTemp 

      Close iFileNum 

     End If 
    Next 

End Sub 
+0

Es gibt Tausende von Dateien, auf denen dies ausgeführt werden kann. Ist es möglich, es zu sagen, um die erste Datei zu öffnen, suchen Sie dann die Excel-Liste für REF-Ersatzkandidaten und die Ersetzung dann schließen und speichern und mit der nächsten Datei fortfahren und dasselbe tun, bis es keine Dateien mehr hat? –

+0

Nun ..... ja, Sie können den Code in einer Schleife umgeben, um alle Dateien durchzugehen und die erforderlichen Änderungen vorzunehmen. Sind alle im selben Ordner? –

+0

sie können zu einem konvertiert werden, dann zurück verschoben werden, aber derzeit sind sie in 28 Unterordnern. –

Verwandte Themen