【问题标题】:Excel 2013 - VBA XML binding broken on restartExcel 2013 - VBA XML 绑定在重新启动时中断
【发布时间】:2016-11-04 01:58:31
【问题描述】:

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

然后我可以按预期输入数据并导出 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 中的映射,当再次添加时它会记住映射?

希望您能给我一些建议,谢谢。

【问题讨论】:

  • 一旦你配置了地图,在关闭文件之前,尝试做ActiveWorkbook.XmlMaps("JPK_mapa").Export("C:\path\to\file.xml", True),然后在重新打开/删除后尝试使用类似的Import方法。很想知道这是否有效(这超出了我的知识范围,所以我可能无能为力)
  • 谢谢,我已经试过了。似乎导出是 xml 数据导出而不是模式映射:-(
  • 你修改过ActiveWorkbook.XmlMaps("JPK_mapa").Schemas吗?
  • Schemas 集合中的每个项目都有一个 XML 属性,不确定它是否包含映射?
  • ActiveWorkbook.XmlMaps("JPK_mapa").Schemas(1).XML 似乎是只读属性,我无法为其赋值(将其保存到变量后)

标签: xml excel xmlmapper vba


【解决方案1】:

我找到了问题的解决方案。不完全是我预期的方式,但工作正常。 我所做的是在打开 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 文件和工作表中存储映射字段的方式,但我认为它应该对如何实现这一点有所了解,也许有人觉得它有用:-) 因此,当我更改一些映射时,我只需手动运行 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多