XL 2019 Mappage XML non exportable ?

seb01

XLDnaute Nouveau
Bonjour à tous,

Je suis confronté à un problème de mappage xml et lors de l'exportation j'ai un message qui me signale que les mappages xml de ce classeur ne sont pas exportable.

C'est la première fois que je travaille avec du XML dans excel et je ne sais pas si je m'y prend correctement.

Si vous savez m'aider ce serait sympa.

Mon fichier excel contient 3 colonnes et les entêtes de colonnes correspondent à certains éléments du XML. (StartingDate, EndingDate et INSS)

Voici la structure du XML:
XML:
<Dimona xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Dimona_20212.xsd">
<Form>
<Identification>DIMONA</Identification>
<FormCreationDate>2021-05-06</FormCreationDate>
<FormCreationHour>14:35:00.000</FormCreationHour>
<AttestationStatus>0</AttestationStatus>
<TypeForm>SU</TypeForm>
<Reference>
<ReferenceType>1</ReferenceType>
<ReferenceOrigin>1</ReferenceOrigin>
<ReferenceNbr>string</ReferenceNbr>
</Reference>
<DimonaIn>
<StartingDate>2021-11-08</StartingDate>
<EndingDate>2021-11-08</EndingDate>
<EmployerId>
<NOSSRegistrationNbr>175110801</NOSSRegistrationNbr>
</EmployerId>
<NaturalPerson>
<INSS>01410199955</INSS>
</NaturalPerson>
<DimonaFeatures>
<JointCommissionNbr>XXX</JointCommissionNbr>
<WorkerType>TRI</WorkerType>
</DimonaFeatures>
<StudentPlaceOfWork>
<Denomination>Test lieu</Denomination>
<Address>
<Street>Carrefour Lieu</Street>
<HouseNbr>11</HouseNbr>
<PostBox></PostBox>
<ZIPCode>4000</ZIPCode>
<City>LIEGE</City>
<Country>2</Country>
</Address>
</StudentPlaceOfWork>
</DimonaIn>
</Form>
</Dimona>

et fichier XSD
Code:
Dimona 00011 Noss_conversion1 xs:nossRegistrationNbr 00014 CompanyID_conversion1 xs:companyId 00023 00024 Inss_conversion1 xs:inss 00025 00026 00027 00028 Date_conversion2 00029 00030 00031 00032 00033 00034 00035 00041 00046 00053 00109 NossAPL_conversion1 xs:nossLpaRegistrationNbr 00110 00119 00131 CompanyID_conversion1 xs:companyId 00153 00167 00168 00169 00218 Date_conversion1 00221 00222 TicketNumber_conversion1 00296 00297 00298 00299 Time_conversion1 00517 00518 00519 00520 00522 00523 00615 00652 00655 00663 00664 00776 00777 00778 00910 00911 00913 00948 01017 01085 01135 01231 90372 90480 90379 90378 90377 90594 90376 90375 90022 90107 90374 90017 90256 90373 90082 90059
 

Pièces jointes

  • Dimona.xlsx
    11.2 KB · Affichages: 7

Hasco

XLDnaute Barbatruc
Bonjour,

Il n'est pas exportable car les éléments extraits ne sont pas de la même branche (table) et excel ne sait exporter que les fichiers xml plats ou une seule branche (plate) d'un fichier xml qu'il peut traiter en table.
Excel n'est pas un éditeur xml, il contient juste un outil xml succinct.
<branche>
<element>toto</element>
<element>toto 1</element>
<element>toto 2</element>
</branche>

Comme vous ne nous parlez pas des finalités de cela, difficile de vous en dire plus.
cordialement
 

Hasco

XLDnaute Barbatruc
Re,

Mais il y a peut-être d'autres moyens mais pour ça il faudrait connaître la finalité de ce travail.
Si c'est d'éditer en modification certaines données et les retransmettre en xml oui, c'est mort s'il faut respecter le xsd original. Par vba c'est possible mais si vous n'y connaissez rien ni en xml ni en DomDocument ni en vba ça va être dur.
Si c'est autre chose, faut voir...

cordialement
 
Dernière édition:

seb01

XLDnaute Nouveau
La structure XML permet de déclarer l'horaire des travailleurs auprès de l'administration.
L'idée c'était de créer un tableau excel contenant les éléments qui varient (StartingDate, EndingDate, INSS) et de les exporter dans la structure XML selon le mappage.

Je ne sais pas si ma description est assez précise.
 

Hasco

XLDnaute Barbatruc
Re,

Oui, c'est assez précis.
Au fait, votre xsd du post#1 ne semble pas du tout à un schema xml ! D'où cela provient-il ?
donnez-nous le fichier Dimona_20212.xsd

Si j'ai le temps, je verrai si je peux mettre en place un truc simple par vba, mais il faut un xsd véritable.

Est-ce que votre fichier xml peut comporter plusieurs élément
<DimonaIn></DimonaIn>
Si oui, quel est l'identificateur unique d'un élément.

Cordialement
 
Dernière édition:

seb01

XLDnaute Nouveau
Merci déjà pour l'aide.
J'ai effectué une demande auprès de l'administration pour savoir si le XML peut contenir plusieurs <DimonaIn></DimonaIn>. J'attend leur réponse dans les 24h.

Pour ce qui est du schéma XSD il est copié directement du site web de la sécurité sociale:
https://www.socialsecurity.be/docu_xml/dimona/Dimona_20212.xsd et me semble identique à celui que j'ai fourni.

Au niveau de l'identifiant unique, l'élément <INSS></INSS> contient le registre national du travailleur qui je le pense est unique dans la structure XML dans <DimonaIn>

C'est ce que je dispose comme information pour le moment.
 

seb01

XLDnaute Nouveau
Bonjour,

Je reviens après l'information obtenue sur le fait qu'il est possible de passer plusieurs éléments <DimonaIn> dans un seul fichier.

J'imagine que pour modifier la macro EnregistrerModifications() il faudrait effectuer une boucle Foreach() sur la colonne INSS pour lister les enregistrements présents.
Ensuite pour chaque éléments trouvé on ajouterai les balises <DimonaIn>...</DimonaIn> et le contenu qui varie dans le tableau excel (StartingDate, EndingDate, INSS)...

Oui mais... comment le réaliser en VBA ?

Merci pour l'aide ;)
 

Hasco

XLDnaute Barbatruc
Re,

Oui... Et vous avez tentez quelque chose ?
Voici ce que donnerait la macro ObtenirDonnees:


VB:
Sub ObtenirDonnees()
    Dim valeurs(1 To 1, 1 To 3)
    Dim Dimonas As IXMLDOMSelection
    Dim Dimona As IXMLDOMElement, Elem As IXMLDOMElement
    If Ouvrir() Then
        '
        ' Récupérer la collection d'élément DimonaIn
        Set Dimonas = xmlDoc.SelectNodes("//Form/DimonaIn")
        '
        ' Parcourir la collection
        For Each Dimona In Dimonas
            Set Elem = Dimona.SelectSingleNode("//StartingDate")
            If Not Elem Is Nothing Then valeurs(1, 1) = ParseDate(Elem.Text)
            Set Elem = Dimona.SelectSingleNode("//EndingDate")
            If Not Elem Is Nothing Then valeurs(1, 2) = ParseDate(Elem.Text)
            Set Elem = Dimona.SelectSingleNode("//NaturalPerson/INSS")
            If Not Elem Is Nothing Then valeurs(1, 3) = Elem.Text
            '
            ' Ajouter au tableau
            ThisWorkbook.Sheets("Feuil1").ListObjects("tableau6").ListRows.Add().Range.Value = valeurs
        Next Dimona
    End If
    Set Dimonas = Nothing
    Set Dimona = Nothing
    Set xmlDoc = Nothing
End Sub

Pour retrouver un DimonaIn par son INSS (identifiant unique ? ):
Code:
Set Elem = xmlDoc.SelectSingleNode("//DimonaIn/NaturalPerson/INSS[text()='1410199950']/ancestor::DimonaIn")
Où le INSS peut bien sûr être inséré par concaténation dans la chaine de caractère passée à la méthode .SelectSingleNode

Cordialement
 

seb01

XLDnaute Nouveau
Merci pour l'aide.

Etant donné que les données sont fournies à partir du tableau excel, c'est la macro EnregistrerModifications() qui est essentielle.

J'ai effectué qques adaptations sans grand succès:
VB:
Sub EnregistrerModifications()
    Dim Dimonas As IXMLDOMSelection
    Dim Dimona As IXMLDOMElement, Elem As IXMLDOMElement
    Dim row As ListRow
    ' Dim valeurs As Variant
    ' valeurs = Range("Tableau6[#All]").Select
    
    ' Ouverture du document et écriture des nouvelles données
    If Ouvrir() Then
        ' Récupérer la collection d'élément DimonaIn
        Set Dimonas = xmlDoc.SelectNodes("//Form/DimonaIn")
        
        For Each row In ActiveSheet.ListObjects("Tableau6").ListRows
            Set Elem = xmlDoc.SelectSingleNode("//DimonaIn/StartingDate")
            If Not Elem Is Nothing And IsDate(row.Range(1, 1).Value) Then Elem.Text = Format([COLOR=rgb(209, 72, 65)]row.Range(1, 1).Value[/COLOR]), "yyyy-mm-dd")
            Set Elem = xmlDoc.SelectSingleNode("//DimonaIn/EndingDate")
            If Not Elem Is Nothing And IsDate(row.Range(1, 2).Value) Then Elem.Text = Format([COLOR=rgb(209, 72, 65)]row.Range(1, 2).Value[/COLOR]), "yyyy-mm-dd")
            Set Elem = xmlDoc.SelectSingleNode("//DimonaIn/NaturalPerson/INSS")
            If Not Elem Is Nothing Then Elem.Text = CStr(row.Range(1, 3).Value)
            
        Next row
        xmlDoc.Save (ThisWorkbook.Path & "\dimona.xml")
        ThisWorkbook.Sheets("Feuil1").Range("G1") = "dernier enregistrement " & Format(Now, "ddd d mmm yyyy \à hh\h mm\m ss\s")
    End If
End Sub

Sans maîtrise du langage c'est en effet compliqué...
Mais voici ce que j'ai commencé à faire et qui me provoque une erreur à directement à l'écriture du code (voir en rouge)

Outre cette erreur de Format, l'idée c'est de parcourir le tableau et pour chaque ligne trouvée, il prend les valeurs des colonnes qui seront insérées dans le XML.

Il me restera à trouver comment prendre la structure du <DimonaIn></DimonaIn> et de l'insérer autant de fois qu'il ne le faut.
 

Hasco

XLDnaute Barbatruc
Il me restera à trouver comment prendre la structure du <DimonaIn></DimonaIn> et de l'insérer autant de fois qu'il ne le faut.
Je ne comprends pas, dans le contexte ce que veux dire insérer

Vous prenez une macro de lecture d'un document xml en vue d'en charger des élements dans un tableau, pour le modifier. Il y a quelque chose qui coince, là. Non.

J'ai parfois l'impression de parler pour rien.
VB:
Sub EnregistrerModifications()
    Dim Dimona As IXMLDOMElement, Elem As IXMLDOMElement
    Dim valeurs As Variant
    Dim lr As ListRow
    If Ouvrir() Then
        '
        ' parcourir les lignes du tableau excel
        For Each lr In ThisWorkbook.Sheets("Feuil1").ListObjects("tableau6").ListRows
            valeurs = lr.Range.Value
            If Not IsEmpty(valeurs(1, 3)) Then
                '
                ' Elément parent (DimonaIn)
                Set Dimona = xmlDoc.SelectSingleNode("//DimonaIn/NaturalPerson/INSS[text()='" & Format(valeurs(1, 3), "0000000000") & "']/ancestor::DimonaIn")

                If Not Dimona Is Nothing Then
                    ' Element enfant (StartingDate)
                    Set Elem = Dimona.SelectSingleNode("//StartingDate")
                    If Not Elem Is Nothing And IsDate(valeurs(1, 1)) Then Elem.Text = Format(valeurs(1, 1), "yyyy-mm-dd")
                    ' Element enfant (EndingDate)
                    Set Elem = Dimona.SelectSingleNode("//DimonaIn/EndingDate")
                    If Not Elem Is Nothing And IsDate(valeurs(1, 2)) Then Elem.Text = Format(valeurs(1, 2), "yyyy-mm-dd")
                End If
            End If
        Next
        '
        ' Sauvegarde du document
        xmlDoc.Save (ThisWorkbook.Path & "\dimona.xml")

        ThisWorkbook.Sheets("Feuil1").Range("G1") = "dernier enregistrement " & Format(Now, "ddd d mmm yyyy \à hh\h mm\m ss\s")
    End If
End Sub
 

seb01

XLDnaute Nouveau
Merci encore pour les efforts mais je pense qu'il y a un malentendu.
Le tableau excel contenant l'horaire du personnel est fournis et déjà complété.
Il n'est donc pas nécessaire de lire le fichier XML pour compléter celui-ci.

Etant donné que je peux envoyer plusieurs DimonaIn dans un seul fichier, le but de la macro enregistrerModification() c'est de prendre le contenu du tableau excel et d'écrire dans le fichier XML selon la structure:

XML:
<Dimona xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Dimona_20212.xsd">
    <Form>
        <Identification>DIMONA</Identification>
        <FormCreationDate>2021-05-06</FormCreationDate>
        <FormCreationHour>14:35:00.000</FormCreationHour>
        <AttestationStatus>0</AttestationStatus>
        <TypeForm>SU</TypeForm>
        <Reference>
            <ReferenceType>1</ReferenceType>
            <ReferenceOrigin>1</ReferenceOrigin>
            <ReferenceNbr>string</ReferenceNbr>
        </Reference>
        <DimonaIn>
            <StartingDate>2021-11-09</StartingDate>
            <EndingDate>2021-11-12</EndingDate>
            <EmployerId>
                <NOSSRegistrationNbr>175110801</NOSSRegistrationNbr>
            </EmployerId>
            <NaturalPerson>
                <INSS>1410199957</INSS>
            </NaturalPerson>
            <DimonaFeatures>
                <JointCommissionNbr>XXX</JointCommissionNbr>
                <WorkerType>TRI</WorkerType>
            </DimonaFeatures>
            <StudentPlaceOfWork>
                <Denomination>Test lieu</Denomination>
                <Address>
                    <Street>Carrefour Lieu</Street>
                    <HouseNbr>11</HouseNbr>
                    <PostBox></PostBox>
                    <ZIPCode>4000</ZIPCode>
                    <City>LIEGE</City>
                    <Country>2</Country>
                </Address>
            </StudentPlaceOfWork>
        </DimonaIn>
 <DimonaIn>
            <StartingDate>2021-11-10</StartingDate>
            <EndingDate>2021-11-12</EndingDate>
            <EmployerId>
                <NOSSRegistrationNbr>175110801</NOSSRegistrationNbr>
            </EmployerId>
            <NaturalPerson>
                <INSS>1410199958</INSS>
            </NaturalPerson>
            <DimonaFeatures>
                <JointCommissionNbr>XXX</JointCommissionNbr>
                <WorkerType>TRI</WorkerType>
            </DimonaFeatures>
            <StudentPlaceOfWork>
                <Denomination>Test lieu</Denomination>
                <Address>
                    <Street>Carrefour Lieu</Street>
                    <HouseNbr>11</HouseNbr>
                    <PostBox></PostBox>
                    <ZIPCode>4000</ZIPCode>
                    <City>LIEGE</City>
                    <Country>2</Country>
                </Address>
            </StudentPlaceOfWork>
        </DimonaIn>

    </Form>
</Dimona>
 

Membres actuellement en ligne

Statistiques des forums

Discussions
290 755
Messages
1 910 208
Membres
176 538
dernier inscrit
Charlydebutant
Haut Bas