<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Excel Ticker &#187; Tools</title>
	<atom:link href="http://www.excel-ticker.de/category/allgemein/tools/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.excel-ticker.de</link>
	<description>News, Tipps &#38; Tricks rund um Excel sowie anderen Microsoft Produkten</description>
	<lastBuildDate>Wed, 25 Aug 2010 17:08:21 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=abc</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Microsoft Visual Studio LightSwitch Beta &#8211; Tutorial für Einsteiger</title>
		<link>http://www.excel-ticker.de/microsoft-visual-studio-lightswitch-beta-tutorial-fuer-einsteiger/</link>
		<comments>http://www.excel-ticker.de/microsoft-visual-studio-lightswitch-beta-tutorial-fuer-einsteiger/#comments</comments>
		<pubDate>Wed, 25 Aug 2010 17:08:21 +0000</pubDate>
		<dc:creator>Mourad Louha</dc:creator>
				<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Sonstiges]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Addon]]></category>
		<category><![CDATA[LightSwitch]]></category>
		<category><![CDATA[RAD]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://www.excel-ticker.de/?p=2689</guid>
		<description><![CDATA[

Seit dem 23. August 2010 ist die englische Beta-Version zu „Microsoft Visual Studio LightSwitch“ verfügbar, ein Produkt, auf das ich mit Spannung gewartet hatte. Dieser Artikel dreht sich somit weniger um Office &#038; Co. &#8211; obwohl doch nicht so ganz, denn in späteren Versionen von LightSwitch ist eine Anbindung an Access Datenbanken vorgesehen. Ausserdem kann [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-top:-18px; margin-right:-8px; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwww.excel-ticker.de%252Fmicrosoft-visual-studio-lightswitch-beta-tutorial-fuer-einsteiger%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2F9YJ5PI%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Microsoft%20Visual%20Studio%20LightSwitch%20Beta%20-%20Tutorial%20f%C3%BCr%20Einsteiger%22%20%7D);"></div>
<p>Seit dem 23. August 2010 ist die englische Beta-Version zu „Microsoft Visual Studio LightSwitch“ verfügbar, ein Produkt, auf das ich mit Spannung gewartet hatte. Dieser Artikel dreht sich somit weniger um Office &#038; Co. &#8211; obwohl doch nicht so ganz, denn in späteren Versionen von LightSwitch ist eine Anbindung an Access Datenbanken vorgesehen. Ausserdem kann LightSwitch bereits jetzt schon Daten nach Excel exportieren und einen SharePoint Server als Datenquelle ansprechen.</p>
<p><img style="border: 1px solid #888888;" src="http://www.excel-ticker.de/wp-content/uploads/2010/08/visual.studio.lightswitch.gif" alt="Microsoft Visual Studio LightSwitch" title="Microsoft Visual Studio LightSwitch" /></p>
<p>Die Frage, die sich nun stellt, wofür und für wen ist denn LightSwitch gedacht? Hier möchte ich gerne aus <a href="http://blogs.msdn.com/b/twendel/" target="_blank">Tom Wendel&#8217;s</a> deutschen Artikel „<a href="http://blogs.msdn.com/b/twendel/archive/2010/08/03/lightswitch.aspx" target="_blank">What is Visual Studio LightSwitch</a>“ zitieren, der übrigens auch an der Entwicklung des Produktes mitgewirkt hat:</p>
<p><span id="more-2689"></span></p>
<p style="padding:8px 8px 8px 8px; background-color:#F6F9FA; border:1px solid #999999;"><i>„LightSwitch soll dem Entwickler (Zielgruppe hier vorwiegend die armen Jungs, die in Firmen oft die Doppelrolle des IT-Pros/Devs/Lageristen/Hausmeister haben) das Leben etwas einfacher machen, wenn es darum geht Standard-Software zu erstellen. Ich denke da zurück an meine Freelancer-Zeit und kann sagen, dass ich knapp 90% meine Applikationen, die ich da entwickelt habe, mit LightSwitch erschlagen hätte. Also auch interessant für die Selbständigen, die sich mit diesen Alltagstools in internen Netzwerken auseinander setzen. Halten wir mal fest, dass man mit LightSwitch Software erstellt, für die praktisch kein Budget / Zeitfenster da ist und deren Funktionalität im Vordergrund steht. Und das ist auch schon die einzige Gemeinsamkeit zu Access.“</i></p>
<p>Um LightSwitch zu installieren, kann ein entweder ein DVD ISO Abbild oder ein Web-Installer verwendet werden, der während der Installation die benötigten Dateien aus dem Internet herunterlädt.  Ich habe mich für letzteres entschieden, da dieser aus meiner Sicht die einfachere Variante darstellt. Da LightSwitch ja nun ein Addon zu Visual Studio 2010 darstellt, sollte dieses logischerweise auf dem Zielrechner bereits installiert sein.</p>
<p><img style="border: 1px solid #888888;" src="http://www.excel-ticker.de/wp-content/uploads/2010/08/visual.studio.lightswitch.setup.1.gif" alt="Microsoft Visual Studio LightSwitch" title="Microsoft Visual Studio LightSwitch" /></p>
<p>Nach dem Download des Installers und dessen Aufruf, sind zunächst die Lizenzbestimmungen zu akzeptieren. Anschließend kann zwischen einer direkten oder benutzerdefinierten Installation gewählt werden, wobei letztere automatisch den Installationsordner von Visual Studio 2010 herausgesucht hatte und dieser auch nicht geändert werden konnte.</p>
<p><img style="border: 1px solid #888888;" src="http://www.excel-ticker.de/wp-content/uploads/2010/08/visual.studio.lightswitch.setup.2.gif" alt="Microsoft Visual Studio LightSwitch" title="Microsoft Visual Studio LightSwitch" /></p>
<p>Das Installationsprogramm lädt anschließend alle erforderlichen Dateien herunter und installiert die erforderlichen Komponenten. Das ging bei mir relativ schnell und problemlos von statten. Zum Abschluss bietet der Installer optional an, das Programm direkt zu starten, worauf ich jedoch verzichtet hatte.</p>
<h4>Neues LightSwitch Projekt anlegen</h4>
<p>In Visual Studio 2010 ist nach der Installation die neue Projektvorlage „LightSwitch“ verfügbar, wobei zudem zwischen einem Visual Basic oder einem Visual C# Projekt gewählt werden kann. Das Anlegen des Projektes ist somit ganz einfach: einen Namen für das Projekt vergeben, Ok anklicken, fertig.</p>
<p><img style="border: 1px solid #888888;" src="http://www.excel-ticker.de/wp-content/uploads/2010/08/visual.studio.lightswitch.create.gif" alt="Microsoft Visual Studio LightSwitch" title="Microsoft Visual Studio LightSwitch" /></p>
<p>Visual Studio legt dann das Projekt an und bietet Ihnen eine Einstiegsseite mit den zwei Schaltflächen „Create new table“ und „Attach to external database“ an. Erstere erlaubt eine neue Tabelle im Entwurfsmodus zu erstellen und die zweite Möglichkeit, eine Verbindung zu einem Server (z.B. SQL Server oder SharePoint Server) herzustellen.</p>
<p><img style="border: 1px solid #888888;" src="http://www.excel-ticker.de/wp-content/uploads/2010/08/visual.studio.lightswitch.main.gif" alt="Microsoft Visual Studio LightSwitch" title="Microsoft Visual Studio LightSwitch" /></p>
<h4>Tabellen in LightSwitch entwerfen</h4>
<p>Zur Demonstration einiger Features von LightSwitch habe mir ein einfaches Beispiel überlegt. Nehmen wir an, wir hätten die drei Datenbanktabellen „Artikel“, „Umsatz“ und „Verkäufer“ in unserer Datenbank. Erste Tabelle enthält eine Liste von Verkaufsartikeln; als Felder sind die Artikelnummer, die Artikelbezeichnung, ein Datum zur Erstanlage des Artikels und der Nettopreis definiert. Die Tabelle zu den Verkäufern enthält Felder für den Namen der Person, ein eindeutiges Kürzel sowie optionale Kontaktdaten. In der Tabelle zum Umsatz soll die Möglichkeit bestehen, den Artikel und den Verkäufer auszuwählen, ein Verkaufsdatum anzugeben und nach Eingabe einer Mengenangabe den Umsatz inklusive der Umsatzsteuer zu errechnen.</p>
<p><img style="border: 1px solid #888888;" src="http://www.excel-ticker.de/wp-content/uploads/2010/08/visual.studio.lightswitch.table.gif" alt="Microsoft Visual Studio LightSwitch" title="Microsoft Visual Studio LightSwitch" /></p>
<p>Sobald auf die Schaltfläche „Create new table“ geklickt wurde, legt LightSwitch eine neue Tabelle an und ordnet diese dem Eintrag „ApplicationData“ unter „Data Sources“ zu. Um die Tabelle umzubenennen kann auf den Titeltext in der blauen Titelzeile geklickt werden. Alternativ kann der Name aber auch rechts in der Palette zu den Eigenschaften eingegeben werden. Und LightSwitch legt auch automatisch einen Namen für den Plural der Tabelle an, den ich hier aber in „Artikelliste“ statt „ArtikelSet“ umbenannt habe. Das Anlegen neuer Felder ist intuitiv; einfach in die Zeilen der Tabelle klicken, Name und Datentyp vergeben, fertig. Die Reihenfolge der Felder kann auch nachträglich durch Ziehen und Ablegen mit der Maus festgelegt werden.</p>
<p>Wenn nötig, können pro Datentyp weitere Eigenschaften des Feldes im Eigenschaftsfenster (rechts) festgelegt werden. Beispielsweise für das Feld „Anlagedatum“, wo in den Eigenschaften unter „Validation“ ein Gültigkeitsbereich für das Datum angegeben werden kann. Diese habe ich für dieses Feld statt von „01.01.1753 – 31.12.9999“ auf „01.01.2010 – 31.12.2099“ gesetzt.</p>
<p>In derselben Art und Weise, wie zuvor beschrieben, können die Tabelle zu den Verkäufern und dessen Felder angelegt werden.</p>
<p>Die Tabelle zum Umsatz sieht ein Feld zur Auswahl eines Artikels vor, somit sollte eine Beziehung zwischen den beiden Tabellen erstellt werden. Diese lässt sich über die, in folgender Abbildung im oberen Bereich rot umrahmte, Schaltfläche „Relationship“ sehr komfortabel bewerkstelligen.</p>
<p><img style="border: 1px solid #888888;" src="http://www.excel-ticker.de/wp-content/uploads/2010/08/visual.studio.lightswitch.relationship.gif" alt="Microsoft Visual Studio LightSwitch" title="Microsoft Visual Studio LightSwitch" /></p>
<p>Es öffnet sich ein neues Fenster, in welchem die Tabelle „Artikel“ und der Typ der Beziehung unter „Multiplicity“ ausgewählt werden können. Pfiffig finde ich die Hinweise im unteren Bereich des Fensters, die über die Bedeutung und die Auswirkungen des gewählten Beziehungstyps auf die Datenbank informieren. In ähnlicher Weise kann dann das Feld zur Auswahl des Verkäufers erstellt werden. Anschließend sind noch die Felder zur Angabe der Menge, zur Auswahl Umsatzsteuer und zur Berechnung des Gesamtpreises anzulegen.</p>
<p>Sobald eine Beziehung von einem Feld zu einer anderen Tabelle angelegt wurde, wird dies in der Entwurfsansicht durch eine vereinfachte Darstellung der verknüpften Tabelle visualisiert. Ein Doppelklick auf dieses Symbol öffnet diese dann wiederum in der Entwurfsansicht.</p>
<p><img style="border: 1px solid #888888;" src="http://www.excel-ticker.de/wp-content/uploads/2010/08/visual.studio.lightswitch.choice.gif" alt="Microsoft Visual Studio LightSwitch" title="Microsoft Visual Studio LightSwitch" /></p>
<p>Für die Umsatzsteuer habe ich drei vordefinierte Auswahlmöglichkeiten vorgesehen, die über einen Klick auf den Eintrag „Choice List“ im Eigenschaftsfenster in einem extra Dialog erstellt werden können.</p>
<h4>Ansichten in LightSwitch erstellen</h4>
<p>Nachdem die Tabellen und Beziehungen erstellt wurden, ist es nun sinnvoll, eine Benutzeroberfläche zur Eingabe von Daten zu entwerfen. Zunächst brauchen wir Ansichten, um die Artikel und Verkäufer einzupflegen. Wenn auf die Schaltfläche „Screen“ geklickt wird, öffnet sich ein neues Fenster, in welchem 5 Auswahlmöglichkeiten für eine Darstellung der Eingabemasken angeboten werden. Ich hatte, bevor ich den Artikel an dieser Stelle fortgesetzt hatte, zunächst von jeder dieser Varianten eine Ansicht erstellt und im Debug-Modus ausprobiert. Zu Demonstrationszwecken schien mir dann der Dialog „List and Details Screen“ am besten geeignet.</p>
<p><img style="border: 1px solid #888888;" src="http://www.excel-ticker.de/wp-content/uploads/2010/08/visual.studio.lightswitch.screen.gif" alt="Microsoft Visual Studio LightSwitch" title="Microsoft Visual Studio LightSwitch" /></p>
<p>Der Ansicht sollte ein sinnvoller Name zugewiesen werden, der übrigens eindeutig sein muss. LightSwitch macht auch hier einen Vorschlag, da aber dieser in Englisch ist, habe ich diesen umbenannt. Ausserdem sollte der Ansicht die Tabelle zugewiesen werden, dessen Daten man editieren möchte. Schauen wir uns mal an, wie der Dialog in der Anwendung dann aussieht. Dafür einmal F5 drücken (oder im Hauptmenü „Debuggen“ von Visual Studio 2010 den Eintrag „Debuggen starten“ wählen), um den Debug-Modus von Visual Studio zu starten und die Anwendung auszuführen.</p>
<p><img style="border: 1px solid #888888;" src="http://www.excel-ticker.de/wp-content/uploads/2010/08/visual.studio.lightswitch.articles.debug.gif" alt="Microsoft Visual Studio LightSwitch" title="Microsoft Visual Studio LightSwitch" /></p>
<p>Visual Studio startet vor der Ausführung der Anwendung den internen LightSwitch Server; eine Firewall sollte somit auch Verbindung zum Localhost erlauben. Das Ergebnis ist in der oberen Abbildung zu sehen. Wenn auf die Schaltfläche „Add…“ geklickt wird, erscheint bei dieser Dialogform ein Extra Fenster, um den neuen Artikel anzulegen. Die Eingabefelder sind auch genauso konfiguriert, wie es die Datenbankfelder von ihren Einstellungen her erlauben. Beispielsweise muss die Artikelnummer eine Zahl sein und darf auch nicht leer sein. Ansonsten blendet LightSwitch eine entsprechende Fehlermeldung ein. Änderungen sollten in der Datenbank dann mit „Save“ übernommen werden.</p>
<p>Ein kleiner Hinweis: als ich mehrere Ansichten zu den Artikeln definiert hatte und in einer dieser Ansichten neue Artikel angelegt hatte, wurden die neuen Artikel nicht in den anderen Ansichten angezeigt bzw. aktualisiert. Da half leider auch kein Klick auf den „Refresh“ Button. Das erstmalige Laden der Ansichten bzw. die Aktualisierung dauerte auf meinem Rechner verhältnismäßig lange.</p>
<p><img style="border: 1px solid #888888;" src="http://www.excel-ticker.de/wp-content/uploads/2010/08/visual.studio.lightswitch.articles.view.gif" alt="Microsoft Visual Studio LightSwitch" title="Microsoft Visual Studio LightSwitch" /></p>
<p>In der oberen Abbildung ist der Dialog zu sehen, wie er im Designmodus erscheint, der über einen Doppelklick auf den Baumeintrag rechts oben aufgerufen werden kann. Der gewählte Dialog besteht aus zwei Spalten (links die Liste mit den Artikeln und rechts die Details zum gewählten Artikel). Dieses spiegelt sich in der Designansicht über die zwei Baumeinträge „Left Column“ und „Right Column“ wieder. In diesen sind dann wiederum hierarchisch weitere Steuerelemente angeordnet; zum Beispiel Schaltflächen zum Hinzufügen, Bearbeiten oder Löschen von Datensätzen. Direkt rechts neben dem Namen des Steuerelementes sind kleine Pfeile zu finden, die die Auswahl des Steuerelementtyps bzw. der -gruppe ermöglichen. Beispielsweise könnte man statt der Artikelliste in Listenform (List) auch eine Tabelle wählen (Grid). Die Ansicht passt sich dann automatisch an. Zu jedem Steuerelement können zudem auch spezifische Eigenschaften im Fenster rechts gesetzt werden. Alle diese Eigenschaften aufzuzählen oder Steuerelemente durchzugehen, würde den Rahmen des Artikels jedoch deutlich sprengen.</p>
<p>Ein Punkt sollte aber nicht unerwähnt bleiben: beim Anlegen des Dialoges wurde automatisch das Element „ArtikelCollection“ angelegt, welches auch links im Screenshot zu sehen ist. Die Collection entspricht letzten Endes dem kompletten Inhalt der Artikeltabelle. Es lassen sich aber auch Filter definieren. Ich hatte in meinem Beispiel im Debug-Modus drei Artikel angelegt: „Computersoftware“ mit der Artikelnummer 1000, „Computerbuch“ mit der Nummer 2000 und „Computermagazin“ mit der Nummer 3000. Wenn ich mir vorstelle, alle Artikel mit einer Nummer zwischen 2000 und 2999 wären Bücher, könnte ich eine gefilterte Ansicht erstellen, die nur die Bücher aufführt. Links oben neben „ArtikelCollection“ ist eine Schaltfläche „Edit Query“ zu finden, die zu einer Bearbeitungsansicht der Abfrage führt.</p>
<p><img style="border: 1px solid #888888;" src="http://www.excel-ticker.de/wp-content/uploads/2010/08/visual.studio.lightswitch.query.gif" alt="Microsoft Visual Studio LightSwitch" title="Microsoft Visual Studio LightSwitch" /></p>
<p>Es kann dann, auch wiederum sehr komfortabel, ein Filter erstellt werden, der die Anzeige der Artikelnummer auf das gewünschte Werteintervall begrenzt. Ein Sortierkriterium kann ebenfalls festgelegt werden. Und komplexere Filter lassen sich zudem parametrisieren.</p>
<h4>Berechnungsfeld in LightSwitch erstellen</h4>
<p>Die Tabelle zum Umsatz enthält das Feld „Gesamtpreis“, welches, je nach Mengenangabe und Auswahl der Umsatzsteuer den Gesamtpreis anzeigen soll. In der Entwurfsansicht ist die Schaltfläche „Computed Property“ zu sehen, die ein neues Feld an die Feldliste anhängt und als dynamisches Berechnungsfeld markiert. Nachträglich kann aber auch ein Haken im Eigenschaftsfenster gesetzt werden.</p>
<p><img style="border: 1px solid #888888;" src="http://www.excel-ticker.de/wp-content/uploads/2010/08/visual.studio.lightswitch.computed.gif" alt="Microsoft Visual Studio LightSwitch" title="Microsoft Visual Studio LightSwitch" /></p>
<p>Um die Berechnung durchzuführen, müssen wir ein klein wenig Code erstellen. Über einen Klick auf „Edit Method“ wird ein Codefenster geöffnet. Dort findet man eine vorgefertigte Prozedur vor, die nur noch mit der Anweisung zur Berechnung gefüllt werden müsste.</p>
<p><img style="border: 1px solid #888888;" src="http://www.excel-ticker.de/wp-content/uploads/2010/08/visual.studio.lightswitch.code.gif" alt="Microsoft Visual Studio LightSwitch" title="Microsoft Visual Studio LightSwitch" /></p>
<p>Das Berechnen des Gesamtpreises ist nicht sonderlich schwer: Gesamtpreis = Menge * Nettopreis * (1 + Umsatzsteuer / 100). Danach verblieben noch die Erstellung der Ansicht zur Eingabe des Umsatzes und das Testen im Debugger.</p>
<p><img style="border: 1px solid #888888;" src="http://www.excel-ticker.de/wp-content/uploads/2010/08/visual.studio.lightswitch.result.gif" alt="Microsoft Visual Studio LightSwitch" title="Microsoft Visual Studio LightSwitch" /></p>
<p>Die Tabelle kann auch nach Excel exportiert werden, dazu braucht nur die Schaltfläche „Export to Excel“ angeklickt zu werden. LightSwitch erkennt momentan jedoch nicht eine geöffnete Excel Instanz, sondern öffnet eine neue. Und hatte bei mir immer Excel 2003 geöffnet, obwohl auch 2007 und 2010 installiert sind. Die Titel der Spalten werden ebenfalls mitexportiert.</p>
<h4>Weitere Beispiele für LightSwitch</h4>
<p>Unter der Adresse <a href="http://code.msdn.microsoft.com/lightswitch" target="_blank">http://code.msdn.microsoft.com/lightswitch</a> ist meines Erachtens eine gelungene englischsprachige Beispielanwendung zu finden, die viele weitere der Möglichkeiten von LightSwitch vorstellt und sich prima zum Üben eignet. Zudem ist ein Tutorial zum Projekt ebenfalls auf MSDN zu finden. Weitere Links sind am Ende des Artikels aufgeführt.</p>
<p><img style="border: 1px solid #888888;" src="http://www.excel-ticker.de/wp-content/uploads/2010/08/visual.studio.lightswitch.vision.clinic.gif" alt="Microsoft Visual Studio LightSwitch" title="Microsoft Visual Studio LightSwitch" /></p>
<h4>Fazit</h4>
<p>Dieses kleine Tutorial zum Einstieg in LightSwitch deckt sicherlich nur einen kleinen Teil der Fähigkeiten von dem Programm ab. Was ich aber bislang gesehen habe, gefällt mir außerordentlich gut. Ich kann mir durchaus vorstellen, das Tool beispielsweise zum Prototyping zu verwenden oder ein paar Interfaces zu Datenbanken zu erstellen; wenn nicht gar komplette Anwendungen. Abstürze oder ähnliches sind bei mir während des Testens nicht vorgekommen. Eine kleine Merkwürdigkeit trat auf, nämlich dass die Liste zur Umsatzsteuer mir das Feld immer mit einer 3 initialisiert hatte. Insgesamt freue ich mich aber schon sehr auf weitere Versionen von LightSwitch.</p>
<ul>
<li><a href="http://www.microsoft.com/germany/visualstudio/products/lightswitch/default.aspx" target="_blank">Visual Studio LightSwitch, Deutsch</a></li>
<li><a href="http://www.microsoft.com/visualstudio/en-us/lightswitch" target="_blank">Visual Studio LightSwitch, Englisch</a></li>
<li><a href="http://msdn.microsoft.com/en-us/lightswitch/default.aspx" target="_blank">LightSwitch Developer Center, Englisch</a></li>
<li><a href="http://msdn.microsoft.com/en-us/library/ff851953.aspx" target="_blank">MSDN, Visual Studio LightSwitch Beta 1, Englisch</a></li>
<li><a href="http://msdn.microsoft.com/en-us/library/ee256749.aspx" target="_blank">MSDN, Creating the Vision Clinic Application, Englisch</a></li>
<li><a href="http://code.msdn.microsoft.com/lightswitch" target="_blank">Beispiele zu Visual Studio LightSwitch, Englisch</a></li>
<li><a href="http://blogs.msdn.com/b/twendel/" target="_blank">Tom Wendel&#8217;s Blog, Deutsch</a></li>
<li><a href="http://blogs.msdn.com/b/jasonz/archive/2010/08/23/lightswitch-beta1-now-available-building-your-first-app.aspx" target="_blank">Jason Zander&#8217;s Blog, Tutorial zu LightSwitch, Englisch</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.excel-ticker.de/microsoft-visual-studio-lightswitch-beta-tutorial-fuer-einsteiger/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Excel VBA Application Objekte per Windows API erzeugen (Teil 2)</title>
		<link>http://www.excel-ticker.de/excel-vba-application-objekte-per-windows-api-erzeugen-teil-2/</link>
		<comments>http://www.excel-ticker.de/excel-vba-application-objekte-per-windows-api-erzeugen-teil-2/#comments</comments>
		<pubDate>Wed, 18 Aug 2010 16:34:23 +0000</pubDate>
		<dc:creator>Mourad Louha</dc:creator>
				<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Excel]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[VBA]]></category>
		<category><![CDATA[Accessible]]></category>
		<category><![CDATA[Binding]]></category>
		<category><![CDATA[Handles]]></category>
		<category><![CDATA[Objects]]></category>
		<category><![CDATA[Windows API]]></category>

		<guid isPermaLink="false">http://www.excel-ticker.de/?p=2621</guid>
		<description><![CDATA[

In meinem Artikel „Excel VBA Application Objekte per Windows API erzeugen (Teil 1)“ hatte ich eine Möglichkeit vorgestellt, wie über Windows API Funktionen alle geöffneten Excel Instanzen ermittelt werden können und gegebenenfalls daraus VBA Application Objekte erzeugt werden können. Das funktionierte jedoch nur mit den Excel Instanzen, in denen eine Arbeitsmappe geöffnet war. Dieser Artikel [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-top:-18px; margin-right:-8px; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwww.excel-ticker.de%252Fexcel-vba-application-objekte-per-windows-api-erzeugen-teil-2%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2FblTgyi%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Excel%20VBA%20Application%20Objekte%20per%20Windows%20API%20erzeugen%20%28Teil%202%29%22%20%7D);"></div>
<p>In meinem Artikel „<a href="http://www.excel-ticker.de/excel-vba-application-objekte-per-windows-api-erzeugen-teil-1/">Excel VBA Application Objekte per Windows API erzeugen (Teil 1)</a>“ hatte ich eine Möglichkeit vorgestellt, wie über Windows API Funktionen alle geöffneten Excel Instanzen ermittelt werden können und gegebenenfalls daraus VBA Application Objekte erzeugt werden können. Das funktionierte jedoch nur mit den Excel Instanzen, in denen eine Arbeitsmappe geöffnet war. Dieser Artikel stellt nun eine Lösung vor, wie in Excel Instanzen ohne geöffnete Mappe per Windows API eine neue Mappe angelegt wird und anschließend das VBA Application Objekt erzeugt wird.</p>
<p><img style="border: 1px solid #888888;" src="http://www.excel-ticker.de/wp-content/uploads/2010/08/excel.handles.instances.gif" alt="VBA Window Handles" title="VBA Window Handles" /></p>
<p>Die Idee war insofern, ein neues Dokument in der Excel Instanz anzulegen und anschließend den Scan-Vorgang für alle Fensterhandles in dieser Instanz zu wiederholen. Um ein neues Dokument in Excel anzulegen, kann die Tastenkombination „Strg + N“ verwendet werden. Am einfachsten wäre es sicherlich einfach den Tastendruck und gedrückt halten für „Strg“ und anschließend die Taste „N“ zu simulieren.</p>
<p><span id="more-2621"></span></p>
<p>Mein erster Versuch die Tastenkombination „Strg + N“ an eine bestimmte Excel Instanz zu senden bestand im Wesentlichem darin, mir den aktuellen Tastaturstatus zu merken, die Taste „Strg“ auf gedrückt zu setzen, das Hauptfenster der Zielinstanz in der Vordergrund zu holen und die Taste „N“ per Windows API Funktion „PostMessage()“ an die Instanz zu senden. Abschließend hatte ich dann den Tastaturstatus wieder restauriert.</p>
<p>Leider hat diese Methode nicht funktioniert. Excel erkennt nicht, das die „Strg“ Taste gedrückt ist. Ich vermute, dass Excel den Status der Tastatur laufend für sich abfragt, so dass keine Chance (jedenfalls habe ich keine Möglichkeit gefunden) besteht, da einzugreifen.</p>
<p>Insofern musste ich mir eine andere Lösung überlegen. Windows stellt auch die Funktion „SendInput()“ zur Verfügung, die das direkte Senden einer Tastenfolge ermöglicht. Die Funktion erwartet ein Array von „INPUT“ Strukturen. Die Struktur unterscheidet zwischen Maus-, Tastatur- und Hardwareereignissen. Insofern optimal für mich. Folgend ein Auszug des Codes, wie er nun im Tool implementiert ist:</p>
<textarea name="code" class="vba" cols="60" rows="10">
' Private...
  
  Private Const mlchInputKeyboard             As Long = 1
  Private Const mlchEventKeyDown              As Long = &#038;H0
  Private Const mlchEventKeyUp                As Long = &#038;H2

' Private...
  
  Private Declare Sub apiCopyMemory Lib "kernel32" _
          Alias "RtlMoveMemory" (pDst As Any, _
                                 pSrc As Any, _
                                 ByVal ByteLen As Long)

  Private Declare Function apiSendInput Lib "user32.dll" _
          Alias "SendInput" (ByVal nInputs As Long, _
                                   pInputs As apiInput, _
                             ByVal cbSize As Long) As Long
  
  Private Declare Function apiSetForegroundWindow Lib "user32" _
          Alias "SetForegroundWindow" (ByVal hwnd As Long) As Long
  
' Types...
  
  Private Type apiInput
    
    dwType          As Long
    xi(0 To 23)     As Byte
    
  End Type
  
  Private Type apiInputKeyboard
    
    wVk             As Integer
    wScan           As Integer
    dwFlags         As Long
    time            As Long
    dwExtraInfo     As Long
    
  End Type
  
' Send...
  
  Public Function mlfpApiSendCreateDocument(Handle As Long, _
                                            Control As Long, _
                                            Key As Long) As Long
    
    Dim t(0 To 3) As apiInput
    Dim k(0 To 3) As apiInputKeyboard
    
'   Errors...
    
    On Error Resume Next
    
'   Inputs...
    
    k(0).wVk = Control
    k(1).wVk = Key
    k(2).wVk = Key
    k(3).wVk = Control
    
    k(0).dwFlags = mlchEventKeyDown
    k(1).dwFlags = mlchEventKeyDown
    k(2).dwFlags = mlchEventKeyUp
    k(3).dwFlags = mlchEventKeyUp
    
    t(0).dwType = mlchInputKeyboard
    t(1).dwType = mlchInputKeyboard
    t(2).dwType = mlchInputKeyboard
    t(3).dwType = mlchInputKeyboard
    
'   Copy...
    
    apiCopyMemory t(0).xi(0), k(0), Len(k(0))
    apiCopyMemory t(1).xi(0), k(1), Len(k(1))
    apiCopyMemory t(2).xi(0), k(2), Len(k(2))
    apiCopyMemory t(3).xi(0), k(3), Len(k(3))
    
'   Activate...
    
    apiSetForegroundWindow Handle
    
'   Message...
    
    apiSendInput 4, t(0), Len(t(0))
    
'   Activate...
    
    apiSetForegroundWindow Application.hwnd
    
'   Return...
    
    mlfpApiSendCreateDocument = Err.LastDllError
    
  End Function
</textarea>
<p>Die Tastenfolge, um nun ein neues Dokument in der Excel Instanz anzulegen wäre dann, „Strg gedrückt“, „N gedrückt“, „N losgelassen“ und „Strg losgelassen“. </p>
<p>Dies spiegelt sich in der Funktion durch das Füllen der 4 Variablen k(0), k(1), k(2) und k(3) sowie Zuordnen dieser zu Elementen der Variablen „t“ vom Typ „apiInput“. Letzterer Typ entspricht dem zuvor erwähnten Windows API Typ „INPUT“. Anschließend wird das Hauptfenster der Excel Instanz in den Vordergrund geholt und die API Funktion zum Senden der Tastenkombination an die Excel Instanz aufgerufen. Die „4“ im ersten Parameter entspricht der Anzahl der Elemente im übergebenen Array; hier also t(0) bis t(3). Schließlich wird das Excel Fenster wieder aktiviert, in dem der Code läuft. Das war’s auch schon und funktioniert auf meinem Rechner zuverlässig.</p>
<p><img style="border: 1px solid #888888;" src="http://www.excel-ticker.de/wp-content/uploads/2010/08/excel.handles.create.gif" alt="VBA Window Handles" title="VBA Window Handles" /></p>
<p>Den Code in der UserForm zum Tool habe ich zudem noch etwas angepasst bzw. erweitert. Wenn eine Excel Instanz gefunden wird, die keine geöffnete Mappe beinhaltet, zeigt das Tool die Schaltfläche „Create new document“ an. Ausserdem habe ich den Code leicht verbessert. Das Tool erhebt jedoch keinen Anspruch auf Fehlerlosigkeit oder Vollständigkeit; es wurde nur zum Zweck des Testens der API Funktionen entwickelt.</p>
<p>Das Tool enthält jetzt auch eine Möglichkeit, geöffnete Word Instanzen zu ermitteln und daraus Word VBA Application Objekt zu generieren. Während bei Excel nach „XLMAIN“ gesucht wird, ist bei Word „OpusApp“ zu verwenden (wer auch immer darauf gekommen ist). Da jedoch auch Word Fenster auftauchten, die keinen Namen haben, habe ich ebenfalls den Code zum Füllen des Treeviews so angepasst, dass diese Fenster nicht berücksichtigt werden.</p>
<p>Zusammenfassend heißt das nun, dass, zu mindestens in meiner Systemumgebung, aus <span style="font-weight:bold;">jeder geöffneten Excel Instanz</span> per Windows API ein Application Objekt generiert werden kann, über welches der Zugriff mit VBA auf die Excel Instanz möglich wird. Dies funktioniert auch mit Word und würde meines Erachtens auch mit PowerPoint gehen, wobei aber bei PowerPoint die Klassennamen der Fenster von Version zu Version unterschiedlich sind.</p>
<p>
<ul>
<li><a href="http://www.software.maninweb.de/marketing.php?Language=en&#038;File=Handles.2&#038;Extension=zip&#038;Source=www.excel-ticker.de" target="_blank">Download der Beispielanwendung in der Version 2</a></li>
</ul>
<ul>
<li><a href="http://msdn.microsoft.com/en-us/library/ms646310%28VS.85%29.aspx" target="_blank">MSDN, Windows API, SendInput Function, Englisch</a></li>
<li><a href="http://msdn.microsoft.com/en-us/library/ms646270%28v=VS.85%29.aspx" target="_blank">MSDN, Windows API, INPUT Structure, Englisch</a></li>
<li><a href="http://msdn.microsoft.com/en-us/library/ms646271%28v=VS.85%29.aspx" target="_blank">MSDN, Windows API, KEYBDINPUT Structure, Englisch</a></li>
<li><a href="http://allapi.mentalis.org/apilist/SendInput.shtml" target="_blank">AllApi, SendInput Function inklusive Beispiel, Englisch</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.excel-ticker.de/excel-vba-application-objekte-per-windows-api-erzeugen-teil-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Das Microsoft Mathematik Addin für Word und OneNote</title>
		<link>http://www.excel-ticker.de/das-microsoft-mathematik-addin-fur-word-und-onenote/</link>
		<comments>http://www.excel-ticker.de/das-microsoft-mathematik-addin-fur-word-und-onenote/#comments</comments>
		<pubDate>Sun, 15 Aug 2010 13:57:43 +0000</pubDate>
		<dc:creator>Mourad Louha</dc:creator>
				<category><![CDATA[Office]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Word]]></category>
		<category><![CDATA[Addin]]></category>
		<category><![CDATA[Mathematik]]></category>

		<guid isPermaLink="false">http://www.excel-ticker.de/?p=2600</guid>
		<description><![CDATA[

Microsoft hat am 14. August ein Mathematik Addin für Word und OneNote veröffentlicht. Mit diesem Addin lassen sich mathematische Berechnungen bequem in Word oder OneNote durchführen. Dies beinhaltet Standardfunktionen, wie beispielsweise Logarithmen oder Trigonometrie Funktionen, und komplexere Funktionen, wie Intergrale oder statistische Funktionen. Zudem lassen sich mit dem Tool grafische Darstellungen erstellen. Momentan ist das [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-top:-18px; margin-right:-8px; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwww.excel-ticker.de%252Fdas-microsoft-mathematik-addin-fur-word-und-onenote%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2F9GPPL6%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Das%20Microsoft%20Mathematik%20Addin%20f%C3%BCr%20Word%20und%20OneNote%22%20%7D);"></div>
<p>Microsoft hat am 14. August ein <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=ca620c50-1a56-49d2-90bd-b2e505b3bf09&#038;displaylang=en" target="_blank">Mathematik Addin für Word und OneNote</a> veröffentlicht. Mit diesem Addin lassen sich mathematische Berechnungen bequem in Word oder OneNote durchführen. Dies beinhaltet Standardfunktionen, wie beispielsweise Logarithmen oder Trigonometrie Funktionen, und komplexere Funktionen, wie Intergrale oder statistische Funktionen. Zudem lassen sich mit dem Tool grafische Darstellungen erstellen. Momentan ist das Addin zwar nur in Englisch verfügbar, jedoch so einfach gehalten, dass verhältnismäßig geringe Englischkenntnisse notwendig sind.</p>
<p><img style="border: 1px solid #888888;" src="http://www.excel-ticker.de/wp-content/uploads/2010/08/word.math.setup.1.gif" alt="Microsoft Math Addin" title="Microsoft Math Addin" /></p>
<p>Nach dem Download kann die Installationsroutine über die ausführbare Datei „MASetup.exe“ gestartet werden. Der Willkommensseite zum Setup folgen eine Seite zum Akzeptieren der Lizenzbestimmungen und eine Seite zur Angabe des Installationspfades.</p>
<p><span id="more-2600"></span></p>
<p><img style="border: 1px solid #888888;" src="http://www.excel-ticker.de/wp-content/uploads/2010/08/word.math.setup.2.gif" alt="Microsoft Math Addin" title="Microsoft Math Addin" /></p>
<p>Die Installation verlief auf meinem Rechner (Windows 7, Office 2003 &#038; 2007 MUI und Office 2010 Deutsch) problemlos. Dass Addin nutzt übrigens DirectX zum Rendern von Grafiken, weshalb nach der Installation des Addins auf meinem Rechner zusätzlich eine Versionsüberprüfung der installierten DirectX Komponenten durchgeführt wurde.</p>
<p>Als Voraussetzungen werden auf der Downloadseite ein die Windows Betriebssysteme Windows XP SP3, Windows Vista SP2, Windows 7, Windows Server 2003 SP2, Windows Server 2008 SP2 oder Windows Server 2008 R2 genannt. Zudem sollte das .NET Framework 3.5 SP1 installiert sein. Das Addin läuft in Word 2007, Word 2010 und OneNote 2010.</p>
<p><img style="border: 1px solid #888888;" src="http://www.excel-ticker.de/wp-content/uploads/2010/08/word.math.ribbon.gif" alt="Microsoft Math Addin" title="Microsoft Math Addin" /></p>
<p>Nach dem nächsten Start einer der vorgesehenen Anwendungen, wie beispielsweise Word 2010, stellt das Addin den neuen Reiter „Mathematics“ im Menüband zur Verfügung. Gegebenenfalls werden Sie einmalig gefragt, die Ausführung des Addins zu erlauben.</p>
<p>Über die Schaltfläche „Help“ kann die integrierte Hilfe zur Anwendung aufgerufen werden, die übrigens recht ausführlich ist und einige Anleitungen zum Tool bietet.</p>
<p>Um eine Berechnung durchzuführen, muss zunächst eine mathematische Formel eingefügt werden. Die Schaltfläche „Equation“ ist ein Abbild der in Word enthalten Schaltfläche „Formel“, die im Reiter „Einfügen“ zu finden ist. Das Addin merkt, ob die Formel über den Standardweg eingefügt wurde.</p>
<p>An dieser Stelle kurz der Hinweis zu meinem Artikel „<a href="http://www.excel-ticker.de/mathematische-formeln-in-office-im-linearmodus-erstellen/">Mathematische Formeln in Office im Linearmodus erstellen</a>“, wo beschrieben wird, wie der Linearmodus zum Erstellen von Formeln bzw. mathematischen Gleichungen in Word genutzt werden kann. Der Linearmodus dürfte insbesondere für „Vielschreiber“ interessant sein und nutzt eine ähnliche Syntax wie Latex.</p>
<p>Zum Ausprobieren der Funktionen des Addins habe ich mir die Gauß-Verteilung bzw. Normal-Verteilung aus dem Bereich der Wahrscheinlichkeitstheorie herausgesucht. Einerseits ist die Funktion nicht zu einfach (ein bisschen herausfordern wollte ich das Addin schon) und andererseits dürfte die „Gaußsche Glockenkurve“ relativ gut bekannt sein. So nebenbei, erinnern Sie sich? Auf dem 10 D-Mark Schein war Carl Friedrich Gauß inklusive der Glockenkurve abgebildet.</p>
<p><img style="border: 1px solid #888888;" src="http://www.excel-ticker.de/wp-content/uploads/2010/08/word.math.gauss.gif" alt="Microsoft Math Addin" title="Microsoft Math Addin" /></p>
<p>Eine, meines Erachtens, sehr schöne und verständliche Erläuterung zur Gauß-Verteilung habe ich auf einer Website der Stadt Göttingen gefunden. Der Artikel unter der Rubrik „<a href="http://www.gauss-goettingen.de/gauss_kniffelig_norm.php" target="_blank">Gauß kniffelig</a>“ enthält auch einen Online Rechner zum direkten Ausprobieren der Verteilung.</p>
<p>In dem Beispiel geht es darum 10 Münzen zu werfen, die auf der Vorderseite mit „0“ und auf der Rückseite mit „1“ beschriftet sind. Nach jedem Wurf werden die Werte aller Münzen addiert; wenn beispielsweise bei 4 Münzen nach dem Wurf die Rückseite oben liegt, notieren wir als Summe „4“. Wenn nun die Würfe und das Addieren der Einzelwerte sehr oft wiederholt werden, wird man feststellen, dass häufiger Summen wie „4“, „5“ oder „6“ vorkommen als „0“, „1“, „9“ oder „10“.</p>
<p>Die Verteilung der Summen pro Wurf kann mathematisch abgebildet werden und in Form einer „Wahrscheinlichkeitsdichte“ f(x) visualisiert werden.</p>
<p><img style="border: 1px solid #888888;" src="http://www.excel-ticker.de/wp-content/uploads/2010/08/word.math.formula.1.gif" alt="Microsoft Math Addin" title="Microsoft Math Addin" /></p>
<p>Wenn wir diese Formel in eine vereinfachte Form überführen, indem wir annehmen, dass µ=0 und sigma=1 sind, erhalten die Dichtefunktion für eine Standardnormalverteilung:</p>
<p><img style="border: 1px solid #888888;" src="http://www.excel-ticker.de/wp-content/uploads/2010/08/word.math.formula.2.gif" alt="Microsoft Math Addin" title="Microsoft Math Addin" /></p>
<p>Sobald das Addin die Gleichung berechnen bzw. ein Kurvendiagramm erzeugen kann, werden die entsprechenden Punkte im Ribbon freigeschaltet. Damit das Erstellen der Kurven hier jedoch funktioniert, sollte der Funktionsname „f(x)“ durch einen einfacheren, wie beispielsweise „y“ ersetzt werden. Ansonsten nimmt das Addin an, dass es sich bei „f“ und „x“ um zwei verschiedene Parameter handelt. Nach dem Anklicken der Formel, steht in unserem Beispiel unter dem Punkt „Graph“ der Menüpunkt „Plot in 2D“ zur Verfügung. Der Aufruf erzeugt ein neues Fenster, wie in folgender Abbildung zu sehen.</p>
<p><img style="border: 1px solid #888888;" src="http://www.excel-ticker.de/wp-content/uploads/2010/08/word.math.plot.2d.gif" alt="Microsoft Math Addin" title="Microsoft Math Addin" /></p>
<p>Im Fenster sind am linken Rand ein paar Optionen vorhanden, um beispielsweise die Grafik zu skalieren oder die Achsen ein- und auszublenden. Richtig cool finde ich die Funktion „Trace“, die ein Fenster einblendet, welches der Kurve entlang läuft und die x- und y-Werte anzeigt. Über die Schaltfläche „Insert“ kann die Grafik direkt in Form eines Inhaltssteuerelementes in das Dokument eingefügt werden. Diese Grafik kann auch nachträglich verändert werden, indem das Element angeklickt wird und im Mathematics Ribbon im Menü „Graph“ der Punkt „Edit graph“ ausgewählt wird. Alternativ kann die Grafik auch im PNG-Format abgespeichert werden.</p>
<p>Als nächstes habe ich die Fähigkeiten des Addins zur Erstellung von 3-D Grafiken ausprobiert. <a href="http://www.arndt-bruenner.de/mathe/mathekurse.htm" target="_blank">Arndt Brünner</a>, der eine sehr umfangreiche Website zu Mathematik und Co. Betreibt, stellt einige Beispielfunktionen zur Verfügung. Um schöne 3-D Effekte zu erhalten bieten sich häufig die Verwendung von Trigonometrie Funktionen an, Beispiel:</p>
<p><img style="border: 1px solid #888888;" src="http://www.excel-ticker.de/wp-content/uploads/2010/08/word.math.formula.3.gif" alt="Microsoft Math Addin" title="Microsoft Math Addin" /></p>
<p>Und nun das Ergebnis vom Addin, erstellt über „Graph – Plot in 3D“:</p>
<p><img style="border: 1px solid #888888;" src="http://www.excel-ticker.de/wp-content/uploads/2010/08/word.math.plot.3d.gif" alt="Microsoft Math Addin" title="Microsoft Math Addin" /></p>
<p>Die Grafik last sich mit der Maus beliebig – animiert wohlgemerkt! – drehen und skalieren. Zudem können andere Wertbereiche gewählt werden und der Effekt direkt beobachtet werden. Der letzte Punkt, den ich ausprobiert habe, ist das Auflösen und Berechnen einer Gleichung. Hier habe ich eine einfache Polynomfunktion verwendet:</p>
<p><img style="border: 1px solid #888888;" src="http://www.excel-ticker.de/wp-content/uploads/2010/08/word.math.formula.4.gif" alt="Microsoft Math Addin" title="Microsoft Math Addin" /></p>
<p>Wenn „Solve – Solve for x“ im Menu „Compute“ oder der Vorgang über einen Rechtsklick auf die Formel und Auswahl der Funktion im Kontextmenü durchgeführt wird, erhalten wir als Lösung der Gleichung folgende zwei Möglichkeiten:</p>
<p><img style="border: 1px solid #888888;" src="http://www.excel-ticker.de/wp-content/uploads/2010/08/word.math.formula.5.gif" alt="Microsoft Math Addin" title="Microsoft Math Addin" /></p>
<p>Während meiner Tests funktioniere das Auflösen einer Gleichung nicht immer; ab und zu erschien eine Meldung, dass die Gleichung zu komplex ist. Das Addin bietet eine ganze Reihe weiterer Funktionen; die alle hier im Rahmen dieses Artikels zu testen und zu beschreiben, würde dann doch den Rahmen deutlich sprengen. Ausprobiert hatte ich noch die Funktionen zum Integrieren und Differenzieren, die in meinen Tests ohne Probleme liefen; bis, wie gesagt, die Ausnahme auf Grund einer zu hohen Komplexität der Formel. </p>
<p>Alles in allem finde ich das Tool sehr gelungen; besonders die Grafikfunktionen gefallen mir sehr gut. Einen kleinen Wunsch hätte ich jedoch, nämlich, dass die Farben direkt in dem Addin eingestellt werden könnten. Falls die Grafik in das Dokument eingefügt wird, stehen, zu mindestens in Word 2010, jedoch auch die Tools zur Bildbearbeitung zur Verfügung, die eine einfache Änderung der Farben ermöglichen.</p>
<ul>
<li><a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=ca620c50-1a56-49d2-90bd-b2e505b3bf09&#038;displaylang=en" target="_blank">Microsoft Math Addin Download, Englisch</a></li>
<li><a href="http://www.excel-ticker.de/mathematische-formeln-in-office-im-linearmodus-erstellen/" target="_blank">Mathematische Formeln in Office im Linearmodus erstellen, Deutsch</a></li>
<li><a href="http://de.wikipedia.org/wiki/Normalverteilung " target="_blank">Wikipedia, Normalverteilung, Deutsch</a></li>
<li><a href="http://www.gauss-goettingen.de/gauss_kniffelig_norm.php" target="_blank">Artikel bei Gauss Göttingen, Deutsch</a></li>
<li><a href="http://www.arndt-bruenner.de/mathe/java/plotter3d.htm" target="_blank">Arndt Brünner&#8217;s Matheseite, 3D Plotter, Deutsch</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.excel-ticker.de/das-microsoft-mathematik-addin-fur-word-und-onenote/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Microsoft Support Guide als Anlaufstelle für wichtige Links</title>
		<link>http://www.excel-ticker.de/microsoft-support-guide-als-anlaufstelle-fur-wichtige-links/</link>
		<comments>http://www.excel-ticker.de/microsoft-support-guide-als-anlaufstelle-fur-wichtige-links/#comments</comments>
		<pubDate>Thu, 12 Aug 2010 10:43:37 +0000</pubDate>
		<dc:creator>Mourad Louha</dc:creator>
				<category><![CDATA[Office]]></category>
		<category><![CDATA[Sonstiges]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Guide]]></category>
		<category><![CDATA[Support]]></category>

		<guid isPermaLink="false">http://www.excel-ticker.de/?p=2590</guid>
		<description><![CDATA[

Da ja momentan Microsoft sozusagen im Netz sehr aktiv ist und viele neue oder verbesserte Online Angebote zu Office und weiteren Produkten zur Verfügung stellt, ist es manchmal ein bisschen schwer, den Überblick zu behalten. Hilfreich bei der Auswahl oder Suche nach diesen Angeboten kann der Microsoft Support Guide sein.

Im oberen Bereich kann eine Produktfamilie [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-top:-18px; margin-right:-8px; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwww.excel-ticker.de%252Fmicrosoft-support-guide-als-anlaufstelle-fur-wichtige-links%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2F9quhR1%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Microsoft%20Support%20Guide%20als%20Anlaufstelle%20f%C3%BCr%20wichtige%20Links%22%20%7D);"></div>
<p>Da ja momentan Microsoft sozusagen im Netz sehr aktiv ist und viele neue oder verbesserte Online Angebote zu Office und weiteren Produkten zur Verfügung stellt, ist es manchmal ein bisschen schwer, den Überblick zu behalten. Hilfreich bei der Auswahl oder Suche nach diesen Angeboten kann der Microsoft Support Guide sein.</p>
<p><img style="border: 1px solid #888888;" src="http://www.excel-ticker.de/wp-content/uploads/2010/08/office.guide.gif" alt="Microsoft Support Guide" title="Microsoft Support Guide" /></p>
<p>Im oberen Bereich kann eine Produktfamilie ausgewählt werden, anschließend weitere Untergruppen. Im unteren Bereich werden dann die wichtigsten Links aufgeführt.</p>
<ul>
<li><a href="http://www.microsoft.com/germany/support/guide/" target="_blank">Microsoft Support Guide, Direktaufruf</a></li>
<li><a href="http://www.microsoft.com/germany/kmu/support-und-downloads/supportangebote/ueberblick/supportguide.mspx" target="_blank">Microsoft Support Guide, Artikel im Microsoft KMU Portal</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.excel-ticker.de/microsoft-support-guide-als-anlaufstelle-fur-wichtige-links/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Excel Dokumente und weitere Office Dokumente in PHP erstellen</title>
		<link>http://www.excel-ticker.de/excel-dokumente-und-weitere-office-dokumente-in-php-erstellen/</link>
		<comments>http://www.excel-ticker.de/excel-dokumente-und-weitere-office-dokumente-in-php-erstellen/#comments</comments>
		<pubDate>Fri, 06 Aug 2010 12:35:50 +0000</pubDate>
		<dc:creator>Mourad Louha</dc:creator>
				<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Excel]]></category>
		<category><![CDATA[Office]]></category>
		<category><![CDATA[PowerPoint]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Word]]></category>
		<category><![CDATA[Library]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.excel-ticker.de/?p=2432</guid>
		<description><![CDATA[

Gelegentlich führe ich auch Projekte in PHP durch. Eine sehr interessante und professionell betreute in PHP entwickelte Klassenbibliothek, um Excel Dateien lesen und schreiben zu können, ist das Codeplex Projekt PHPExcel. Die Bibliothek ist frei im Quelltext verfügbar.

Um die Bibliotheken verwenden zu können, wird mindestens PHP 5.2.0 vorausgesetzt und dass die Erweiterungen „php_zip“, „php_xml“ und [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-top:-18px; margin-right:-8px; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwww.excel-ticker.de%252Fexcel-dokumente-und-weitere-office-dokumente-in-php-erstellen%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2F9gm1LA%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Excel%20Dokumente%20und%20weitere%20Office%20Dokumente%20in%20PHP%20erstellen%22%20%7D);"></div>
<p>Gelegentlich führe ich auch Projekte in PHP durch. Eine sehr interessante und professionell betreute in PHP entwickelte Klassenbibliothek, um Excel Dateien lesen und schreiben zu können, ist das Codeplex Projekt PHPExcel. Die Bibliothek ist frei im Quelltext verfügbar.</p>
<p><img style="border:1px solid #888888;" src="http://excel-ticker.de/wp-content/uploads/2010/08/excel.php.gif" alt="PHP Excel" title="PHP Excel" /></p>
<p>Um die Bibliotheken verwenden zu können, wird mindestens PHP 5.2.0 vorausgesetzt und dass die Erweiterungen „php_zip“, „php_xml“ und „php_gd2“ aktiviert sind. Wobei erste Erweiterung nur für Excel Dateien im XLSX Format benötigt wird. Die Bibliothek ermöglicht ebenfalls das Lesen und Schreiben des älteren XLS Formats. Eine ausführliche Beschreibung (jedoch nur in Englisch) findet sich auf der Website zum Projekt.</p>
<p>Relativ neu sind die weiteren Projekte „PHPPowerPoint“ und „PHPWord“, welche auch teilweise auch von denselben Entwicklern wie für „PHPExcel“ betreut werden. Folgend die Links zu den Projekten.</p>
<ul>
<li><a href="http://www.phpexcel.net/" target="_blank">PHP Excel Website bei Codeplex, Englisch</a></li>
<li><a href="http://www.phppowerpoint.net/" target="_blank">PHP PowerPoint Website bei Codeplex, Englisch</a></li>
<li><a href="http://phpword.codeplex.com/" target="_blank">PHP Word Website bei Codeplex, Englisch</a></li>
</ul>
<p>Dieser Artikel wurde auch in der englischen Verson vom <a href="http://www.excel-ticker.com/read-and-write-excel-and-other-office-documents-with-php/" target="_blank">Excel Ticker</a> publiziert.</p>

]]></content:encoded>
			<wfw:commentRss>http://www.excel-ticker.de/excel-dokumente-und-weitere-office-dokumente-in-php-erstellen/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Excel VBA Application Objekte per Windows API erzeugen (Teil 1)</title>
		<link>http://www.excel-ticker.de/excel-vba-application-objekte-per-windows-api-erzeugen-teil-1/</link>
		<comments>http://www.excel-ticker.de/excel-vba-application-objekte-per-windows-api-erzeugen-teil-1/#comments</comments>
		<pubDate>Thu, 05 Aug 2010 12:34:26 +0000</pubDate>
		<dc:creator>Mourad Louha</dc:creator>
				<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Excel]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[VBA]]></category>
		<category><![CDATA[Accessible]]></category>
		<category><![CDATA[Binding]]></category>
		<category><![CDATA[Handles]]></category>
		<category><![CDATA[Objects]]></category>
		<category><![CDATA[Windows API]]></category>

		<guid isPermaLink="false">http://www.excel-ticker.de/?p=2537</guid>
		<description><![CDATA[

Im Microsoft Office 2010 Answers Forum stellte jemand die Frage, wie auf eine Excel Instanz von einer weiteren zugegriffen werden könnte und aus dieser heraus, Code in der ersten Instanz ausgeführt werden könnte. Dies brachte mich auf die Idee, alle Excel Instanzen per Windows API zu ermitteln und zu versuchen, auf diese per VBA zuzugreifen. [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-top:-18px; margin-right:-8px; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwww.excel-ticker.de%252Fexcel-vba-application-objekte-per-windows-api-erzeugen-teil-1%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2Fac29pk%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Excel%20VBA%20Application%20Objekte%20per%20Windows%20API%20erzeugen%20%28Teil%201%29%22%20%7D);"></div>
<p>Im <a href="http://social.answers.microsoft.com/Forums/de-DE/officeexcelde/threads" target="_blank">Microsoft Office 2010 Answers Forum</a> stellte jemand die Frage, wie auf eine Excel Instanz von einer weiteren zugegriffen werden könnte und aus dieser heraus, Code in der ersten Instanz ausgeführt werden könnte. Dies brachte mich auf die Idee, alle Excel Instanzen per Windows API zu ermitteln und zu versuchen, auf diese per VBA zuzugreifen. Dieser Artikel beschreibt die Vorgehensweise und stellt Teile des Codes vor, wobei Kenntnisse in der VBA Programmierung vorausgesetzt werden, so auch das Verwenden von TreeViews, ListViews und Einbinden von Windows API Funktionen. Eine Beispielanwendung kann am Ende des Artikels heruntergeladen werden und ist ungeschützt, so dass der Code eingesehen werden kann.</p>
<p><img style="border: 1px solid #888888;" src="http://www.excel-ticker.de/wp-content/uploads/2010/08/excel.handles.main.gif" alt="VBA Window Handles" title="VBA Window Handles" /></p>
<p><span id="more-2537"></span></p>
<p>Eine relativ bekannte Möglichkeit, an ein Application Objekt einer anderen Excel Instanz heranzukommen, ist die Methode GetObject(). Wird diese beispielweise über Set xlApp =  GetObject(, &#8220;Excel.Application&#8221;) aufgerufen, liefert die Methode eine Referenz zur zuerst gestarteten Excel Instanz. Sind jedoch weitere Excel Instanzen offen, ist es nicht möglich, auf die zweite Instanz mit Hilfe dieser Methode zuzugreifen, sofern man nicht den Namen einer geöffneten Arbeitsmappe in der anderen Instanz kennt.</p>
<p>In Windows werden Fenster über sogenannte „Handles“ verwaltet. Diese sind in einer Hierarchie angeordnet, wobei der Desktop die oberste Ebene bildet. Die Fensterhandles werden dynamisch zugewiesen und, vereinfacht gesagt, als HWND Datentyp geführt, wobei jedes generierte Fensterhandle immer eindeutig ist. Interagieren können Anwendungen über ein Nachrichtensystem; beispielsweise kann eine Anwendung eine Nachricht an ein Dokumentfenster zur Neupositionierung des Fensters senden oder ein Unterfenster einen Mausklick an das Hauptfenster der Anwendung weiterleiten.</p>
<p>Ich bin glücklicher Besitzer von Visual Studio 2010, welches ein Tool enthält, um alle Fensterhandles zu ermitteln und anzuzeigen. Folgende Abbildung zeigt einen Teil der Fensterhierarchie zum Zeitpunkt, wo ich gerade diesen Artikel schreibe und mehrere Excel Instanzen inklusive einer Excel 2010 Instanz geöffnet habe.</p>
<p><img style="border: 1px solid #888888;" src="http://www.excel-ticker.de/wp-content/uploads/2010/08/excel.handles.spy.gif" alt="VBA Window Handles" title="VBA Window Handles" /></p>
<p>Das Hauptfenster von Excel 2010 hat hier das hexadezimal dargestellte Handle „0015058A“ und die Arbeitsmappe „Dummy.Excel.2010.xlsx“ das Handle „00020642“. Das Fenster der Arbeitsmappe ist logischerweise hierarchisch unterhalb des Hauptfensters angesiedelt, da es ja von letzterem abhängt.  Zudem sind rechts neben den Titeln der Fenster die Bezeichner „XLMAIN“ und „EXCEL7“ zu sehen, die jeweils eine interne Klassenbezeichnung darstellen. Alle Excel Instanzen haben dieselbe Klassenbezeichnung „XLMAIN“, unabhängig von der Excel Version. Diese Bezeichnung werde ich später mir zu Nutze machen, um die Fensterhandles zu filtern. Die Beispielanwendung enthält eine UserForm, in welcher folgende Steuerelemente abgelegt sind:</p>
<p>
<ul>
<li>Eine Combobox dient zur Auswahl der Office Anwendung, wobei in dieser Beispielanwendung nur Microsoft Excel vorgesehen ist.</li>
<li>Ein TreeView soll, wie das Visual Studio Tool, die Fenster hierarchisch darstellen.</li>
<li>Ein paar Steuerelemente zeigen Informationen zum dem im TreeView markierten Eintrag an.</li>
<li>Ein Button referenziert, wenn möglich, ein VBA Objekt zum Excel Application Objekt der Excel Instanz.</li>
<li>Eine ListView enthält, je nach markiertem Eintrag im TreeView, die über VBA abrufbaren Excel Instanzen.</li>
<li>Einige Felder liefern weitere Infos zur geöffneten Excel Instanz.</li>
</ul>
<p>Die Beispielanwendung enthält die drei Module „MLP_Api“, „MLP_Controls“ und „MLP_Run“. Ersteres enthält die Importe der Windows API Funktionen sowie einige Hilfsfunktionen. Im Modul „MLP_Controls“ finden Sie eine wesentliche Funktionalität der Anwendung: das Füllen des TreeViews und Ermitteln der Fenster. MLP_Run enthält nur Code zum Starten der UserForm und Beenden der Anwendung. Im Codemodul zur UserForm sind, wie üblich, die Ereignishandler zu dessen Steuerelementen abgelegt und ein paar Hilfsfunktionen implementiert.</p>
<h3>Fensterhandles ermitteln und im TreeView ablegen</h3>
<p>Wie kommen wir aber nun an die Handles der Fenster heran? Zunächst müssen wir die passenden Windows API Funktionen deklarieren und importieren. Da wir wissen, dass der Desktop das Wurzelelement in der Fensterhierarchie ist, binden wir die API Funktion „GetDesktopWindow()“ ein. Um den Titel des Fensters, den Klassennamen und das übergeordnete Fenster zu ermitteln, binden wir noch respektive „GetWindowTextA()“, „GetClassNameA()“ und „GetParent()“ein. Zudem möchten wir ja auch die Kindfenster ermitteln, somit ist noch die entsprechende API Funktion „EnumChildWindows()“ einzubinden. Zum Suchen eines speziellen Fensters kann die API Funktion „FindWindowExA()“ verwendet werden. Tipp: viele Windows API Funktionen sind so benannt, dass wenn nach den englischen Begriffen zu  ihrem Zweck, diese verhältnismäßig einfach bei MSDN gefunden werden können. In MLP_Api steht nun in einem ersten Schritt:</p>
<textarea name="code" class="vba" cols="60" rows="10">
  Public Declare Function mlfpApiEnumChildWindows Lib "user32" _
         Alias "EnumChildWindows" (ByVal hWndParent As Long, _
                                   ByVal lpEnumFunc As Long, _
                                   ByVal lParam As Long) As Long
  
  Public Declare Function mlfpApiFindWindow Lib "user32" _
         Alias "FindWindowExA" (ByVal hWnd1 As Long, _
                                ByVal hWnd2 As Long, _
                                ByVal lpsz1 As String, _
                                ByVal lpsz2 As String) As Long
  
  Public Declare Function mlfpApiGetClassName Lib "user32" _
          Alias "GetClassNameA" (ByVal hwnd As Long, _
                                 ByVal lpClassName As String, _
                                 ByVal nMaxCount As Long) As Long
  
  Public Declare Function mlfpApiGetDesktopWindow Lib "user32" _
         Alias "GetDesktopWindow" () As Long
  
  Public Declare Function mlfpApiGetParent Lib "user32" _
         Alias "GetParent" (ByVal hwnd As Long) As Long
  
  Public Declare Function mlfpApiGetWindowText Lib "user32" _
         Alias "GetWindowTextA" (ByVal hwnd As Long, _
                                 ByVal lpString As String, _
                                 ByVal cch As Long) As Long
</textarea>
<p>Anschließend habe ich der UserForm die Steuerelemente und wichtigsten Ereignishandler hinzugefügt. Um die Elemente (Nodes) im TreeView anzulegen, habe ich die Funktion „mlfpControlsTreeviewWindows()“ implementiert. Diese habe ich jedoch in das Modul „MLP_Controls“ ausgelagert, um z.B. ein einfacheres wiederverwenden in anderen Projekten zu ermöglichen.  Als Argumente erwartet diese Funktion eine Referenz auf die geladene UserForm, den Namen des TreeViews, den Klassennamen des Hauptfensters der gesuchten Anwendung und zwei Zusatzparameter, die festlegen, ob die Kindfenster ermittelt werden sollen oder es sich um Excel handelt.</p>
<textarea name="code" class="vba" cols="60" rows="10">
  Public Function mlfpControlsTreeviewWindows(Form As Object, _
                                              Control As String, _
                                              Code As String, _
                                              Childs As Boolean, _
                                              Excel As Boolean) _
                                              As Long
    
    Dim e As Long
    Dim h As Long
    Dim n As Long
    Dim r As Long
    
    Dim c As String
    Dim t As String
    
'   Errors...
    
    On Error Resume Next
    
'   Form...
    
    Set mlvhFormObject = Form
    
'   Control...
    
    mlvhFormControl = Control
    
'   Clear...
    
    mlvhFormObject.Controls(mlvhFormControl).Nodes.Clear
    
'   Desktop...
    
    r = mlfpApiGetDesktopWindow
    
'   Desktop...
    
    mlvhFormObject.Controls(mlvhFormControl).Nodes.Add , , "K" &#038; _
    CStr(r), mlcpControlsStringDesktop
    
'   Tag...
    
    mlvhFormObject.Controls(mlvhFormControl).Nodes("K" &#038; _
    CStr(r)).Tag = mlfhTag(r, mlcpControlsStringDesktop, _
    mlcpControlsStringDesktop)
    
'   Excel...
    
    If Excel Then
      
'     Current...
      
      mlvhFormObject.Controls(mlvhFormControl).Nodes.Add "K" &#038; _
      CStr(r), tvwChild, "K" &#038; CStr(Application.hwnd), _
      Trim(Split(Application.Caption, "-")(0)) &#038; " " &#038; "(" &#038; _
      mlcpControlsStringCurrent &#038; ")"
      
'     Class...
      
      c = String(255, " ")
      e = mlfpApiGetClassName(Application.hwnd, c, 255)
      
'     Tag...
      
      mlvhFormObject.Controls(mlvhFormControl).Nodes("K" &#038; _
      CStr(Application.hwnd)).Tag = mlfhTag(Application.hwnd, _
      mlfpApiTrim(c), Application.Caption)
      
'     Childs...
      
      If Childs Then
        
'       Key...
        
        mlvhFormControlKey = "K" &#038; CStr(Application.hwnd)
        
'       Enumerate...
        
        mlfhChildEnumerator Application.hwnd
        
      End If
    
    End If
    
'   Loop...
    
    Do
      
'     Increase...
      
      n = n + 1
      
'     Handle...
      
      h = mlfpApiFindWindow(mlfpApiGetDesktopWindow, h, _
          Code, vbNullString)
      
'     Check...
      
      If h <> 0 And h <> Application.hwnd Then
        
'       Class...
        
        c = String(255, " ")
        e = mlfpApiGetClassName(h, c, 255)
        
'       Title...
        
        t = String(255, " ")
        e = mlfpApiGetWindowText(h, t, 255)
        
'       Add...
        
        mlvhFormObject.Controls(mlvhFormControl).Nodes.Add "K" &#038; _
        CStr(r), tvwChild, "K" &#038; CStr(h), mlfpApiTrim(t)
        
'       Tag...
        
        mlvhFormObject.Controls(mlvhFormControl).Nodes("K" &#038; _
        CStr(h)).Tag = mlfhTag(h, mlfpApiTrim(c), mlfpApiTrim(t))
        
'       Childs...
        
        If Childs Then
          
'         Key...
          
          mlvhFormControlKey = "K" &#038; CStr(h)
          
'         Enumerate...
          
          mlfhChildEnumerator h
          
        End If
        
      End If
      
    Loop While h <> 0
    
'   Reset...
    
    Set mlvhFormObject = Nothing
    
'   Return...
    
    mlfpControlsTreeviewWindows = 0
    
  End Function
</textarea>
<p>Die Funktion sieht auf einen ersten Blick etwas komplex aus, ist jedoch relativ einfach aufgebaut. Zunächst wird das Handle zum Desktop über die Windows API Funktion ermittelt und ein Eintrag dem TreeView hinzugefügt. Jedes TreeView Element erhält übrigens als Schlüssel den String „K &#038; Fensterhandle“. Dies ermöglicht später auf sehr einfache Weise, die Fensterhierarchie aufzubauen. In der Eigenschaft „Tag“ jedes TreeView Elementes sind zusätzliche Informationen zu den gefundenen Fenstern abgelegt, wie der Titel und der Klassenname. Hierfür wird, der Übersichtlichkeit halber, die Funktion „mlfhTag()“ aufgerufen.</p>
<p>Anschließend wird geprüft, ob Excel Instanzen abgerufen werden sollen. Wenn ja, wird das Handle der Instanz, in welcher der Code läuft, als erster Untereintrag im TreeView hinzugefügt. Um alle weiteren Instanzen von Excel zu ermitteln, durchläuft der Code danach eine Do While Schleife. In dieser werden die Handles der dem Desktop untergeordneten Fenster abgerufen, die als Klassenname den Wert der Variable „Code“ enthalten; in unserem Fall ist das dann „XLMAIN“ für Excel. Für jedes gefundene Handle ruft der Code die Funktion „mlfhChildEnumerator()“ auf, die wiederum alle Kindfenster ermittelt. Diese Funktion enthält letztlich nur den API Aufruf:</p>
<textarea name="code" class="vba" cols="60" rows="10">
  Private Function mlfhChildEnumerator(Handle As Long) As Long
    
    Dim r As Long
    
'   Errors...
    
    On Error Resume Next
    
'   Enumerate...
    
    r = mlfpApiEnumChildWindows(Handle, AddressOf mlfhChild, 0)
    
'   Return...
    
    mlfhChildEnumerator = r
    
  End Function
</textarea>
<p>An dieser Stelle wird es interessant, denn die API Funktion erwartet als Parameter einen Zeiger auf eine sogenannte Callback-Funktion. Heißt, diese Funktion wird von der API Funktion so oft  aufgerufen, wie Fensterhandles ermittelt werden können und ermöglicht somit bei jedem Aufruf die übergebenen Argumente auszuwerten. In der Beispielanwendung habe ich als Callback-Funktion „mlfhChild()“ verwendet. Die Argumente der Callback-Funktion müssen übrigens vorgegebenen Regeln gehorchen, es kann also nicht irgendeine Funktion verwendet werden.</p>
<textarea name="code" class="vba" cols="60" rows="10">
  Private Function mlfhChild(ByVal Handle As Long, _
                             ByVal Params As Long) As Long
    
    Dim h As Long
    Dim r As Long
    
    Dim c As String
    Dim t As String
    
'   Errors...
    
    On Error Resume Next
    
'   Check...
    
    If Not mlvhFormObject Is Nothing Then
      
'     Class...
      
      c = String(255, " ")
      r = mlfpApiGetClassName(Handle, c, 255)
      
'     Title..
      
      t = String(255, " ")
      r = mlfpApiGetWindowText(Handle, t, 255)
      
'     Parent...
      
      h = mlfpApiGetParent(Handle)
      
'     Add...
      
      If h <> 0 Then
        
        mlvhFormObject.Controls(mlvhFormControl).Nodes.Add "K" &#038; _
        CStr(h), tvwChild, "K" &#038; CStr(Handle), _
        mlfpApiTrim(t, mlcpControlsStringChild &#038; " " &#038; "(" &#038; _
        mlfpApiTrim(c) &#038; ")")
        
      Else
        
        mlvhFormObject.Controls(mlvhFormControl).Nodes.Add _
        mlvhFormControlKey, tvwChild, "K" &#038; CStr(Handle), _
        mlfpApiTrim(t, mlcpControlsStringChild &#038; " " &#038; "(" &#038; _
        mlfpApiTrim(c) &#038; ")")
        
      End If
      
'     Tag...
      
      mlvhFormObject.Controls(mlvhFormControl).Nodes("K" &#038; _
      CStr(Handle)).Tag = mlfhTag(Handle, mlfpApiTrim(c), _
      mlfpApiTrim(t))
      
    End If
    
'   Return...
    
    mlfhChild = True
    
  End Function
</textarea>
<p>Wie zu sehen, wird über den Aufruf von „mlfpApiGetParent(Handle)“ das Handle zum übergeordneten Fenster ermittelt, dem TreeView als Untereintrag hinzugefügt und die „Tag“ Eigenschaft des eingefügten Elementes gesetzt. Und da sich die Schlüssel im Treeview aus „K &#038; Fensterhandle“ zusammensetzen, sortieren sich die neuen Elemente von selbst ein. Im Wesentlichen war’s das dann auch schon, um  die Fenster zu ermitteln.</p>
<h3>Application Objekt aus einem Fensterhandle ermitteln</h3>
<p>Wie bekommen wir aber nun ein Fensterhandle in ein Application Objekt „umgewandelt“, so dass dann „ganz normal“ über VBA auf diese Excel Instanz zugegriffen werden kann?</p>
<p><a href="http://blogs.officezealot.com/whitechapel/archive/2005/04/10/4514.aspx" target="_blank">Andrew Whitechapel</a> hat dazu einen sehr interessanten Artikel geschrieben, der sich zwar auf .NET bezieht, aber prinzipiell in VBA umsetzbar ist. Da die Office Anwendungen eine Automatisierung per COM ermöglichen, müsste man nur ein solches Element in der Hierarchie der Handles finden, um anschließend daraus ein in VBA nutzbares Objekt generieren zu können. Ist dieses Objekt einmal erstellt und würde es sich auf ein Unterobjekt von Application Objekt der Hauptanwendung  beziehen, wäre das denn kein Problem mehr, denn über die „Application“ Eigenschaft der Unterobjekte gelangen wir dann wiederum an das Application Objekt selbst.</p>
<p>Um zu prüfen, ob ein gegebenes Fensterhandle eine entsprechend verwertbare Schnittstelle enthält, kann die Windows API Funktion „AccessibleObjectFromWindow()“ verwendet werden. Trick hierbei ist, einerseits eine in eine Struktur transferierte GUID und andererseits ein VBA Objekt an die Funktion zu übergeben. Falls der Aufruf der API Funktion erfolgreich war, kann aus der Rückgabe ein VBA Application Objekt initialisiert werden, welches dann genau dem Application Objekt der gefundenen Excel Instanz entspräche. Ok, hört sich kompliziert an, ist aber relativ einfach:</p>
<textarea name="code" class="vba" cols="60" rows="10">
  Public Function mlfpApiAccessibleObjectCheck(Handle As Long, _
                                               Key As String) _
                                               As Boolean
    
    Dim e As Long
    Dim r As Boolean
    Dim a As Object
    Dim o As Object
    
    Dim t As apiUUID
    
'   Errors...
    
    On Error Resume Next
    
'   Try...
    
    e = apiIIDFromString(StrPtr(Key), t)
    e = apiAccessibleObject(Handle, apiObjIDNativeOM, t, o)
    
'   Check...
    
    If Not e <> 0 Then
      
'     Try...
      
      Set a = o.Application
      
'     Result...
      
      r = Not CBool(Err.Number <> 0)
    
'     Clear...
      
      Set a = Nothing
      
    Else
      
      r = False
      
    End If
    
'   Return...
      
    mlfpApiAccessibleObjectCheck = r
  
  End Function
</textarea>
<p>Hierbei muss man wissen, dass COM Komponenten über eine GUID (Global Unique Identifier) identifiziert werden können und die verfügbaren Funktionen über Interfaces zur Verfügung stellen, die auch wiederum über GUID’s unterschieden werden können. Eine solche verwendbare ID ist für Excel 2007  der Wert „{00020400-0000-0000-C000-000000000046}“.</p>
<p>In der Beispielmappe sind im Codemodul zur UserForm die Funktionen „mlfhTreeviewDecodeTag()“ und „mlfhTreeviewIterate()“ abgelegt. Erste Funktion zerlegt den Tag des gewählten Eintrags im TreeView und zeigt die Eigenschaften des Fensters an. Zudem wird ermittelt, ob für das Fensterhandle zum ausgewählten Eintrag  sowie für alle untergeordneten Einträge im TreeView  eine Objekterstellung zur Excel Instanz möglich ist. Das Durchlaufen der Untereinträge übernimmt dann die Funktion „mlfhTreeviewIterate()“. Jedes gefundene Fenster, welches eine Objekterstellung erlaubt, wird der ListView „LSV_0001“ hinzugefügt. Folgend der Code zu „mlfhTreeviewIterate()“.</p>
<textarea name="code" class="vba" cols="60" rows="10">
  Private Function mlfhTreeviewIterate(Key As String) As Long
    
    Dim c As Long
    Dim n As Long
    Dim p As Long
    
    Dim k As String
    Dim h As String
    
    Dim o As Node
    
'   Errors...
    
    On Error Resume Next
    
'   Current...
    
    c = LSV_0001.ListItems.Count + 1
    
'   Start...
    
    Set o = TRV_0001.Nodes(Key)
    
'   Loop...
    
    Do
      
'     Handle...
      
      h = Split(o.Tag, mlcpControlsTagHandle &#038; mlcpControlsSplitItem)(1)
      h = Split(h, mlcpControlsSplitEntry)(0)
      
'     Check...
      
      If CLng(h) > 0 Then
      
'       Loop...
        
        For p = 1 To mlvhApplications(CMB_0001.ListIndex + 1).Count
          
'         Current...
          
          If mlfpApiAccessibleObjectCheck(CLng(h), _
             mlvhApplications(CMB_0001.ListIndex + 1)(p)) Then
            
'           Check...
            
            If LSV_0001.ListItems.Count < 2 Then
              
              LSV_0001.Gridlines = True
              LSV_0001.View = lvwReport
              
            End If
            
'           Add...
            
            LSV_0001.ListItems.Add , , CStr(c)
            
'           Data...
            
            LSV_0001.ListItems(c).SubItems(1) = h
            LSV_0001.ListItems(c).SubItems(4) = mlchChild
            LSV_0001.ListItems(c).SubItems(5) = o.Text
            
            LSV_0001.ListItems(c).SubItems(2) = _
            mlfhTreeviewAppHandle(o.Key)
            
            LSV_0001.ListItems(c).SubItems(3) = _
            mlvhApplications(CMB_0001.ListIndex + 1)(p)
            
'           Increase...
            
            c = c + 1
            
'           Exit...
            
            Exit For
            
          End If
        
        Next p
        
      End If
      
'     Next...
      
      If o.Children > 0 Then
        
        mlfhTreeviewIterate o.Child.Key
        
      End If
      
'     Next...
      
      Set o = o.Next
      
    Loop While Not o Is Nothing
    
'   Return...
    
    mlfhTreeviewIterate = 0
    
  End Function
</textarea>
<p>Wenn Sie beispielsweise mehrere Excel Instanzen öffnen und anschließend die Beispielanwendung sowie die UserForm aufrufen, werden Sie feststellen, dass bei einem Klick auf den Eintrag „Desktop“ alle geöffneten Arbeitsmappen der verschiedenen Excel Instanzen aufgelistet werden. Ist jedoch in einer der Instanzen keine Mappe geöffnet, wird das Fenster zwar aufgeführt, es kann jedoch kein Objekt auf diese Instanz erstellt werden. Somit ist ein Kriterium für die erfolgreiche Objekterstellung,  dass mindestens eine Mappe in der Instanz geöffnet ist. </p>
<p>Momentan bin ich noch auf der Suche nach einer Lösung zu diesem Problem; ob die Objekterstellung im Fall geöffneter Instanzen ohne Arbeitsmappe möglich sein wird, kann ich noch nicht sagen. In einem weiteren Artikel werde ich dann über meine Erkenntnisse berichten. Ausserdem wird die Beispielanwendung um weitere Office Anwendungen erweitert werden. Und ich plane zusätzliche Testfunktionen zur „Fernsteuerung“ der Anwendungen.</p>
<p>Abschließend der Hinweis, dass es sich bei dieser Anwendung um ein Experiment handelt; es kann keine Gewähr oder Garantie übernommen werden, dass die Anwendung auf Ihrem System funktionsfähig ist oder nicht unerwartet reagiert. Ich empfehle während der Ausführung der Beispielanwendung keine wichtigen Dokumente geöffnet zu haben. Getestet wurde die Beispielanwendung unter Windows 7 mit parallel &#8211; wichtig &#8211; installierten Office 2003, 2007 und 2010. Die Anwendung ist für 32 Bit ausgelegt, d.h. unter Windows 7 64 Bit funktioniert die Anwendung nicht, da sich dort die Einbindung der API Funktionen unterscheidet. Folgend der Downloadlink zur Beispielanwendung sowie im Anschluß Links mit weiterführenden Artikeln zum Thema.</p>
<p style="color:#880000;">Nachtrag vom 18.08.2010: den Titel dieses Artikels musste ich nachträglich ändern, da er sonst zu lang geworden wäre. Zudem ist nun ein Folgeartikel vorhanden, wo auch eine neue Version zum Tool zu finden ist. <a href="http://www.excel-ticker.de/excel-vba-application-objekte-per-windows-api-erzeugen-teil-2/">Excel VBA Application Objekte per Windows API erzeugen (Teil 2)</a></p>
<p>
<ul>
<li><a href="http://www.software.maninweb.de/marketing.php?Language=en&#038;File=Handles.1&#038;Extension=zip&#038;Source=www.excel-ticker.de" target="_blank">Downloadlink zur Beispielmappe mit der Anwendung, Version 1</a></li>
</ul>
<ul>
<li><a href="http://social.answers.microsoft.com/Forums/de-DE/officeexcelde/threads" target="_blank">Microsoft Office 2010 Answers Forum, Deutsch</a></li>
<li><a href="http://support.microsoft.com/kb/288902/EN-US/" target="_blank">Microsoft Support, GetObject and CreateObject behavior, Englisch</a></li>
<li><a href="http://en.wikibooks.org/wiki/Windows_Programming/Handles_and_Data_Types" target="_blank">Wikipedia, Windows Programming/Handles and Data Types, Englisch</a></li>
<li><a href="http://msdn.microsoft.com/en-us/library/ff468925%28v=VS.85%29.aspx" target="_blank">MSDN, Windows Reference, Englisch</a></li>
<li><a href="http://msdn.microsoft.com/en-us/library/ms633493%28v=VS.85%29.aspx" target="_blank">MSDN, EnumChildProc Callback Function, Englisch</a></li>
<li><a href="http://blogs.officezealot.com/whitechapel/archive/2005/04/10/4514.aspx" target="_blank">Blog von Andrew Whitechapel, Englisch</a></li>
<li><a href="http://msdn.microsoft.com/en-us/library/ms696137" target="_blank">MSDN, AccessibleObjectFromWindow, Englisch</a></li>
<li><a href="http://msdn.microsoft.com/de-de/library/aa286559.aspx" target="_blank">MSDN, Component Object Model, Englisch</a></li>
<li><a href="http://en.wikipedia.org/wiki/Component_Object_Model" target="_blank">Wikipedia, Component Object Model, Englisch</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.excel-ticker.de/excel-vba-application-objekte-per-windows-api-erzeugen-teil-1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Webmatrix als Testplattform für ASP Anwendungen</title>
		<link>http://www.excel-ticker.de/webmatrix-als-testplattform-fur-asp-anwendungen/</link>
		<comments>http://www.excel-ticker.de/webmatrix-als-testplattform-fur-asp-anwendungen/#comments</comments>
		<pubDate>Sun, 18 Jul 2010 14:31:13 +0000</pubDate>
		<dc:creator>Mourad Louha</dc:creator>
				<category><![CDATA[Expression]]></category>
		<category><![CDATA[Sonstiges]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Anwendungen]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[Tests]]></category>
		<category><![CDATA[Webmatrix]]></category>

		<guid isPermaLink="false">http://www.excel-ticker.de/?p=2355</guid>
		<description><![CDATA[

Eines meiner nächsten Projekte beinhaltet den Aufbau einer Internetplattform, die primär auf das Engagement und Beteiligung der Nutzer und Nutzerinnen setzen wird. Da das Rad ja nicht immer wieder neu erfunden werden muss, habe ich nach verschiedensten Lösungen gesucht, die mir zu mindestens einige Grundfunktionalitäten zur Verfügung stellen.
Zunächst habe ich mich bei meiner Suche auf [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-top:-18px; margin-right:-8px; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwww.excel-ticker.de%252Fwebmatrix-als-testplattform-fur-asp-anwendungen%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2F9x3W3l%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Webmatrix%20als%20Testplattform%20f%C3%BCr%20ASP%20Anwendungen%22%20%7D);"></div>
<p>Eines meiner nächsten Projekte beinhaltet den Aufbau einer Internetplattform, die primär auf das Engagement und Beteiligung der Nutzer und Nutzerinnen setzen wird. Da das Rad ja nicht immer wieder neu erfunden werden muss, habe ich nach verschiedensten Lösungen gesucht, die mir zu mindestens einige Grundfunktionalitäten zur Verfügung stellen.</p>
<p>Zunächst habe ich mich bei meiner Suche auf PHP und mySQL basierte Anwendungen konzentriert. Interessante Lösungen bzw. Lösungsansätze habe ich dann heruntergeladen und auf meinem lokalen Server getestet. Übrigens, einen solchen lokalen Server (Apache, PHP und mySQL) aufzusetzen ist nicht sonderlich schwer, denn hierfür stehen genügend kostenlose Komplettpakete zu Verfügung. Ein Beispiel ist <a href="http://www.apachefriends.org/de/xampp.html" target="_blank">XAMP</a>, welches es ermöglicht, alle Komponenten komfortabel über ein Setup-Programm zu installieren. Zwar enthalten die getesteten Anwendungen alle coole und interessante Funktionen, aus meiner Sicht heraus ist jedoch der Anpassungsaufwand jedoch relativ hoch.</p>
<p>Insofern habe ich mir anschließend überlegt, naja, es muss ja nicht immer PHP und mySQL sein, warum nicht eine ASP basierte Anwendung? Zu klären war für mich jedoch, wie ich hierfür einen lokalen Server installiert bekomme, ohne erstens die Komponenten alle einzeln installieren zu müssen und zweitens umständlich in irgendwelchen Konfigurationsdateien Einstellungen ändern zu müssen.</p>
<p>Seit einiger Zeit stellt Microsoft schon die „<a href="http://www.microsoft.com/web/" target="_blank">Microsoft Web Plattform</a>“ bereit, die ähnlich wie für eine Apache Installation, verschiedenste, in der Regel kostenlose, Komponenten für die Webentwicklung zentral verwaltet bzw. installieren kann. Beispielsweise können über den „Web Plattform Installer“ Visual Studio Web Developer Express, der SQL Server 2008 R2 Express und viele Anwendungen (Blogs, CMS’s, Tools, …) installiert werden.</p>
<p><img style="border: 1px solid #888888;" src="http://www.excel-ticker.de/wp-content/uploads/2010/07/webmatrix.plattform.gif" alt="Webmatrix" title="Webmatrix" /></p>
<p>Vor kurzem ist das Tool „<a href="http://www.microsoft.com/web/webmatrix/" target="_blank">Webmatrix</a>“ erschienen, welches verspricht das Ganze noch einfacher zu machen. Zu beachten ist, dass Webmatrix noch in der Beta-Phase ist. Außerdem ist das Programm momentan nur in Englisch erhältlich. Folgend ein Test der Anwendung.</p>
<p><span id="more-2355"></span></p>
<p>Die Installation von Webmatrix kann ganz einfach über einen Klick auf „Install Webmatrix“ gestartet werden. Da ich bereits Visual Studio 2010 besitze, habe ich keinen Haken bei „Include Visual Web Developer 2010 Express“ gesetzt. Webmatrix informiert vor der Installation noch über die Anzahl und Größe der Komponenten, die für die Installation benötigt werden. Eine offene Internetverbindung wird logischerweise ebenfalls benötigt.</p>
<p><img style="border: 1px solid #888888;" src="http://www.excel-ticker.de/wp-content/uploads/2010/07/webmatrix.install.gif" alt="Webmatrix" title="Webmatrix" /></p>
<p>Kleiner Hinweis: wenn auf das Kreuz links neben „Microsoft Webmatrix Beta“ geklickt wird, verschwinden alle  Einträge aus der Liste und es wird fälschlicherweise „All oft the selected products have already been installed on your computer“ angezeigt. Die Liste kann dann nur durch Klicken auf „I Decline“ und über einen erneuten Aufruf des Dialogs wieder zum Vorschein gebracht werden.</p>
<p>Die Installation verlief bei mir problemlos. Anschließend kann Webmatrix über einen Eintrag im Startmenü aufgerufen werden und präsentiert sich wie folgt:</p>
<p><img style="border: 1px solid #888888;" src="http://www.excel-ticker.de/wp-content/uploads/2010/07/webmatrix.main.gif" alt="Webmatrix" title="Webmatrix" /></p>
<p>Sie haben nun die Wahl eine eigene Site aufzurufen, eine neue über ein Template zu erstellen, einen Ordner mit einer bestehenden Site anzugeben oder eine Site aus der Galerie herunterzuladen bzw. zu installieren. Da ich ja ein paar ASP Anwendungen testen wollte, habe ich den Punkt „Site From Web Gallery“ gewählt. Anschließend können Sie eine Anwendung aus einer der Kategorien wählen. Für einen ersten Test hatte ich das CMS von Umbraco über einen Doppelklick gewählt. Nach Bestätigung der Lizenzvereinbarung, werden die Installationsdateien heruntergeladen und ich anschließend gefragt, Kennwörter für die Datenbank zu vergeben bzw. anzugeben.</p>
<p><img style="border: 1px solid #888888;" src="http://www.excel-ticker.de/wp-content/uploads/2010/07/webmatrix.gallery.umbraco.gif" alt="Webmatrix" title="Webmatrix" /></p>
<p>Und an dieser Stelle hatte ich ein Problem: wie lautet das Kennwort für den Administrator „sa“ in der SQL Server Datenbank? Ich wusste zwar, dass Visual Studio 2010 einige Installationen von Teilen des SQL Servers vorgenommen hatte, konnte mich aber nicht erinnern, dass dort ein Kennwort abgefragt wurde bzw. gesetzt werden sollte. Und da ich kein Profi für SQL Server Installation bzw. Verwaltung dieser bin, war ich zunächst etwas ratlos. Somit war also erst mal etwas „lesen“ angesagt, welche Unterschiede bestehen zwischen dem SQL Server Compact, Express und der Vollversion und welche Werkzeuge zur Verwaltung gibt es? Anhand der Microsoft Website zur Web Plattform, fiel meine Wahl recht schnell auf den SQL Server Express, zumal dort dieser auch dort heruntergeladen werden kann. Der Downloadlink führt zur englischen Version des Servers und es stehen mehrere Möglichkeiten zur Verfügung, am sinnvollsten erschien mir die Version, die auch die „Management Tools“ beinhaltet. Schön wäre jedoch eine deutsche Version. Diese allerdings zu finden, gestaltete sich nicht so einfach, den Link habe ich am Ende des Artikels aufgeführt.</p>
<p>Um kein Durcheinander der verschiedenen Versionen aufkommen zu lassen und auch weil sich die von Webmatrix installierte SQL Server Instanz auf meinem Rechner nicht über die Installationsroutine des SQL Servers Express entfernen ließ, habe ich Webmatrix wieder deinstalliert und zuerst den SQL Server Express installiert. Während dieser kann man dann ein Kennwort für den Administrator „sa“ festlegen.</p>
<p>Schließlich habe ich Webmatrix erneut installiert und ein zweites Mal versucht, das CMS von Umbraco zu installieren. Und siehe da, alles funktioniert reibungslos. Nach Abschluss der Installation landet man direkt in der Hauptansicht von Webmatrix.</p>
<p><img style="border: 1px solid #888888;" src="http://www.excel-ticker.de/wp-content/uploads/2010/07/webmatrix.gallery.umbraco.site.gif" alt="Webmatrix" title="Webmatrix" /></p>
<p>Die Elemente bzw. Funktionen sind in der Regel selbsterklärend, zum Beispiel können Sie über einen Klick auf „Files“ direkt auf die Dateien der Anwendung zugreifen und auch editieren; Syntaxhervorhebung natürlich inklusive. Oder über „Databases“ direkt die Datenbank einsehen bzw. verändern. Das Menüband (Ribbon) passt den entsprechend gewählten Funktionen an. Um die Seite im Browser aufzurufen, genügt es auf den Menüpunkt „Run“ zu klicken und einen der dort aufgeführten Browser auszuwählen.</p>
<p>Sehr interessant ist auch der Punkt „Reports“, der es ermöglicht einen Bericht für die Website zu generieren, der bei der Optimierung für Suchmaschinen helfen kann. Webmatrix untersucht hierbei beispielsweise, ob Tags fehlen oder nicht korrekt oder zu oft verwendet wurden. Außerdem werden Hinweise zur Korrektur des Fehlers bzw. der Warnungen gegeben.</p>
<p><img style="border: 1px solid #888888;" src="http://www.excel-ticker.de/wp-content/uploads/2010/07/webmatrix.report.gif" alt="Webmatrix" title="Webmatrix" /></p>
<p>Webmatrix beinhaltet zudem viele weitere interessante Features, die den Rahmen des Artikels hier sprengen würden. Am Ende des Artikels habe ich einen Link zu einer Website mit einigen englischen Tutorials zu Webmatrix aufgeführt.</p>
<p>Fazit für mich: bis auf das Problem mit dem SQL Server, konnte ich Webmatrix bislang genau für das nutzen, was ich mir gewünscht hatte. Nämlich schnell eine der in der Galerie verfügbaren ASP Anwendungen zu testen, ohne aufwendige Installationen oder Konfigurationen usw. durchzuführen. Und, um das Problem mit dem SQL Server zu lösen, empfiehlt sich vielleicht diesen vor Webmatrix zu installieren, gerade wenn die Installationsroutinen der Anwendungen nach dem Administratorkennwort fragen.</p>
<p>Abschließend, um die Eingangsfrage zu beantworten, ich habe zwar auch bei den ASP Anwendungen nicht die optimalste Anwendung für mich gefunden, was das Internetportal betrifft, aber auch hier sehr interessante Ansätze. Der Test von Webmatrix hat sich dennoch gelohnt, da mich beispielsweise ebenfalls CMS&#8217;s auf ASP .Net Basis interessieren. Folgend ein paar Links:
<ul>
<li><a href="http://www.microsoft.com/web/webmatrix/" target="_blank">Microsoft Webmatrix Website, Deutsch</a></li>
<li><a href="http://www.asp.net/webmatrix/tutorials" target="_blank">Microsoft Webmatrix Tutorials, Englisch</a></li>
<li><a href="http://www.microsoft.com/downloads/details.aspx?displaylang=de&#038;FamilyID=e08766ce-fc9d-448f-9e98-fe84ad61f135" target="_blank">Microsoft SQL Server Express Download, Deutsch</a></li>
</ul>
<p>&nbsp;</p>

]]></content:encoded>
			<wfw:commentRss>http://www.excel-ticker.de/webmatrix-als-testplattform-fur-asp-anwendungen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kompilierte Hilfedateien für das Zusatztool zum Excel WM Planer</title>
		<link>http://www.excel-ticker.de/kompilierte-hilfedateien-fur-das-zusatztool-zum-excel-wm-planer/</link>
		<comments>http://www.excel-ticker.de/kompilierte-hilfedateien-fur-das-zusatztool-zum-excel-wm-planer/#comments</comments>
		<pubDate>Sun, 18 Apr 2010 10:45:38 +0000</pubDate>
		<dc:creator>Mourad Louha</dc:creator>
				<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Excel]]></category>
		<category><![CDATA[Excel Soccer]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[VBA]]></category>

		<guid isPermaLink="false">http://www.excel-ticker.de/?p=2104</guid>
		<description><![CDATA[

Unser WM Planer wird langsam erwachsen und enthält mittlerweile zahlreiche Optionen und Features. Um unsere User bei der Bedienung des Planers und des späteren Zusatztool zu unterstützen, haben wir uns überlegt, dem Zusatztool eine kompilierte Hilfedatei im CHM-Format beizufügen. Aufgerufen wird die Hilfedatei über ein entsprechendes Symbol von der Hauptseite im Zusatztool.


Die Hilfedatei präsentiert sich [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-top:-18px; margin-right:-8px; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwww.excel-ticker.de%252Fkompilierte-hilfedateien-fur-das-zusatztool-zum-excel-wm-planer%252F%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2F9wbwYU%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Kompilierte%20Hilfedateien%20f%C3%BCr%20das%20Zusatztool%20zum%20Excel%20WM%20Planer%22%20%7D);"></div>
<p>Unser WM Planer wird langsam erwachsen und enthält mittlerweile zahlreiche Optionen und Features. Um unsere User bei der Bedienung des Planers und des späteren Zusatztool zu unterstützen, haben wir uns überlegt, dem Zusatztool eine kompilierte Hilfedatei im CHM-Format beizufügen. Aufgerufen wird die Hilfedatei über ein entsprechendes Symbol von der Hauptseite im Zusatztool.</p>
<p><img src="http://excel-ticker.de/wp-content/uploads/2010/04/excel.soccer.userform.help.gif" alt="Excel Soccer World Cup Planner" title="Excel Soccer World Cup Planner" /></p>
<p><span id="more-2104"></span></p>
<p>Die Hilfedatei präsentiert sich dann wie folgend im Screenshot zu sehen. Wie sie sehen, das Layout unserer Website wird auch in der Hilfedatei integriert sein.
<p><img src="http://excel-ticker.de/wp-content/uploads/2010/04/excel.soccer.help.gif" alt="Excel Soccer World Cup Planner" title="Excel Soccer World Cup Planner" /></p>
<p>Klar, für moderne Anwendungen sollten eher Hilfedateien neueren Formats verwendet werden, wie sie beispielsweise von Visual Studio verwendet werden. Für den Planer sollte aber das ältere CHM-Format jedoch völlig ausreichend sein, zumal dieses Format auch von den neueren Windows Versionen unterstützt wird. Ausserdem lassen sich diese Dateien relativ einfach generieren und es gibt hierfür neben kommerziellen Anwendungen auch kostenlose Tools.
<p>Ursprünglich hatten wir vorgehabt, für jede Sprache eine eigene Hilfedatei sowie eine dynamische CHM-Datei zu generieren, welche beim Aufruf eine passende Datei lädt. Leider lassen sich Unterpunkte in einer zur Laufzeit geladenen Hilfedatei nicht zuverlässig per Excel VBA ansprechen. Somit haben wir uns entschieden, alle verfügbaren Sprachen in einer Hilfedatei zu integrieren.
<p>Um in Excel VBA die Hilfedateiladen zu können, bedarf es einiger API Importe aus dem für die Anzeige und Verwaltung zuständigen ActiveX Steuerelement „hhctrl.ocx“. Dieses muss dann natürlich auf dem System vorhanden sein und korrekt registriert worden sein. Es kann vorkommen, dass dies auf einigen System der Fall ist; Microsoft stellt jedoch hierfür Hotfixes bzw. Updates zur Verfügung.
<p>Folgend der Code zur Schaltfläche im Dialog zum Excel WM Planer Zusatztool. Im Codemodul zur UserForm wird beim Anklicken der Schaltfläche die Funktion „mlfhHelp()“ aufgerufen, die sich in einem eigenen Modul befindet.
<textarea name="code" class="vba" cols="60" rows="10">
' Help...
  
  Private Function mlfhHelp()
    
    Dim lngTopic As Long
    Dim strPath  As String
    Dim strFile  As String
    
'   Errors...
    
    On Error Resume Next
    
'   Initialize...
    
    strPath = ThisWorkbook.Path
    strFile = Replace(ThisWorkbook.Name, "." &#038; _
             "xls", "." &#038; "chm")
    
'   Check...
    
    If Trim(UCase(Dir(strPath &#038; "\" &#038; strFile))) <> _
       Trim(UCase(strFile)) Then
      
      mlfpMessage "MSG_HELP_LOAD"
      
    Else
      
'     Current...
      
      lngTopic = CLng(CMB_0001_1001.List( _
                      CMB_0001_1001.ListIndex, 0))
      
'     Open...
      
      mlfpApiHelpLoad strPath &#038; "\" &#038; strFile, _
      mlcpApiHelpContext, CStr(1000 * lngTopic)
      
    End If
    
'   Result...
    
    mlfhHelp = 0
    
  End Function
</textarea>
<p>In der Funktion wird geprüft, ob die Datei an der dafür vorgesehen Stelle vorhanden ist, eine in einer Combobox versteckte ID ermittelt und an die Funktion „mlfpApiHelpLoad()“ übergeben.
<textarea name="code" class="vba" cols="60" rows="10">
  Public Function mlfpApiHelpLoad(Filename As String, _
                                  Action As Long, _
                                  Data As String) As Long
    
    Dim typeQuery As mlthHelpQuery
    
'   Bypass errors...
    
    On Error Resume Next
    
'   Select...
    
    Select Case Action
    
      Case mlcpApiHelpTopic
        
'       Call...
        
        mlvpApiHelp = apiHelpTopic(Application.Hwnd, _
                                   Filename, Action, _
                                   Data)
        
      Case mlcpApiHelpContext, _
           mlcpApiHelpToc, _
           mlcpApiHelpIndex
        
'       Call...
        
        mlvpApiHelp = apiHelpHelp(Application.Hwnd, _
                                  Filename, Action, _
                                  CLng(Data))
        
      Case mlcpApiHelpSearch
        
'       Initialize...
        
        typeQuery.cbStruct = Len(typeQuery)
        typeQuery.fUniCodeStrings = 1&#038;
        typeQuery.pszSearchQuery = Data
        typeQuery.iProximity = 0&#038;
        typeQuery.fStemmedSearch = 0&#038;
        typeQuery.fTitleOnly = 1&#038;
        typeQuery.fExecute = 1&#038;
        typeQuery.pszWindow = ""
        
'       Call...
        
        apiHelpSearch 0&#038;, Filename, _
        mlcpApiHelpSearch, typeQuery
        
      Case Else
      
    End Select
    
'   Return...
    
    mlfpApiHelpLoad = 0
    
  End Function
</textarea>
<p>Der Funktion wir der Dateiname inklusive Pfad, eine auszuführende Aktion sowie ein Datenblock übergeben. Je nach Aktion werden Elemente in der Hilfedatei, wie beispielsweise eine bestimmte Seite, eine Indexseite oder die Seite zum Suchen nach Inhalten angesprochen. Entsprechend kommen dann die API Importe „apiHelpTopic ()“, „apiHelpHelp()“ und „apiHelpSearch()“ zum Einsatz. Diese sind im Codemodul im Kopfbereich entsprechend definiert bzw. deklariert.
<textarea name="code" class="vba" cols="60" rows="10">
'
' Constants...
'
' ........................................................................
  
' Display
  
  Public Const mlcpApiHelpContext           As Long = &#038;HF
  Public Const mlcpApiHelpTopic             As Long = &#038;H0
  Public Const mlcpApiHelpToc               As Long = &#038;H1
  Public Const mlcpApiHelpIndex             As Long = &#038;H2
  Public Const mlcpApiHelpSearch            As Long = &#038;H3

'
' Types...
'
' ........................................................................

  Private Type mlthHelpQuery
    
    cbStruct                                As Long
    fUniCodeStrings                         As Long
    pszSearchQuery                          As String
    iProximity                              As Long
    fStemmedSearch                          As Long
    fTitleOnly                              As Long
    fExecute                                As Long
    pszWindow                               As String
    
  End Type

'
' API...
'
' ........................................................................
  
' Help...
  
  Private Declare Function apiHelpHelp Lib "hhctrl.ocx" _
          Alias "HtmlHelpA" (ByVal hwndCaller As Long, _
                             ByVal pszFile As String, _
                             ByVal uCommand As Long, _
                             ByVal dwData As Long) As Long
  
  Private Declare Function apiHelpTopic Lib "hhctrl.ocx" _
          Alias "HtmlHelpA" (ByVal hwndCaller As Long, _
                             ByVal pszFile As String, _
                             ByVal uCommand As Long, _
                             ByVal dwData As String) As Long
  
  Private Declare Function apiHelpSearch Lib "hhctrl.ocx" _
          Alias "HtmlHelpA" (ByVal hwndCaller As Long, _
                             ByVal pszFile As String, _
                             ByVal uCommand As Long, _
                                   dwData As mlthHelpQuery) _
                                   As Long
  
' User...
  
  Private Declare Function apiSendMessage Lib "user32" _
          Alias "SendMessageA" (ByVal a As Long, _
                                ByVal b As Long, _
                                ByVal c As Long, _
                                      d As Any) As Long
</textarea>
<p>Ganz wichtig ist, dass bevor Excel geschlossen wird, die per Code geöffnete Hilfdatei auch zuvor geschlossen wird. Im schlimmsten Fall stürzt Ihnen ansonsten Windows (XP) mit einem Bluescreen oder Excel ab. Die Funktion „mlfpApiHelpClose()“ prüft ob das Hilfefenster noch vorhanden ist und, wenn ja, sendet eine Nachricht an dieses, um es zu schließen. Die Funktion wird dann aufgerufen, wenn das Zusatztool als solches geschlossen wird, also im Ereignis „Workbook_BeforeClose()“ oder wenn das Dialogfenster zum Tool geschlossen wird.
<textarea name="code" class="vba" cols="60" rows="10">
' Help...
  
  Public Function mlfpApiHelpClose() As Long
    
'   Errors...
    
    On Error Resume Next
    
'   Check...
    
    If apiHelpWindow(mlvpApiHelp) Then
      
      apiSendMessage mlvpApiHelp, &#038;H10, 0, 0
      
    End If
    
'   Return...
    
    mlfpApiHelpClose = 0
    
  End Function
</textarea>
<p>Abschließend einige Links zu thematisch verwandten Seiten und Tools, die die Erstellung von CHM-Dateien vereinfachen und unterstützen.
<ul>
<li><a href="http://www.excel-soccer-2010.de" target="_blank">Excel WM Planer zur Fussballweltmeisterschaft 2010, Deutsch</a></li>
<li><a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=00535334-c8a6-452f-9aa0-d597d16580cc&#038;displaylang=en" target="_blank">Microsoft HTML Help Workshop, kostenlos, Englisch</a></li>
<li><a href="http://www.help-info.de/de/welcome.htm" target="_blank">Help Info, Portal mit umfangreichen Information zur Windows Hilfe, Deutsch</a></li>
<li><a href="http://www.gridinsoft.com/de/chm.php" target="_blank">CHM Decompiler, kostenlos, Englisch</a></li>
<li><a href="http://www.helpware.net/" target="_blank">The Helpware Group mit kommerziellen Tools, Englisch</a></li>
<li><a href="http://www.ec-software.com/products_hm_overview.html" target="_blank">Help &amp; Manual mit kommerziellen Tools, Englisch</a></li>
<li><a href="http://www.helpsmith.com/" target="_blank">HTML Help Smith mit kommerziellen Tools, Englisch</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.excel-ticker.de/kompilierte-hilfedateien-fur-das-zusatztool-zum-excel-wm-planer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
