Die Excel Wühlkiste

Von XLS zu HTML konvertieren

HTML-Tabelle mit VBA schneller aktualisieren
Datei öffnen und in sequentielle Datei schreiben
Der "Open" und der "Print" - Befehl

Dieses Makro unterstützt uns beim Aktualisieren grosser Datenmengen in HTML-Dateien, deren Ursprung eine Excel-Tabelle ist.
Das ist ein alltägliches Thema für Webadmins. Denn oft müssen Mitgliedsdaten und Turnierergebnisse gepflegt werden, um nur ein Beispiel zu nennen.
Viele bedienen sich dazu einer komplexen Software oder benutzen die von Microsoft zur Verfügung gestellten Routinen. Der Nachteil liegt oft in einem unübersichtlich gestalteten Quellcode, der zudem auch noch mit vielen überflüssigen Befehlen überfrachtet und oft nicht einmal W3C-konform ist.
Hier hilft uns ein einfacher "Print"-Befehl, eine komplette HTML-Datei nach unseren Wünschen zu schreiben und diese mit den aktuellen Daten für die Tabelle zu füllen.
Für die Head- und sonstigen statischen Daten müssen wir uns nur einmal bemühen, während wir für das Auslesen der Tabellendaten eine geeignete VBA-Routine, wie etwa eine oder mehrere Schleifen, brauchen.
Mit diesem Makro schreiben wir alle Daten hintereinander (sequentiell) in eine HTML-Datei.

Der hier vorgestellte Code erzeugt eine komplette HTML-Datei mit Meta-Tags, Back-Links usw. Wer das nicht benötigt, kann den Code problemlos anpassen.

 

 
 
 

Der "Open for Output"-Befehl öffnet einen Datenkanal zur besagten HTML-Datei, wobei zu beachten ist, dass es sich beim Pfad um ein real existierendes Verzeichnis handeln muss. Die Datei selber wird jedoch neu erzeugt, wenn sie noch nicht vorhanden ist. Gibt es sie bereits im angegebenen Verzeichnis, wird sie mit jedem Durchlauf des Makros komplett neu überschrieben.
Dies ist nicht die einzige Möglichkeit, Daten in Dateien per VBA zu behandeln, für unser Ziel ist sie jedoch genau richtig.

Zu beachten wäre hier noch, dass Sonderzeichen, wie z.B. Umlaute in HTML konvertiert werden müssen. Ich mache das, indem ich die so erzeugte Datei einmal in meinen HTML-Editor lade und dann erneut abspeichere, wobei die Umwandlung der Zeichen automatisch geschieht. Für die Anzeige mit neueren Browsern ist das gar nicht nötig, aber es kann sein, dass ältere Programme nicht damit zurechtkommen und ein unerwünschtes Ergebnis anzeigen; also: konvertieren nicht vergessen.

Die Anführungszeichen innerhalb des Printbefehls müssen doppelt notiert werden, damit VBA diese auch richtig erkennt, denn sonst wird das zweite Anführungszeichen als Ende des Print-Befehls interpretiert.


So sieht die erzeugte Datei im Browser aus.

Option Explicit

Sub ZuHTML()

Dim TB1 As Worksheet
Dim i%, TMP$
Dim X As Integer
Dim Y As Integer

Set TB1 = Worksheets("Tabellenfunktionen")

' Anzahl der benutzten Spalten einlesen.
' Das benötige ich, um den Browser beim Anzeigen
' der Tabelle mit "colgroup" zu unterstützen
Y = 0
While IsEmpty(TB1.Cells(2, Y + 1)) = False
Y = Y + 1
Wend

Open "d:\Sonstiges\Html\Eigene Seite\Excel\VBA\tabellenfunktionen.htm" For Output As #1

Print #1, "<!doctype html public ""-//W3C//DTD HTML 4.01 Transitional//EN"">"
Print #1, "<html>"
Print #1, "<head>"
Print #1, "<title>Übersetzung der Tabellenfunktionen</title>"
Print #1, "<meta http-equiv=""Content-Type"" content=""text/html; charset=iso-8859-1"">"
Print #1, "<meta name=""description"" content=""Übersetzung der Tabellenfunktionen"">"
Print #1, "<meta name=""author"" content=""Hubert Scheidgen"">"
Print #1, "<meta name=""keywords"" content=""Tabellenfunktion, Übersetzung, VBA, Makro, Scheidgen, Excel"">"
Print #1, "<meta name=""generator"" content=""Ulli Meybohms HTML EDITOR"">"
Print #1, "<meta name=""content-language"" content=""de"">"
Print #1, ""
Print #1, "<link rel=""stylesheet"" type=""text/css"" href=""./vbaformate.css"">"
Print #1, "</head>"
Print #1, "<body>"
Print #1, ""
Print #1, "<div style=""width:450px; text-align:center"">"
Print #1, "<table width=360px border=3><tr align=center>"
Print #1, "<td width=290px><a href=""./index.htm"">zurück zur Auswahl: VBA</a></td>"
Print #1, "<td width=70px><a href=""../../index.htm"">Home</a></td>"
Print #1, "</tr></table></div>"
Print #1, "<hr class=""hr1"">"
Print #1, ""
Print #1, "<table width=450><tr><td>"
Print #1, "<h3 class=""us3"">Übersetzung der Tabellenfunktionen in Excel 97</h3>"
Print #1, "<div style=""font-size:11pt; text-align:justify"">"
Print #1, ""
Print #1, "Ohne viel Aufwand können in Excel eingebaute Tabellenfunktionen"
Print #1, "in VBA verwendet werden. Der Vorteil liegt nicht nur in der effizienteren"
Print #1, "Verarbeitung des Codes, er fällt auch wesentlich kürzer aus. Ein wenig"
Print #1, "problematisch ist nur, für die entsprechende Tabellenfunktion die richtige"
Print #1, "englische Übersetzung zu finden, da VBA ab Excel 97 keine deutschen"
Print #1, "Begriffe mehr kennt. Hier ist nun eine Gegenüberstellung ""Deutsch - Englisch""."
Print #1, "</div></td></tr></table>"
Print #1, ""
Print #1, "<hr class=""hr1"">"
Print #1, ""
Print #1, "<table border=""2"" style=""width:450px; border-collapse:collapse;"
Print #1, "border-color:black"">"

' Auslesen und schreiben der Tabellenüberschrift aus A1
TMP = "<caption><big>" & Range("A1") & "</big></caption>"
Print #1, TMP
' Dem Browser mitteilen, vieviele Tabellenspalten
' er erzeugen soll (Y). Damit können grössere Tabellen
' im Browser schneller angezeigt werden
Print #1, "<colgroup width=""225px"" span=""" & Y & """>"
Print #1, "</colgroup>"
Print #1, ""

i = 2
Print #1, ""

' Zeilenschleife
While IsEmpty(TB1.Cells(i, 1)) = False
X = 1
Print #1, "<TR>"

' Spaltenschleife
While IsEmpty(TB1.Cells(i, X)) = False

' Spezielle Formatierung der Spaltenköpfe
If i = 2 Then
' Verketten des TD-Tags mit dem Zellinhalt
TMP = "<TD align=center><big>" & Cells(i, X) & "</big></TD>"
Else
TMP = "<TD>" & Cells(i, X) & "</TD>"
End If

' Schreiben der Tabellenzelle
Print #1, TMP
X = X + 1
Wend

Print #1, "</TR>"
i = i + 1
Wend

Print #1, "</table>"
Print #1, ""
Print #1, "<hr class=""hr1"">"
Print #1, ""
Print #1, "<div style=""width:450px; text-align:center"">"
Print #1, "<table width=360px border=3><tr align=center>"
Print #1, "<td width=290px><a href=""./index.htm"">zurück zur Auswahl: VBA</a></td>"
Print #1, "<td width=70px><a href=""../../index.htm"">Home</a></td>"
Print #1, "</tr></table><br>"
Print #1, ""
Print #1, "Autor: Hubert Scheidgen / 26.05.2004"
Print #1, "</div>"
Print #1, ""
Print #1, "</body>"
Print #1, "</html>"
Print #1, ""
' Schliessen des Datenkanals
Close #1

End Sub
Die Excel Wühlkiste
Valid HTML 4.01 Strict
letzte Aktualisierung: 13.02.2009
Autor: Hubert Scheidgen / 04.02.2009
W3C CSS-Validierungsservice