Avatar billede hellfishdk Nybegynder
04. maj 2005 - 15:48 Der er 14 kommentarer og
1 løsning

Exporterer til xml

Hej
Jeg skal have eksporteret en excel2000 regneark til xml. Brugeren skal bruge excel som han plejer, men når han trykker på en knap(makro), skal excel så konverterer informationerne til den struktur jeg har oprettet min xml i, og derefter skal excel eksporterer dataene til xml. Men hvordan skal koden se ud?

Jeg vil her prøve at beskrive hver af filene:

Excel 2000:
    Ark1: Her skal kontaktlisten med: afdeling, navn, stilling,            telefonnr, ansat pr dato, og email stå.
          Det er så her at arbejdsområdet for den der skal                  indtaste oplysningerne skal arbejde.
    Ark2: Her skal informationerne fra kontaktlisten så indføres            i den struktur jeg har defineret i min xml.

XML-filen har følgende struktur:
          <personale>
            <liste>
                <afdeling>[info fra excel afdeling]</afdeling>
                <navn>[info fra excel navn]</navn>
                <stilling>[info fra excel stilling]</stilling>
                <ansat>[info fra excel ansat pr]</ansat>
                <tlfnr>[info fra excel telefon]</tlfnr>
                <email>[info fra excel email]</email>
                <billede>[henter billide fra mappe]</billede>
            </liste>
          </afdeling>

Når bruger har indtastet de oplysninger han skal, skal han trykke på en Opdatér-knap (der er på ark1) og alle felterne bliver opdateret i ark2, hvorefter xml'en også bliver opdateret. Det skal så siges at når en person bliver slettet fra listen, så skal denne selvfølgelig også slettet fra xml'en.

Jeg håber der en der kan hjælpe med denne makro...?
Avatar billede bak Forsker
04. maj 2005 - 17:26 #1
Håber du selv kan lave noget :-)

I ark2 har du en liste med 6 kolonner (Afd,navn, stilling,tlf,email og sti til billede) og derunder har alle ansatte.
Overskrifter i A1:F1 og ansatte nedad derfra.

Denne makro kan så lave eksporten til en xlm-fil

Sub MakeXMLfile()
  Dim objXMLDOM As Object  'DOMDocument40
  Dim objPI As Object  'IXMLDOMProcessingInstruction
  Dim objListe As Object
  Dim wsh As Worksheet
  Dim rngData As Range
  Dim rngCell As Range

  Set wsh = Worksheets("Data")
  'opret forbindelse til XML-objectet
  Set objXMLDOM = CreateObject("Microsoft.XMLDOM")
  'lav processing-instruktioner
  Set objPI = objXMLDOM.createProcessingInstruction( _
              "xml", "version='1.0' encoding='UTF-8'")
  'find antallet af rækker, der skal eksporteres
  Set rngData = wsh.Range("A2:A" & wsh.Range("A65536").End(xlUp).Row)
  'opret elementet PERSONALE
  Set objXMLDOM.documentElement = objXMLDOM.createElement("Personale")
  'Opret elementet LISTE
  Set objListe = objXMLDOM.createElement("Liste")
  'Indsæt Processing instruktioner
  objXMLDOM.insertBefore objPI, objXMLDOM.childNodes.Item(0)
  'opret resten af elementerne
  objListe.appendChild objXMLDOM.createElement("Afdeling")
  objListe.appendChild objXMLDOM.createElement("Navn")
  objListe.appendChild objXMLDOM.createElement("Stilling")
  objListe.appendChild objXMLDOM.createElement("Telefon")
  objListe.appendChild objXMLDOM.createElement("Email")
  objListe.appendChild objXMLDOM.createElement("Billede")
  'indsæt underelementerne fra excel i listen
  For Each rngCell In rngData
      objListe.childNodes(0).Text = rngCell.Text
      objListe.childNodes(1).Text = rngCell.Offset(, 1).Text
      objListe.childNodes(2).Text = rngCell.Offset(, 2).Text
      objListe.childNodes(3).Text = rngCell.Offset(, 3).Text
      objListe.childNodes(4).Text = rngCell.Offset(, 4).Text
      objListe.childNodes(5).Text = rngCell.Offset(, 5).Text
      'indsæt dem
      objXMLDOM.documentElement.appendChild objListe.CloneNode(True)
  Next
  'Gem som XML-fil
  objXMLDOM.Save (ThisWorkbook.Path & "\myXML1.xml")
  'Ryd op
  Set objPI = Nothing
  Set objXMLDOM = Nothing
  Set objListe = Nothing
End Sub
Avatar billede bak Forsker
04. maj 2005 - 17:30 #2
I øvrig ser det lidt mærkeligt ud at din xml begynder med <personale> og afsluttes med </afdeling>.
Avatar billede hellfishdk Nybegynder
04. maj 2005 - 17:51 #3
En ordentlig smøre, jeg prøver lige... Vender tilbage...
Avatar billede hellfishdk Nybegynder
04. maj 2005 - 18:01 #4
hmm jeg får en Out of range - error.

Det skal lige siges at jeg aner intet om makro-programmering...
Avatar billede hellfishdk Nybegynder
04. maj 2005 - 18:03 #5
ups - Det er en 'Subscript Out of Range' jeg får
Avatar billede bak Forsker
04. maj 2005 - 18:14 #6
her er min test. koden er lidt anderledes

www.tbdl.dk/excel/xml-ansatte.xls
Avatar billede hellfishdk Nybegynder
04. maj 2005 - 18:27 #7
Den ser sgu særdeles meget brugbar ud, men hvis jeg sletter en post, så opdaterer den ikke i xml'en, når jeg exporterer.
Avatar billede bak Forsker
04. maj 2005 - 19:04 #8
Jo, do skal bare trykke på knappen igen, så overskriver den xml-filen
Avatar billede hellfishdk Nybegynder
04. maj 2005 - 20:00 #9
Du har sørme ret :) Ved ikke lige hvorfor den ikke opdaterede i IE...
Avatar billede brynil Nybegynder
05. maj 2005 - 16:18 #10
Hej bak!
Når der skal være flere niveauer i xml-filen, er nedenstående så den bedste måde at gøre det på (med et yderligere objekt):

...

'Opret elementet LISTE
Set objListe = objXMLDOM.createElement("Liste")
'opret resten af elementerne
objListe.appendChild objXMLDOM.createElement("Afdeling")
objListe.appendChild objXMLDOM.createElement("Navn")
objListe.appendChild objXMLDOM.createElement("Stilling")

'Opret elementet HALLO
Set objHallo = objXMLDOM.createElement("Hallo")
'opret resten af elementerne
objHallo.appendChild objXMLDOM.createElement("Telefon")
objHallo.appendChild objXMLDOM.createElement("Email")
objHallo.appendChild objXMLDOM.createElement("Billede")

'indsæt underelementerne fra excel i listen
For Each rngCell In rngData
    objListe.childNodes(0).Text = rngCell.Text
    objListe.childNodes(1).Text = rngCell.Offset(, 1).Text
    objListe.childNodes(2).Text = rngCell.Offset(, 2).Text
    'indsæt dem
    objXMLDOM.documentElement.appendChild objListe.CloneNode(True)

    objHallo.childNodes(0).Text = rngCell.Offset(, 3).Text
    objHallo.childNodes(1).Text = rngCell.Offset(, 4).Text
    objHallo.childNodes(2).Text = rngCell.Offset(, 5).Text
    'indsæt dem
    objXMLDOM.documentElement.appendChild objHallo.CloneNode(True)
Next

...

Hvis du skulle have et eksempel ved hånden på en anden, mere fornuftig måde at gøre det på er der også 100 pt fra mig.
Avatar billede brynil Nybegynder
05. maj 2005 - 16:21 #11
Ok - mit eks viser ikke et ekstra niveau. Det er egentlig det jeg er ude efter!
Avatar billede hellfishdk Nybegynder
06. maj 2005 - 13:37 #12
bak
Vil du være så venlig at lægge et svar ind, så du kan få dine point af mig. Din kode var noget jeg absolut kunne bruge :)
Avatar billede bak Forsker
06. maj 2005 - 18:59 #13
Ok, det var godt.
Brynil -> Vil du have et ekstra niveau, eller har du grejet det selv ?
Avatar billede brynil Nybegynder
06. maj 2005 - 20:02 #14
Hej bak!
Meget gerne, jeg kan ikke få det til at funke når jeg laver loopet. Den smider kun data rigtigt ind under det første gennemløb.
Min indsigt i DOM er begrænset, så hvis du vil, smider jeg points i et spm til dig.

Iøvrigt, jeg har været hele nettet igennem og talt med boghandlere om noget vb(a)/DOM uden held. Du skulle vel ikke kende en fornuftig kilde?
Avatar billede brynil Nybegynder
06. maj 2005 - 20:03 #15
Bortset fra Eksperten, selvfølgelig ;-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester