2016-07-01 10 views
1

Ich habe komplexe XSD. In Excel-Entwickler, in XML Abschnitt kann ich auf "source" klicken und XSD zu Datenquelle zuordnen, dann Zuordnung von Knoten zu bestimmten Zellen, Zeilen, etc.Excel 2013 - VBA XML-Bindung beim Neustart unterbrochen

Ich kann dann Daten eingeben und exportieren XML wie erwartet, nett. Wenn ich gespeichertes XLS wiederöffne, passiert etwas Seltsames und Excel sagt, dass meine XML-Karte kaputt ist und bittet darum, eine kaputte Karte zu entfernen, und zeigt einen Knoten an, den er für falsch hält. Aber alle Optionen sind grau dargestellt und die einzige Option, ich fand, ist die Karte über VBA zu entfernen,

ActiveWorkbook.XmlMaps("JPK_mapa").Delete 

Aber wenn Karte entfernt werden alle Zuordnungen sind verschwunden und ich habe Karte erneut hinzufügen und manuell alle Zuordnungen tun. Es ist nicht schwer für mich, aber normale Benutzer können Probleme damit haben und ich möchte ihnen einfach XLS geben, um mit den Daten zu füllen.

Ich kann XSD nicht ändern, habe keinen Einfluss auf seinen Inhalt, also nahm ich an, dass ich damit leben und Excel lehren muss, diese Zuordnung irgendwie zu entfernen und beim Autostart hinzuzufügen. Da es viele Mappings gibt und es nur ein paar Klicks in Excel gibt, würde ich das gerne als Makro aufzeichnen. Aber wenn ich die Aufnahme einschalte, zeichnet es keine Mappings auf, die ich mache.

Q1: Gibt es eine Möglichkeit, Mapping-Generation aufzuzeichnen? Oder gibt es eine Möglichkeit, diesen Prozess irgendwie zu automatisieren?

Ich fand auch interessante Sache. Wenn ich meine map-broken xlsx als zip öffne und xmlMaps.xml daraus entferne, kann ich, nachdem ich xls wieder geöffnet habe, XML-Datenquelle öffnen, und wenn ich mein xsd hinzufüge, werden alle Mappings wiederhergestellt und korrekt mit Zellen in xls verbunden (fett markiert) im beigefügten Bild). Das führt mich dazu, Frage 2 zu stellen.

Q2: Gibt es eine Möglichkeit, die Zuordnungen in VBA auf die Art und Weise zu entfernen, dass, wenn es erneut hinzugefügt wird, es die Zuordnungen merken würde?

Ich hoffe, Sie können mir einen Rat geben, danke.

part of XSD

+0

Sobald Sie die Karte konfiguriert haben, bevor die Datei geschlossen wird, versuchen 'ActiveWorkbook.XmlMaps tun ("JPK_mapa") Export. ("C: \ Pfad \ file.xml zu \", True)', Versuchen Sie dann nach dem erneuten Öffnen/Löschen eine ähnliche 'Import'-Methode.Neugierig zu sehen, ob das funktioniert (das ist außerhalb meines Wissens, also kann ich wahrscheinlich nicht viel mehr als das helfen) –

+0

Danke, das habe ich schon ausprobiert. Es scheint, dass der Export XML-Daten exportieren nicht die Schema-Mappings :-( – norbi771

+0

Haben Sie mit 'ActiveWorkbook.XmlMaps (" JPK_mapa "). Schemata"? –

Antwort

0

fand ich Lösung für das Problem. Nicht so, wie ich es erwartet habe, aber es funktioniert gut. Was ich mache, ist die Map neu aufzubauen, wenn die Excel-Datei geöffnet wird. Ich speichere die Zuordnung der Felder zum Schema in einem separaten versteckten Arbeitsblatt, und wenn die Datei geöffnet wird, lösche ich altes Schema, füge neues hinzu und füge das Mapping hinzu. Der Prozess ist für den Benutzer transparent.

Private Sub Auto_Open() 
     Dim myMap As XmlMap 

     ActiveWorkbook.XmlMaps(1).Delete 
     Set myMap = ActiveWorkbook.XmlMaps.Add(Application.ActiveWorkbook.Path & "\JPK_VAT2v1-0.xsd", "JPK") 
     myMap.Name = "JPK_mapa" 



    A = True 
    row = 1 
    While A 
     If (Worksheets("Maps").Range("A" & row).Value <> "") Then 

      mySheet = Worksheets("Maps").Range("A" & row).Value 
      mycell = Worksheets("Maps").Range("B" & row).Value 
      myXpath = Worksheets("Maps").Range("D" & row).Value 
      ret = Worksheets(mySheet).Range(mycell).XPath.SetValue(myMap, myXpath) 
      row = row + 1 

     Else 
      A = False 
     End If 
    Wend 
    End Sub 

und Karten Arbeitsblatt sieht aus wie folgt:

ColA ColB ColC  ColD 

    Start $B$2 JPK_mapa /ns1:JPK/ns1:Naglowek/ns1:KodFormularza 
    Start $C$2 JPK_mapa /ns1:JPK/ns1:Naglowek/ns1:KodFormularza/@kodSystemowy 
    Start $D$2 JPK_mapa /ns1:JPK/ns1:Naglowek/ns1:KodFormularza/@wersjaSchemy 
    Start $E$2 JPK_mapa /ns1:JPK/ns1:Naglowek/ns1:WariantFormularza 
    Start $F$2 JPK_mapa /ns1:JPK/ns1:Naglowek/ns1:CelZlozenia 
    Start $G$2 JPK_mapa /ns1:JPK/ns1:Naglowek/ns1:DataWytworzeniaJPK 
    Start $H$2 JPK_mapa /ns1:JPK/ns1:Naglowek/ns1:DataOd 
    Start $I$2 JPK_mapa /ns1:JPK/ns1:Naglowek/ns1:DataDo 
    Start $J$2 JPK_mapa /ns1:JPK/ns1:Naglowek/ns1:DomyslnyKodWaluty 
    Start $K$2 JPK_mapa /ns1:JPK/ns1:Naglowek/ns1:KodUrzedu 
    Start $B$5 JPK_mapa /ns1:JPK/ns1:Podmiot1/ns1:IdentyfikatorPodmiotu/ns2:NIP 
    Start $C$5 JPK_mapa /ns1:JPK/ns1:Podmiot1/ns1:IdentyfikatorPodmiotu/ns2:PelnaNazwa 
    Start $D$5 JPK_mapa /ns1:JPK/ns1:Podmiot1/ns1:IdentyfikatorPodmiotu/ns2:REGON 
    Start $E$5 JPK_mapa /ns1:JPK/ns1:Podmiot1/ns1:AdresPodmiotu/ns1:KodKraju 
    Start $F$5 JPK_mapa /ns1:JPK/ns1:Podmiot1/ns1:AdresPodmiotu/ns1:Wojewodztwo 
    Start $G$5 JPK_mapa /ns1:JPK/ns1:Podmiot1/ns1:AdresPodmiotu/ns1:Powiat 
    Start $H$5 JPK_mapa /ns1:JPK/ns1:Podmiot1/ns1:AdresPodmiotu/ns1:Gmina 
    Start $I$5 JPK_mapa /ns1:JPK/ns1:Podmiot1/ns1:AdresPodmiotu/ns1:Ulica 
    Start $J$5 JPK_mapa /ns1:JPK/ns1:Podmiot1/ns1:AdresPodmiotu/ns1:NrDomu 
    Start $K$5 JPK_mapa /ns1:JPK/ns1:Podmiot1/ns1:AdresPodmiotu/ns1:NrLokalu 
    Start $L$5 JPK_mapa /ns1:JPK/ns1:Podmiot1/ns1:AdresPodmiotu/ns1:Miejscowosc 
    Start $M$5 JPK_mapa /ns1:JPK/ns1:Podmiot1/ns1:AdresPodmiotu/ns1:KodPocztowy 
    Start $N$5 JPK_mapa /ns1:JPK/ns1:Podmiot1/ns1:AdresPodmiotu/ns1:Poczta 
    Sprzedaz $B$1 JPK_mapa /ns1:JPK/ns1:SprzedazWiersz/@typ 
    Sprzedaz $C$1 JPK_mapa /ns1:JPK/ns1:SprzedazWiersz/ns1:LpSprzedazy 
    Sprzedaz $D$1 JPK_mapa /ns1:JPK/ns1:SprzedazWiersz/ns1:NrKontrahenta 
    Sprzedaz $E$1 JPK_mapa /ns1:JPK/ns1:SprzedazWiersz/ns1:NazwaKontrahenta 
    Sprzedaz $F$1 JPK_mapa /ns1:JPK/ns1:SprzedazWiersz/ns1:AdresKontrahenta 
    Sprzedaz $G$1 JPK_mapa /ns1:JPK/ns1:SprzedazWiersz/ns1:DowodSprzedazy 
    Sprzedaz $H$1 JPK_mapa /ns1:JPK/ns1:SprzedazWiersz/ns1:DataWystawienia 
    Sprzedaz $I$1 JPK_mapa /ns1:JPK/ns1:SprzedazWiersz/ns1:DataSprzedazy 
    Sprzedaz $J$1 JPK_mapa /ns1:JPK/ns1:SprzedazWiersz/ns1:K_10 
    Sprzedaz $K$1 JPK_mapa /ns1:JPK/ns1:SprzedazWiersz/ns1:K_11 
    Sprzedaz $L$1 JPK_mapa /ns1:JPK/ns1:SprzedazWiersz/ns1:K_12 
    Sprzedaz $M$1 JPK_mapa /ns1:JPK/ns1:SprzedazWiersz/ns1:K_13 
    Sprzedaz $N$1 JPK_mapa /ns1:JPK/ns1:SprzedazWiersz/ns1:K_14 
    Sprzedaz $O$1 JPK_mapa /ns1:JPK/ns1:SprzedazWiersz/ns1:K_15 
    Sprzedaz $P$1 JPK_mapa /ns1:JPK/ns1:SprzedazWiersz/ns1:K_16 
    Sprzedaz $Q$1 JPK_mapa /ns1:JPK/ns1:SprzedazWiersz/ns1:K_17 
    Sprzedaz $R$1 JPK_mapa /ns1:JPK/ns1:SprzedazWiersz/ns1:K_18 
    Sprzedaz $S$1 JPK_mapa /ns1:JPK/ns1:SprzedazWiersz/ns1:K_19 
    Sprzedaz $T$1 JPK_mapa /ns1:JPK/ns1:SprzedazWiersz/ns1:K_20 
    Sprzedaz $U$1 JPK_mapa /ns1:JPK/ns1:SprzedazWiersz/ns1:K_21 
    Sprzedaz $V$1 JPK_mapa /ns1:JPK/ns1:SprzedazWiersz/ns1:K_22 
    Sprzedaz $W$1 JPK_mapa /ns1:JPK/ns1:SprzedazWiersz/ns1:K_23 
    Sprzedaz $X$1 JPK_mapa /ns1:JPK/ns1:SprzedazWiersz/ns1:K_24 
    Sprzedaz $Y$1 JPK_mapa /ns1:JPK/ns1:SprzedazWiersz/ns1:K_25 
    Sprzedaz $Z$1 JPK_mapa /ns1:JPK/ns1:SprzedazWiersz/ns1:K_26 
    Sprzedaz $AA$1 JPK_mapa /ns1:JPK/ns1:SprzedazWiersz/ns1:K_27 
    Sprzedaz $AB$1 JPK_mapa /ns1:JPK/ns1:SprzedazWiersz/ns1:K_28 
    Sprzedaz $AC$1 JPK_mapa /ns1:JPK/ns1:SprzedazWiersz/ns1:K_29 
    Sprzedaz $AD$1 JPK_mapa /ns1:JPK/ns1:SprzedazWiersz/ns1:K_30 
    Sprzedaz $AE$1 JPK_mapa /ns1:JPK/ns1:SprzedazWiersz/ns1:K_31 
    Sprzedaz $AF$1 JPK_mapa /ns1:JPK/ns1:SprzedazWiersz/ns1:K_32 
    Sprzedaz $AG$1 JPK_mapa /ns1:JPK/ns1:SprzedazWiersz/ns1:K_33 
    Sprzedaz $AH$1 JPK_mapa /ns1:JPK/ns1:SprzedazWiersz/ns1:K_34 
    Sprzedaz $AI$1 JPK_mapa /ns1:JPK/ns1:SprzedazWiersz/ns1:K_35 
    Sprzedaz $AJ$1 JPK_mapa /ns1:JPK/ns1:SprzedazWiersz/ns1:K_36 
    Sprzedaz $AK$1 JPK_mapa /ns1:JPK/ns1:SprzedazWiersz/ns1:K_37 
    Sprzedaz $AL$1 JPK_mapa /ns1:JPK/ns1:SprzedazWiersz/ns1:K_38 
    Sprzedaz $AM$1 JPK_mapa /ns1:JPK/ns1:SprzedazWiersz/ns1:K_39 
    SprzedazCTRL $B$2 JPK_mapa /ns1:JPK/ns1:SprzedazCtrl/ns1:LiczbaWierszySprzedazy 
    SprzedazCTRL $C$2 JPK_mapa /ns1:JPK/ns1:SprzedazCtrl/ns1:PodatekNalezny 
    Zakup $B$1 JPK_mapa /ns1:JPK/ns1:ZakupWiersz/@typ 
    Zakup $C$1 JPK_mapa /ns1:JPK/ns1:ZakupWiersz/ns1:LpZakupu 
    Zakup $D$1 JPK_mapa /ns1:JPK/ns1:ZakupWiersz/ns1:NrDostawcy 
    Zakup $E$1 JPK_mapa /ns1:JPK/ns1:ZakupWiersz/ns1:NazwaDostawcy 
    Zakup $F$1 JPK_mapa /ns1:JPK/ns1:ZakupWiersz/ns1:AdresDostawcy 
    Zakup $G$1 JPK_mapa /ns1:JPK/ns1:ZakupWiersz/ns1:DowodZakupu 
    Zakup $H$1 JPK_mapa /ns1:JPK/ns1:ZakupWiersz/ns1:DataZakupu 
    Zakup $I$1 JPK_mapa /ns1:JPK/ns1:ZakupWiersz/ns1:DataWplywu 
    Zakup $J$1 JPK_mapa /ns1:JPK/ns1:ZakupWiersz/ns1:K_43 
    Zakup $K$1 JPK_mapa /ns1:JPK/ns1:ZakupWiersz/ns1:K_44 
    Zakup $L$1 JPK_mapa /ns1:JPK/ns1:ZakupWiersz/ns1:K_45 
    Zakup $M$1 JPK_mapa /ns1:JPK/ns1:ZakupWiersz/ns1:K_46 
    Zakup $N$1 JPK_mapa /ns1:JPK/ns1:ZakupWiersz/ns1:K_47 
    Zakup $O$1 JPK_mapa /ns1:JPK/ns1:ZakupWiersz/ns1:K_48 
    Zakup $P$1 JPK_mapa /ns1:JPK/ns1:ZakupWiersz/ns1:K_49 
    Zakup $Q$1 JPK_mapa /ns1:JPK/ns1:ZakupWiersz/ns1:K_50 
    ZakupCTRL $B$2 JPK_mapa /ns1:JPK/ns1:ZakupCtrl/ns1:LiczbaWierszyZakupow 
    ZakupCTRL $C$2 JPK_mapa /ns1:JPK/ns1:ZakupCtrl/ns1:PodatekNaliczony 

ich auch kleine Funktion zu machen Karten Arbeitsblatt auf das, was tatsächlich abgebildet wird geschrieben, so habe ich nicht manuell Inhalt der Karten-Arbeitsblatt schreiben . Dies basiert auf der Art und Weise, wie ich gemappte Felder in meiner Excel-Datei und Arbeitsblättern gespeichert habe, aber ich denke, es sollte etwas Licht ins Dunkel bringen, vielleicht findet jemand es nützlich :-) Also, wenn ich einige Mappings ändere Führen Sie einfach manuell die Funktion "mapMap" und das Arbeitsblatt "Maps" aus.

Sub makeMap() 
     mapRow = store("Start", 2, 1) 
     mapRow = store("Start", 5, mapRow) 
     mapRow = store("Sprzedaz", 1, mapRow) 
     mapRow = store("SprzedazCTRL", 2, mapRow) 
     mapRow = store("Zakup", 1, mapRow) 
     mapRow = store("ZakupCTRL", 2, mapRow) 
    End Sub 

    Function store(Sh As String, row As Integer, ByVal mapRow As Integer) As Integer 


     Dim mySheet As Worksheet 
     Set mySheet = Worksheets(Sh) 


     myRow = row 
     mycell = "" 

     For cols = 2 To 50 
     hasXpath = mySheet.Cells(row, cols).XPath 

     If Not hasXpath = Empty Then 

      Worksheets("Maps").Range("A" & mapRow).Value = Sh 
      Worksheets("Maps").Range("B" & mapRow).Value = mySheet.Cells(row, cols).Address 
      Worksheets("Maps").Range("C" & mapRow).Value = mySheet.Cells(row, cols).XPath.Map 
      Worksheets("Maps").Range("D" & mapRow).Value = mySheet.Cells(row, cols).XPath 
      mapRow = mapRow + 1 
     End If 



     Next cols 
     store = mapRow 
    End Function