Excel 2013 – VBA XML绑定在重新启动时断开

我有复杂的XSD。 在Excel开发者中,在XML部分,我可以点击“source”,将XSD添加到数据源图中,然后将节点映射到特定的单元格,行等。

然后我可以input数据并按预期输出XML,很好。 当我重新打开保存的XLS时,奇怪的事情发生了,excel表示我的XML映射被破坏,并要求删除破碎的地图,并显示他认为是错误的一个节点。 但所有选项都是灰色的,我发现的唯一select是通过VBA删除地图,

ActiveWorkbook.XmlMaps("JPK_mapa").Delete 

但是,当地图被删除时,所有映射都消失了,我必须再次添加地图,并手动执行所有映射。 这对我来说并不困难,但普通用户可能会遇到问题,我只想给他们XLS填充数据。

我不能改变XSD,对它的内容没有任何影响,所以我认为我必须忍受这一点,并教导excel以某种方式删除并重新添加此映射在自动启动。 由于有很多的映射,只是在Excel中的几个点击,我很想logging这是一个macros。 但是当我开始录制时,它不会logging我所做的映射。

Q1:有没有什么办法可以logging制图生成? 还是有办法让这个过程自动化吗?

我也发现有趣的事情。 如果我打开我的map破碎的xlsx作为zip并从其中删除xmlMaps.xml,再次打开xls后,我可以打开XML数据源,当我添加我的xsd时,所有的映射恢复,并正确绑定到单元格xls(标记为粗体在附图中)。 这导致我问问题2。

Q2:有没有办法在VBA中删除映射,当再次添加它会记住映射?

希望你能给我一些build议,谢谢。

一部分的XSD

我find了解决问题的办法。 不完全符合我的预期,但工作正常。 我所做的是在excel文件打开时重build地图。 我将字段的映射保存到独立隐藏工作表的模式中,打开文件时删除旧模式,添加新模式并添加映射。 该过程对用户是透明的。

  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 

和地图工作表如下所示:

  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 

我还写了一个小函数来根据实际映射的内容制作地图工作表,所以我不必手动编写地图工作表的内容。 这是基于我在我的excel文件和工作表中存储映射字段的方式,但是我认为这应该对如何实现这一点有所了解,也许有人认为它有用:-)所以,当我改变一些映射时,我只是运行手动makeMap函数和地图工作表生成。

  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