Kezdőlap › Fórumok › Excel programozás › [Resolved] XML-Excel export-import
- This topic has 13 hozzászólás, 2 résztvevő, and was last updated 3 years, 12 months telt el by horvimi.
-
SzerzőBejegyzés
-
2020-10-16-19:12 #7783
Sziasztok!
Nem tudom a megfelelő témakört választottam-e, de egy xml fájl beolvasása és exportálása a problémám.
Maga a feladat felettébb általános, ezért nem csatolok külön fájlt.
Adva van egy program információs táblája, amit rendkívül körülményes kitölteni és rengeteg felesleges sort tartalmaz, ezért adja magát, hogy a szükséges értékeket excelben írjam be. A baj csak az, hogy az xml forrásának beolvasását követően, miután megfeleltem a szükséges cellákat (a 600-ból fontos 20 értékkel), nem tudom a teljes sémát exportálni, csupán a kitöltött értékeket, így a program sem képes visszaolvasni az xml-t. Van rá megoldásotok, hogyan lehetne a legegyszerűbben megoldani a feladatot, anélkül, hogy a teljes sémát meg kellene feleltetni?Előre is köszönöm a segítségeteket, Irbisz
2020-10-18-21:31 #7796Szia!
Én most csak tippelek.
Ha az a bizonyos program egy bizonyos sémát keres, akkor elég sanszos, hogy csak egy részét nem fogja elfogadni.
Tehát azoknak is ott kell lenniük üres vagy ilyesmi értékkel.Szerintem.
Különben most mit csinálsz? Programozol, vagy XML-t olvasol és próbálsz menteni Excellel?
Az Excel natív XML kezelését, ami valahol a Táblázat szalagon van, ha jól emlékszem, nem ismerem, nem is próbáltam még…
Próbából írtam már XML-t olvasó, illetve létrehozó VBA programot, van hozzá könyvtár, csak be kell pipálni a Referenciákban.Imre
2020-10-18-22:43 #7799Szia Imre!
Igen pontosan a teljes sémát ki szeretném menteni excelből, függetlenül attól, hogy csak egy részét feleltettem meg és töltöttem ki.
Egész egyszerűen a fejlesztőeszközök fülön a forrásnál betöltöttem a programból kimentett xml sémát, megfeleltettem a számomra fontos adatokat az excel egyes celláival, majd kitöltöttem, de az exportálásnál nem tudom megadni, hogy ne csak a kitöltött cellákat olvassa vissza, hanem azokkal együtt az egész sémát.
Microsoft XML v6.0 -ra gondolsz? …nem gondoltam, hogy pár érték oda-vissza írásához ilyen nagy fába kell vágnom a fejszét 🙁
PQuery nem lehet megoldás vagy akkor kezdjek neki VBA-ban?Irbisz
2020-10-19-00:24 #7800Fontos megjegyeznem, hogy ilyeneket nem csináltam még, ezért nem tudok hiteles tanácsot adni.
PQ csak olvas és kibont XML fájlokat, majd ha már táblázat, akkor lehet átalakítani és betölteni Excel-be, visszafelé nem működik.Ha a Neten nem találsz megoldást, akkor le kell programozni.
Ötlet: Mi van, ha a számosra nem lényeges celláknak is adsz valami tartalmat? Üres sztring, vagy szóköz vagy ilyesmi?
Talán lehet tömegesen csinálni…2020-11-01-22:25 #7849Szia Imre!
Sajnos hiába próbálom tömegesen, kimentésnél nem tudom azt a struktúrát reprodukálni, amit a másik program beolvas.
Az tűnik a legegyszerűbbnek, hogy egy makróval kicseréljem az xml-ben az adott értékeket.
Erre van esetleg tipped, hogyan tudnám vagy merre fele keresgéljek?Köszönöm, Irbisz!
2020-11-01-23:13 #7850Szia!
Nem tudom pontosan, hogy mit is akarsz, de az említett XML library-vel sokmindent lehet csinálni.
Itt van egy elég jó példa:
https://excel-macro.tutorialhorizon.com/vba-excel-update-xml-file/Imre
2020-11-01-23:50 #7851Szia!
Pontosan ezt szeretném csak excel cellákban kitöltött feliratokra akarom kicserélni az xml egyes értékeit.
Nem tudom, mit csinálok rosszul, de hiába pipálom be a tools/references -ben a Microsoft XML v6.0 -ot, akkor sem fut le a linken leírt makró (fnUpdateXMLByTags meghívásánál elakad).
Irbisz2020-11-02-16:13 #7852Ettől nem nagyon leszek okosabb, az csak a fv neve.
Futtattad lépésenként?
Konkrétan melyik soron akad el?
Mi a hibaüzenet?2020-11-04-15:42 #7853Biztosan kihagyok vagy elrontok valamit. Első körben, mielőtt a saját xml-nek nekiállok ki akartam próbálni, hogy működik-e a megadott kód, ezért letöltöttem a link által megadott minta xml-t (https://msdn.microsoft.com/en-us/library/ms762271%28v=vs.85%29.aspx), majd egy üres excelben a vba tools/references-ben bekapcsoltam a Microsoft XML v6.0 -ot. Ezt követően a weboldalról bemásoltam a kódot és a csatolt kép alapján elakadt (az olvasás amúgy működik).
Attachments:
You must be logged in to view attached files.2020-11-04-20:34 #7855Szia!
Ha jól gondolom, akkor nem nagyon makróztál még…
A kép alapján az a probléma, hogy a weboldalról bemásolt kódban nem minden karakter olyan, amilyennek a VBAS szerkestőben lennie kell ahhoz, hogy működjön.
A piros sorok mindegyike valójában kód comment, azaz megjegyzés.
A VBA-ban a megjegyzések felső aposztróffal kezdődnek, ami a magyar billentyűzeten a Shift-1-es-en van.
A képen másfajta felső aposztrófot vélek felfedezni.
Ugyanez szokott lenni a dupla idézőjelekel is.???
Imre
2020-11-07-00:01 #7857Szia Imre!
Egyrészt rosszul gondolod, noha messze nem vagyok egy vba guru, de írtam már pár makrót, jó párat meg összeraktam (pl ez is egy hosszabb vba ellenőrző, fájl betöltő-átíró processzus lenne, aminek a többi része már jobbára megvan).
Másrészt, ami a diagnózist illeti, miszerint hülye vagyok, ezúttal pontos.
Mentségemre szolgáljon, hogy lopott perceimben próbálom ezt összehegeszteni, xml-lel még sosem volt dolgom és arra a meggyőződésemre fókuszáltam, hogy biztosan rossz xml libraryt töltök be, akkor sem kapcsolva, mikor a megjegyzésnél állt le a kód.
Elnézést kérek érte 🙁
Ezek után persze nehéz segítséget kérni, de ha mégis megteszed, nagyon megköszönöm, mert a CDATA értékeket sehogy sem sikerül megadnom, kicserélnem. Mellékeltem az xml fájlt és kb ez lenne a kód váza:Function fnUpdateXMLByTags() Dim mainWorkBook As Workbook Set mainWorkBook = ActiveWorkbook Set oXMLFile = CreateObject("Microsoft.XMLDOM") XMLFileName = "c:\Users\Irbisz\Downloads\Munka\Nevezéktan\out\projectinfo.xml" oXMLFile.Load (XMLFileName) Set oAttribute = oXMLFile.SelectSingleNode("/ProjectInfo/Fix1/value/CDATA") oAttribute.Text = mainWorkBook.Sheets("Munka1").Range("B" & 3).Value Set oAttribute = oXMLFile.SelectSingleNode("/ProjectInfo/Custom2/value/CDATA") oAttribute.Text = mainWorkBook.Sheets("Munka1").Range("B10").Value & " - " & mainWorkBook.Sheets("Munka1").Range("B11").Value oXMLFile.Save (XMLFileName) End Function
Irbisz
- A hozzászólás módosításra került: 4 years telt el-irbisz.
Attachments:
You must be logged in to view attached files.2020-11-07-22:19 #7860Bocsi a nyers feltélezésért…
Ahogy az elején már írtam, nincs tapasztalatom XML feldolgozás területén. de tényleg semmilyen azon a valamikori rövid kísérleten kívül, amiben nem volt CDATA…
Szóval bele kellene ásnom magam, de most erre nem lesz kapacitásom így az év vége felé…
Itt egy link, ahol CDATA node-ot csinál valaki..
https://stackoverflow.com/questions/12454211/how-to-create-cdata-tag-in-excel-vba
Remélem sikerül megoldanod, (ez alapján vagy másképp) és visszajelzel a fórumba, hogy mi lett a megoldás!köszi,
Imre
2020-11-09-00:05 #7861Szia Imre!
Sehogy sem sikerült felülírnom a cdatat, az object browserben már mindent kipróbáltam, azonosítani a node-ot, stb..
úgyhogy maradt a favágó megoldás, azaz kiürítettem a meglévő cdata értéket és a createCDATASection paranccsal létrehoztam egy újat.
Végül ez lett a váz:Sub UpdateXML() Dim mainWorkBook As Workbook Set mainWorkBook = ActiveWorkbook Set oXMLFile = CreateObject("Microsoft.XMLDOM") XMLFileName = "útvonal\projectinfo.xml" oXMLFile.Load (XMLFileName) Set oAttribute = oXMLFile.SelectSingleNode("/ProjectInfo/FixKeys/Fix1/value") oAttribute.Text = "" Set ParentNode = oXMLFile.SelectSingleNode("/ProjectInfo/FixKeys/Fix1/value") Set childNode = oXMLFile.createElement("value") Set CData = oXMLFile.createCDATASection("value") CData.Data = mainWorkBook.Sheets("Munka1").Range("B2").Value & " - " & mainWorkBook.Sheets("Munka1").Range("B3").Value ParentNode.appendChild CData oXMLFile.Save (XMLFileName) End Sub
A célnak megfelel, szépen végigfut, a forrásprogram is hibátlanul visszaolvassa, de azért nem biztos, hogy az ilyen megoldásokat kellene mutogatni 😀
2020-11-09-09:00 #7862Na látod!
megérte!
Különben néhány keresésre én csak olyan linkeket találtam, ahol létrehoznak CDATA részeket, illetve olvasnak.
Szóval koránt sem biztos, hogy nem jó, illetve az egyetlen lehetséges a te megoldásod.
Mondom ezt laikusként 🙂Köszönöm, hogy visszatetted az eredményt!
Imre
-
SzerzőBejegyzés
- Be kell jelentkezni a hozzászóláshoz.