(C) 2009 - 2017 by Mourad Louha · Alle Rechte vorbehalten

UTF-8 XML Dateien in VBA generieren und in Adobe Flash verwenden

Vor kurzem hatten meine Partnerin – www.designimsinn.de – und ich den Auftrag, die Kunden-CD eines weltweit tätigen Unternehmens in Adobe Flash neu zu konzeptionieren, zu gestalten und zu implementieren. Die mehrsprachige Kunden-CD (Deutsch, Englisch und Russisch) enthält sehr viele externe Dateien in den jeweiligen Sprachen, die als PDF und PowerPoint Dokumente in speziellen Unterordnern abgelegt sind und via der CD-Oberfläche aufgerufen bzw. geöffnet werden müssen. Einige dieser Dateien auf der CD sollen durch einen Klick auf ein Listenelement einer Liste aufgerufen werden, einige andere über einen Klick auf eine Schaltfläche.

Während des Projektverlaufs kam mir die Idee, ein kleines Excel Tool zu entwickeln, welches die Verwaltung und Generierung von Dokumentschlüsseln, XML-Dateien und INI-Dateien vereinfacht. Dieser Artikel beschreibt die Rahmenbedingungen und das Tool. Klar, es handelt sich hier um eine Anwendung, die sehr auf unser Projekt bezogen ist. Unsere Anwendung kann am Ende des Artikels heruntergeladen werden; das VBA Projekt ist ungeschützt. Vielleicht kann ja jemand diese mit ein paar Modifikationen für eigene Projekte verwenden oder vielleicht ist der Code zu Studienzwecken ganz hilfreich.

UFT-8 XML Files in VBA

Zunächst erst ein paar Erläuterungen zu den Rahmenbedingungen. In Adobe Flash ist es möglich zur Erstellung von Listen, die Steuerelementkomponente „List“ zu verwenden, wobei angenehmerweise als Datenquelle eine XML Datei angegeben werden kann. Zum Aufruf der zur Datei assoziierten Anwendung kann der Action Script Befehl „fscommand()“ verwendet werden.

Leider gibt es bei der Verwendung von „fscommand()“ einen kleinen Nachteil, nämlich dass sich zur korrekten Ausführung des Befehls der Ordner „fscommand“ direkt unterhalb der aufrufenden CD-Anwendung befinden muss und nur dort liegende Dateien angesprochen werden können. Bei sehr vielen Dokumenten ist das nicht unbedingt die angenehmste Lösung.

Ein findiger Flash Profi hat jedoch Abhilfe geschaffen und das kostenlose Tool „UniLauncher“ programmiert, welches ermöglicht, den absoluten oder relativen Pfad zu einem Dokument innerhalb einer INI-Datei anzugeben und somit die Dokumente in einer eigene Ordnerstruktur unterhalb des CD-Root Ordners abzulegen. Leider kann auch „UniLauncher“ nicht den Nachteil des „fscommand()“ Befehls beheben, dass dieser keine Parameter an ausführbare Dateien übergeben kann. Dies führt dazu, dass für jedes Dokument, welches via der Flash Oberfläche geöffnet werden muss, eine Kopie von „unilauncher.exe“ und „unilauncher.ini“ im Ordner „fscommand“ angelegt werden muss. Wie Sie sich nun sicherlich schon vorstellen können, kann das manuelle Anlegen, Umbennen und Einstellen bei mehreren hundert Dateien schon ziemlich zeitraubend werden.

UFT-8 XML Files in VBA

UFT-8 XML Files in VBA

Deshalb die Idee, ein Tool zur Verwaltung der Strukturen in Excel VBA (ist ja nun mal auch mein Spezialgebiet) zu entwickeln. Das Tool liest alle Dateien des CD Projektes ein (inklusive einer Auswahl von Dateitypen, die berücksichtigt werden sollen), erzeugt die Kopien von „unilauncher.exe“ und generiert die passenden INI-Dateien dazu. Da in der Flash-Anwendung mehrere an XML-Dateien List-Komponenten zum Einsatz kommen, werden vom Excel Tool die passenden XML-Dateien im UTF-8 Format gleich mit generiert. UTF-8 ist hier deshalb wichtig, weil auch Beschreibungstexte in Russisch vorhanden sein sollen.

Schauen wir uns nun die Struktur eine solchen XML-Datei an. Diese enthalten ein Wurzelelement mit einer variablen Anzahl von Unterschlüsseln „Data“. In diesen wiederum sind die Attribute „Key“, „Title“, „Path“ und „File“ abgelegt. Der Titel „Title“ wird später von der Flash-Anwendung eingelesen und die Listen dort gefüllt.

UFT-8 XML Files in VBA

Folgend, zu Informationszwecken, ein Screenshot des Codes innerhalb der Flash Datei. Die interessanten Stellen sind rot umrandet; hier wird einerseits die XML Datei in das Listensteuerelement eingelesen und anderseits bei einem Klick auf einen Eintrag der Befehl „fscommand()“ ausgelöst.

UFT-8 XML Files in VBA

XML Dateien bzw. INI-Dateien sind letzen Endes nur Textdateien. Bei den INI-Dateien ist in unserem Fall kein UTF-8 Format notwendig, es ist also vollkommen ausreichend, folgende VBA Befehle zum Erzeugen der Datei zu verwenden.

Die XML-Dateien müssen jedoch im UTF-8 Format gespeichert werden. Hierzu gibt es einige Möglichkeiten, wie zum Beispiel die Verwendung der Scripting Runtime. Eine aus meiner Sicht sehr elegante Lösung ist jedoch folgende:

Hier wird einfach ein ADODB.Stream Objekt instanziiert und die Datei problemlos und komfortabel erstellt. Die Lösung hatte ich im Internet gefunden, ein Link zur Quelle finden Sie am Ende des Artikels.

Ein Tool, welches bereits eingepflegte Elemente nicht wieder einlesen kann, ist meines Erachtens nicht besonders hilfreich. Deshalb ist auch eine Funktion enthalten, die die XML Dateien wieder einliest und entsprechende Attributwerte extrahiert. Hierzu kann in VBA über einen Verweis auf die MSXML Bibliotheken komfortabel auf die XML-Dokument-
struktur oder Elemente zugegriffen werden. Unsere XML Struktur ist, wie bereits gesehen, relativ einfach. Im folgenden Auszug vom Code wird eine Liste von XML-Dateien (mlvpSheetBuilderXMLFile) in einer Schleife ausgelesen. Für jedes Kindelement – also hier „Data“ unterhalb „Root“ – werden dann die Attribute ausgelesen und in einer Tabelle der Mappe abgelegt.

Letzter Punkt, um das Tool zu vervollständigen, wäre das Einlesen der Verzeichnisse sowie aller enthaltener Dateien. Hierzu habe ich entsprechende Windows API Funktionen verwendet. Die Funktionen hierzu sind im Modul MLP_Api in der Funktion „mlfpRead(…)“ zu finden, wobei beim Einlesen der Dateien auch gleichzeitig diese in die entsprechende Tabelle der Mappe geschrieben werden. Da dieser Code etwas umfangreicher ist, verzichte ich an dieser Stelle auf einen Auszug.

Um dem User eine komfortable Auswahl des CD-Root Ordner zu ermöglichen, habe ich ebenfalls API Funtionen verwendet. Schmankerl dabei ist, dass der BrowseForFolder Dialog hier auch sich den zuletzt ausgewählten Ordner merkt; Stichwort Callback-Funktionen. Folgend ein Auszug des Codes:

Folgend der Link zum Download des Tools. Bitte beachten Sie, dass keinerlei Gewähr, Garantie oder sonstiges für das Tool übernommen werden kann. Auch kann kein Support geleistet werden. Allerdings freue ich mich über jede Rückmeldung oder Anregungen zu dem Tool. Auch, falls es in einem Ihrer Projekte Verwendung finden sollte, wäre ein Link schön.

» Beispielmappe mit dem Excel VBA Tool

Abschließend die Links zum UniLauncher Tool und einem Code zum Generieren von Dateien im UTF-8 Format:

Diesen Artikel habe ich auch in meinem Blog bei www.software.maninweb.de
und im englischen Excel Ticker publiziert.

Mourad Louha

Über den Autor · Mourad Louha

Mourad arbeitet seit 2005 als selbständiger Softwareentwickler und Trainer und lebt in Aachen, gelegen am Dreiländereck Belgien, Deutschland und Niederlande. In seiner Freizeit engagiert er sich in Online Communities rund um Office, schreibt beim Excel Ticker Artikel zu Office & Co. und betreibt weitere Community Projekte in Zusammenarbeit mit Freunden und Partnern, wie das Forum zu Microsoft Office 365 und Office 2013, den Excel Soccer oder den Excel Formel Übersetzer. Für sein außergewöhnliches Engagement wurde er seit Januar 2011 jährlich von Microsoft als Microsoft Most Valuable Professional (MVP) ausgezeichnet.

 
Comments

Hy Mourad,
es ist mir immer wieder eine Freude Deine Artikel zu lesen !
Ideenreich und pfiffig voll geballtem Fachwissenund dennoch flüssig und gut lesbar geschrieben!
Klasse !!
Frohe Ostern
Andreas

Hi Andreas,

Danke, Danke. Dir auch schöne Ostertage :-)

Viele Grüße, Mourad

Hey Mourad,

ich habe eine Excel-Tabelle aus der mittels VBA eine XML exportiert wird.
Nun ist es notwendig, dass ich diese in UFT 8 ohne BOM umwandel.
Kann ich das gleich in dem bestehenden „XML-Export“- Code machen oder ist das nicht ohne weiteres möglich?

Gruss Tom

Hallo Tom,

erstmal sorry für’s späte Freischalten, aber der Blog und ein paar andere Websites von mir werden momentan zugespammt. Hatte Deinen Kommentar leider zunächst übersehen.

Zu Deiner Frage: ich würde sagen, nein; jedenfalls ist mir aktuell nichts bekannt. Die ADODB-Methode ist m.W. bislang die zuverlässigste.

Viele Grüße, Mourad

Leave a Reply