VBA-Skripte

Für die Umstellung der Webseite und spätere einfache Pflege hatte ich zuerst ein VBScript gebaut, mit welchem ich die Webseite quasi an meinen "Standard" anpasse. Allerdings habe ich nach einiger Zeit doch gelernt, dass die gleiche Aufgabe als VBA in Frontpage mit dem dort vorhandenen Objektmodell viel einfacher und kompatibler zu realisieren ist. Das Script macht dabei alle notwendigen Dinge, damit die Webseiten statisch passend sind. Quasi die Offline-Version, was ein Content Management System per PHP, ASP etc. zur Laufzeit machen müsste.

ACHTUNG: Es handelt sich dabei nicht um eine fertige Software zum direkten Einsatz. Verstehen Sie das Skript eher als Muster und Vorlage für eigene Entwicklungen. Sie müssen die Dateien auf jeden Fall anpassen (Konstanten etc.)

Einstieg

Wenn Sie in Office und SharePoint Designer eigenen Code verwenden wollen, dann ist der "Visual Basic-Editor" der Startpunkt, wobei es genau genommen ein VBA-Editor ist

Sie sehen danach eine IDE mit einer Projektmappe, einem Arbeitsbereich und weitere Fenster für Properties, Debugging, Konsole etc.

Mein Projekt besteht aus einer kleinen GUI  "FRM_MSXFAQ" mit einigen Buttons, die dann auf die entsprechende Funktionen verweisen. Ein Druck auf den Button "PageworkOne" startet z.B.

Private Sub BTN_PageworkOne_Click()
    
    If Application.ActivePageWindow Is Nothing Then
        MsgBox ("Bitte erst eine Datei öffnen")
    Else
        BTN_PageworkOne.Enabled = False
        BTN_PageworkOne.Caption = "PageWork: Running"
        Call PageWork.PageWork(Application.ActivePageWindow)
        BTN_PageworkOne.Caption = "PageWork: Done:" & Now
        BTN_PageworkOne.Enabled = True
    End If
End Sub

Wenn aktuell keine Datei geöffnet ist, dann gibt es direkt eine Warnung mit Abbruch und ansonsten deaktiviere ich den Button, damit er nicht mehrfach gedrückt wird und rufe die Funktion "Pagework" in der Date "Pagework" mit dem aktuellen Dokument auf. Sie gibt es dann auch weitere Buttons für die Aktualisierung aller Seiten "Pagework", die Aktualsierung des RSS-Feed und der Homepage u.a. Die Magie ist aber in den aufgerufenen Funktionen

Wenn Sie selbst mit Frontpage und VBA arbeiten wollen, dann sollten Sie sich die entsprechende VBA-Hilfedateien herunter laden und installieren:

Konfiguration und globale Funktionen

Mein Projekt braucht natürlich eine Konfiguration und Einstellungen sollte man nie im Code fest codieren sondern entweder als Parameter übergeben oder in eine Konfigurationsdatei auslagen. Bei mir ist das eine config.xml" in einem Verzeichnis, welches natürlich nicht ins Internet veröffentlich wird. Dazu gehört eine Routine zum Einlesen der Konfiguration in eine globale Variable und einige andere Funktionsn für Diagnose-Ausgaben, Protokollierung, Konvertierungen etc. Fast alle folgenden Funktionen bauen auf diesen global bereit gestellten Komponenten auf.

Pagework

Hauptskript, welches jede einzelne Seite durcharbeitet, formatiert, das Menü, die Breadcrumb und die Links für die Übersetzung erstellt.

  • SetTitle
    Ich übernehme den Text der Überschrift H1 einfach in den Seitentitel mit
    TITLE = "Franks Exchange FAQ - " + "Bereichtitel" - %H1%.
  • Breadcrumb
    Auch die "Brotkrume", die den aktuellen Ort in der Navigation anzeigt, wird basierend auf der aktuellen Seite und der Position in der Navigation erstellt.
  • Navigation
    Diese Funktion erstellt die für die Seite passende Navigation. Dabei werden alle Nachbarn der aktuellen Seite als auch die Nachbarn aller in der Navigation höher liegenden Seiten hinzu gefügt. für das Layout wird eine "Unnumbered List" mit entsprechendem CSS-Tag genutzt. So kann dieses Menü vollkommen dynamisch aus der Frontpage Navigation erstellt werden. Handarbeit entfällt.
  • GoogleTranslate
    Man kann sehr einfach mit einem "FORM" und Google eine Funktion zur Übersetzung der Seite anbieten. Alternativ geht das auch einfach mit Bildern in den jeweilige in Landesflaggen hinter denen eine URL auf Google und der aktuellen Seite als Parameter übergeben wird. Nur leider kann auch das Frontpage nicht alleine.
  • Imagehandler
    Es ist nicht nur höflich, sondern auch gewünscht, dann alle Bilder ein ALT-Tag haben. Das erfreut vor allem die Screenreader. Bilder ohne dieses Tag sollten dann ein leeres ALT-Tag (ALT="") erhalten, damit Sie übersprungen werden. Später sind natürlich noch weitergehenden Funktionen möglich.
  • MarkHyperlink
    Alle Links auf Seiten innerhalb der MSXFAQ sollten mit einem kleinen Icon (MSXFAQ-Logo in klein) davor versehen werden, damit direkt sichtbar ist, dass dies ein Link innerhalb der Seite ist. Alle externen Links könnten dann ebenfalls mit einem anderen Symbol (z.B.: einer kleinen Weltkugel) gekennzeichnet werden.
  • Keywordcollect
    Die Webseite ist schon sehr umfangreich, so dass selbst ich manchmal nicht weiter finde. ähnlich wie die TechNet möchte ich jede Seite mit Schlüsselworten versehen (Keyword am unteren Rand). Das bedeutet aber, dass ein Programm dann beim Verarbeiten der Seiten alle Keywords mit der entsprechenden Seite erfassen und daraus für jedes Keyword eine eigene neue Seite und eine Seite mit allen Keywords aufbauen. Damit können dann einfach alle Seiten zu einem Keyword gesucht werden. Das erleichtert die Suche aber auch die direkte Angabe von URLs, z.B. www.msxfaq.de/keyword/srs.htm. Ideal wäre natürlich, wenn auch auf der Seite selbst die Keywords auf die Keyword-Seite verlinkt werden.
  • Tabelle
    Eine Tabelle, die noch keine "TH" Tags enthält, kann vermutlich ungefährlich so umformatiert werden, dass die erste Zeile einfach als Header mit TH formatiert wird.
  • Formatter
    Als letzte Funktion wäre es dann an der Zeit, all den Mist von manuellen Formaten, Office Formaten mehrfachen " " etc. zu entfernen, damit der Content und das Layout letztlich nur noch mit DIV, SPAN und über die CSS-Formate formatiert wird.
  • KBFinder
    In gesamten Inhalt wird nach den KB-Artikeln von Microsoft gesucht, Sie zeichnen sich aus durch den Prefix Q??????, KB?????? oder ??????  (?steht für eine Zahl). Diese Zeichen werden mit dem CSS-Style "KB" gekennzeichnet und mit dem Link zu Microsoft versehen.

MakeRSS

Dieser Codeteil sorgt dafür. dass die ersten 10 Aufzählungen auf der Seite "Verzeichnis der Änderungen " extrahiert und als XML-Datei gespeichert werden. Diese wird als RSS-Feed (MSXFAQ mit RSS) bereit gestellt. Damit muss ich nur noch (manuell) die Datei "Verzeichnis der Änderungen " pflegen und das Script erstellt fehlerfrei die XML-Datei.

Sitemap

Diese Funktion ist aktuell deaktiviert, da das VBA-Makro anscheinend mit der Menge an Seiten nicht mehr zurecht kommt.

Natürlich gehört zu jeder Webseite auch eine schicke Sitemap. Doch auch diese will erstellt und aktuell gehalten werden. Auch diese Seite wird über eine eigene Routine anhand der aktuellen Navigation erstellt. Damit das Skript eventuell bei ihnen funktioniert muss gelten:

  • Pfad zur Sitemap
    Im Script ist der Pfad auf /sonst/sitemap.htm eingetragen. Dies ist eventuell anzupassen
  • <div id="sitemap">
    Damit das VBA-Makro die erstellte Sitemap an die richtige Stelle einfügt, müssen Sie in der Zielseite einen Bereich im HTML-Code mit "<div id="sitemap"></div>" kennzeichnen. Das VBA-Makro ersetzt dann den Text innerhalb dieses Tags durch die Sitemap.
  • CSS-Style
    Die Anpassung des Formats erledigen Sie am besten durch eine Stylesheet, welches die Aufzählung im <div id="sitemap"> entsprechend formatiert. Details hierzu finden Sie auf StyleSheet
  • Globale Einstellungen
    Dieses Script nutzt Funktionen aus
    Global, die Sie natürlich auch eingebunden haben müssen.

Eine Beschreibung des angehenden Standards finden Sie auf http://www.sitemaps.org und http://www.sitemaps.org/protocol.php#informing.

MissinginNav

Dieses Skript mit Hilfe von Christoph Schneegans (MVP Frontpage) hat mir sehr deutlich gemacht, wie leistungsfähig VBA mit dem Frontpage Objektmodell ist. für die gleiche Funktion hätte ich in VBScript sicher mehrere Tage und vielen Lines of Code benötigt. Dieses Skript war die Initialzündung, mit VBA statt VBScript zu arbeiten. Nebenbei nutzen ich es eben um "vergessene" Seiten in der Navigation aufzuspüren.

Ich habe dazu nämlich ALLE Seiten in die Navigation aufgenommen. Allerdings kann man Seiten, die in der Navigation sind, durchaus "deaktivieren", d.h. damit sie nicht bei der Erstellung der Menüs, Sitemap etc. berücksichtigt werden.

Googlemap

Google ist ja quasi ein Standard für Suchmaschinen und die Macher von Google haben sich wieder was einfallen lassen. Viele Webseiten werden von Suchmaschinen nur teilweise oder unvollständig geladen, weil einige Links und Seiten nur per JavaScript und andere Verbindungen zu erreichen sind. Meine MSXFAQ habe ich absichtlich so gestaltet, dass alle Links statisch ohne Skripte funktionieren und daher von Google und anderen Suchmaschinen problemlos zu lesen sind. Allerdings ist auch das keine Garantie, dass es immer funktioniert.

Zudem ist es für einen Crawler eine größere Aufgabe, alle Seiten immer wieder abzurufen, um Veränderungen festzustellen. Daher hat Google einen neuen Weg definiert, wie Webmaster einer Webseite der Suchmaschine einfach geänderte Seiten anzeigen können.

Im Basisverzeichnis des Webs wird eine XML-Datei (bzw. mit GZip gepackt) abgelegt, in der eine Sitemap mit den Veränderungen enthalten ist. Google und andere Suchmaschinen können dann einfach diese Datei einlesen und damit ihren Crawler füttern.

Google XML-Datei

Die XML-Datei sollte etwa folgende Form haben.

<?xml version="1.0" encoding="UTF-8"?>
<URLset xmlns="http://www.google.com/schemas/sitemap/0.84">
   <URL>
      <loc>http://www.msxfaq.de/</loc>
      <lastmod>2005-01-01</lastmod>
      <changefreq>monthly</changefreq>
      <priority>0.8</priority>
   </URL>
   <URL>
      <loc>http://www.msxfaq.de/admin/default.htm</loc>
   </URL>
 </URLset>

Das XML-Elemente "<URL>" wird dabei je Seite immer wieder wiederholt. Das Element "<loc>" ist verpflichtend, während alle anderen Elemente optional sind.

Sitemap zu XML aufbereiten

Natürlich helfe ich gerne Google, auch wenn die MSXFAQ mittlerweile sehr gut zu finden ist. Es hat nur kurz gedauert, bis ich in Fronpage ein entsprechendes VBA-Makro gebaut habe, um diese Datei automatisch zu erzeugen. Mit Hilfe von Christoph Schneegans (www.schneegans.de) konnte ich meine erste Version mit String-Verarbeitung auf die Nutzung von MSXML2 umstellen und das Datum addieren.

Sie können das Skript problemlos bei sich einsetzen, solange Sie natürlich die Konstanten für ihre Web entsprechend anpassen. Das Script ist in 10 Minuten entstanden und funktioniert mit meiner Seite ganz gut.

Zudem ist das Skript Ausbaufähig. Sicher könnte ich mit dem MSXML2.DOMDocument50" Object das XML-File viel schöner erstellen als durch einfache String-Funktionen. Und im nächsten Schritt möchte ich natürlich auf das Attribut "<lastmod>" mit den Seiteneigenschaften füllen.

Sitemap anmelden

Nachdem die Sitemap dann erstellt ist, müssen Sie diese Google auch bekannt geben. Leider hat sich Google nicht dazu durchgerungen, einen Standardnamen ähnlich der "robots.txt" zu nutzen, sondern jeder Webmaster kann den Dateinamen nach gut dünken aussuchen und meldet ihn bei Google an. Das ist in sofern schade, da andere Suchmaschinen diese Datei dann nicht automatisch verwenden können, sondern ebenfalls angemeldet werden müssten. Denkbar wäre auch eine Information in der robots.txt, die auf die Sitemap verweist.

Auf https://www.google.com/webmasters/sitemaps/stats?hl=en können Sie nach der Anmeldung mit einem Google Account die XML-Datei hinzu fügen und einige Stunden später auch die Verarbeitung kontrollieren. Allerdings ist dazu ein Google Account erforderlich.

Nach der Eintragung sollte einige Stunden später dann auch der Erfolg sichtbar sein. Leider sendet Google aktuell wohl keine Informationsnachricht an die mit dem Google Account verbundene Mailadresse über Erfolg oder Misserfolg des Imports.

Links zu Googlemaps

Links zur robots.txt

Kleine GUI

Damit ich die Skripte nun nicht mühselig aufrufen muss, habe ich mir einen Button in die Taskleiste gelegt, der ein kleines Form aufruft. Von hier habe ich dann direkten Zugang zu den Menüs. Während der Laufzeit wird der entsprechende Button dann "grau" und nach dem Durchlauf steht der Zeitpunkt des Abschluss drin.

Ich muss natürlich daran denken, eben diese  Script vor einer Veröffentlichung auch auszuführen. Daher haben ich auch die Funktion "Upload Web" eingebaut. Dazu muss ich nur noch das Kennwort eingeben.

Das Logging zeigt mir an, was die Skripte durchgeführt haben. Die gleiche Ausgabe landet natürlich noch mal in einer Protokolldatei. "PageWork" ist die umfangreichste Funktion, die in jeder Seite die BreadCrumb, das Menü etc. anpasst aber auch dafür sorgt, dass z.B. alle Bilder ein ALT-Tag haben, der Titel mit einem "MSXFAQ" beginnt und vieles mehr.

Download

Eine alte Version der Skripte und Forms stehen hier zum Download bereit. Viel Spaß beim daraus "lernen"

vba-msxfaq20061101.zip

Inhalt des ZIP-Archivs:

Ich entwickle den Code natürlich immer weiter und passe ihn an, solange ich noch auf dieser alten Plattform arbeite. Das Ende ist aber abzusehen und zukünftig denke ich eher an eine Ablage in GIT und eine Generierung mit Offline Seitengeneratoren (Hugo u.a.)

Alter Code

Folgende Code sind noch vorhanden, aber werden nicht mehr aktiv genutzt

  • VBA:TGMenu
    Früher habe ich das Tigramenü von www.softcomplex.com/products/tigra_menu/ als zusätzliches dynamisches Menü eingesetzt. Diese bezieht seine Information aus einer JavaScript Definition. Ein VBScript liest die Navigationsstruktur aus der Datei structure.cnf aus und baut mit die passende JavaScript-Datei zusammen. Sie müssen nur dran denken, das Skript nach einer Änderung an der Navigation durchlaufen zu lassen. Ich selbst verwende aktuell kein JavaScript Menü mehr, da die Lade- und Initialisierungszeiten doch sehr lang wurden.
  • UploadWeb
    Aktuell noch nicht genutzt, da ich noch keinen Weg gefunden habe, wie Rückfragen von Frontpage behandelt werden können. Besonders das Löschen von ".htaccess"-Dateien stört mich.

Mögliche Erweiterungen

Natürlich ist zukünftig noch mehr möglich. Wobei sich das ganze dann immer weiter Richtung Content Management System entwickeln würde. Vielleicht wird irgendwann mal auch was daraus:

  • Permalinks Änderungen und Umstrukturierungen auf der Seite bedeuten leider auch immer, dass die Seiten so anders liegen und Links von anderen Seiten vielleicht ins Leere laufen. Die Keywords helfen dabei schon sicher, aber sind nur ein Notbehelf. Ein eindeutiger Index je Seite wäre eine Lösung. Nur habe ich noch nicht ganz durchdacht, wie das technisch dann aussieht.
  • Default Seiten erstellen
    Aktuell gibt es neben dem statischen Menü natürlich auch die Default Seite je Knotenseite in der Navigation. Vielleicht wäre es ja nicht mal schlecht, auch diese Seite aus den der Überschrift und dem ersten Absatz der Unterseiten zu erstellen. Aber da ich oft auch auf den Default Seiten zusätzliche Informationen habe, müsste ich mir da noch was einfallen lassen.
  • Keyword
    Ein größere Projekt ist es noch, aus den Schlüsselworten, die auf jeder Seite unten angeführt werden, eigene Indexseiten zu erstellen. Mal sehen wann ich mich da herantraue.

Aber aktuell bin ich mit der Art, wie ich die MSXFAQ mit FrontPage 2003 verwalten und aktualisieren kann schon ganz zufrieden.