2016-07-01 3 views
1

У меня сложный XSD. В редакторе excel в разделе XML я могу щелкнуть по «source» и добавить XSD в карту данных, а затем сопоставить узлы определенным ячейкам, строкам и т. Д.Excel 2013 - привязка XML VBA при перезапуске

Теперь я могу ввести данные и экспортировать XML как ожидалось, приятно. Когда я снова открываю XLS, происходит что-то странное, и excel говорит, что моя карта XML сломана и просит удалить сломанную карту и показывает один узел, который, по его мнению, неверен. Но все опции неактивны и единственный вариант я нашел, чтобы удалить карту с помощью VBA,

ActiveWorkbook.XmlMaps("JPK_mapa").Delete 

Но когда карта удаляется все отображения исчезли, и я должен добавить карту снова и сделать все отображения вручную. Это не сложно для меня, но у обычных пользователей могут быть проблемы с этим, и я бы хотел просто дать им XLS для заполнения данными.

Я не могу изменить XSD, не влияю на его содержимое, поэтому я решил, что мне нужно жить с этим, и научить excel каким-то образом удалить и добавить это сопоставление снова в автозапуск. Поскольку есть много сопоставлений, и это всего лишь несколько кликов в excel, я бы хотел записать это как макрос. Но когда я включаю запись, он не записывает сопоставления, которые я делаю.

Q1: Можно ли каким-либо образом записать формирование картографирования? Или есть способ как-то автоматизировать этот процесс?

Я также узнал интересную вещь. Если я открою свой разбитый на карту xlsx как zip и удалю xmlMaps.xml из него, после открытия xls снова я могу открыть XML-источник данных, и когда я добавлю xsd, все сопоставления будут восстановлены и правильно привязаны к ячейкам в xls (выделены полужирным шрифтом в прилагаемом рисунке). Это заставляет меня задавать вопрос 2.

Q2: Есть ли способ удалить сопоставления в VBA так, чтобы при добавлении снова он запоминал отображения?

Надеюсь, вы можете дать мне несколько советов, спасибо.

part of XSD

+0

После того, как вы настроили карту, перед закрытием файла, попробуйте сделать 'ActiveWorkbook.XmlMaps ("JPK_mapa") Экспорт. ("C: \ путь \ к \ file.xml", True)', а затем попробуйте использовать аналогичный метод «Импорт» после повторного открытия/удаления.Любопытно посмотреть, работает ли это (это не в моих силах, поэтому я, вероятно, не могу больше помочь) –

+0

спасибо, я уже это пробовал. Кажется, что экспорт экспортирует XML-данные не в сопоставления схемы :-( – norbi771

+0

Вы использовали «ActiveWorkbook.XmlMaps (« JPK_mapa »). Schemas'? –

ответ

0

Я нашел решение этой проблемы. Не совсем так, как я ожидал, но отлично работает. Что я делаю, это перестроение карты при открытии файла excel. Я сохраняю отображение полей в схеме в отдельном скрытом листе, а когда файл открывается, я удаляю старую схему, добавляю новую и добавляю отображение. Процесс прозрачен для пользователя.

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 и листах, но я думаю, что это должно затенять некоторый свет на то, как это может быть достигнуто, может быть, кто-то посчитает это полезным :-) Итак, когда я меняю некоторые отображения I просто запустите ручную makeMap-функцию и создан рабочий лист Maps.

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