ich hab hier ein Excel-Sheet vorliegen, bei dem massig Formatierungen innerhalb von Zellen vorgenommen worden sind. Es sind so ca. 1000 Zellen mit Textlängen zwischen 200 und 500 Zeichen, die ich auslesen und in HTML-Code verwandeln möchte, wobei mich nur die Formatierungen
- Fett
- Kursiv
- Schriftfarbe rot (font.colorindex=3)
interesseren.
Soweit ich weiß, kriegt man das nur über die .characters-Eigenschaft raus. Meine bisherige Lösung (nur der Teil, der die Verwandlung vornimmt) sieht folgendermaßen aus:
Function fctHTMLFormat2(r As Range, w As Integer) As String
Dim strE As String
Dim i As Integer, l As Integer, j As Integer
If w = vbNo Then
fctHTMLFormat2 = r.Value
Exit Function
End If
l = Len(r)
j = 1
If InStr(1, r.Characters(1, 1).Font.FontStyle, "Fett") <> 0 Then
strE = strE & "<b>"
End If
If InStr(1, r.Characters(1, 1).Font.FontStyle, "Kursiv") <> 0 Then
strE = strE & "<i>"
End If
If r.Characters(1, 1).Font.ColorIndex = 3 Then
strE = strE & "<span style=" & Chr(34) & "color: rgb(255, 0, 0);" & Chr(34) & ">"
End If
For i = 2 To l
If r.Characters(i, 1).Font.FontStyle <> r.Characters(i - 1, 1).Font.FontStyle Then
strE = strE & Mid(r, j, i - j)
j = i
If InStr(1, r.Characters(i, 1).Font.FontStyle, "Fett") <> 0 And _
InStr(1, r.Characters(i - 1, 1).Font.FontStyle, "Fett") = 0 Then
strE = strE & "<b>"
End If
If InStr(1, r.Characters(i, 1).Font.FontStyle, "Fett") = 0 And _
InStr(1, r.Characters(i - 1, 1).Font.FontStyle, "Fett") <> 0 Then
strE = strE & "</b>"
End If
If InStr(1, r.Characters(i, 1).Font.FontStyle, "Kursiv") <> 0 And _
InStr(1, r.Characters(i - 1, 1).Font.FontStyle, "Kursiv") = 0 Then
strE = strE & "<i>"
End If
If InStr(1, r.Characters(i, 1).Font.FontStyle, "Kursiv") = 0 And _
InStr(1, r.Characters(i - 1, 1).Font.FontStyle, "Kursiv") <> 0 Then
strE = strE & "</i>"
End If
End If
If r.Characters(i, 1).Font.ColorIndex <> r.Characters(i - 1, 1).Font.ColorIndex Then
strE = strE & Mid(r, j, i - j)
j = i
If r.Characters(i, 1).Font.ColorIndex = 3 Then
strE = strE & "<span style=" & Chr(34) & "color: rgb(255, 0, 0);" & Chr(34) & ">"
Else
strE = strE & "</span>"
End If
End If
Next
strE = strE & Mid(r, j, i - j)
If InStr(1, r.Characters(l, 1).Font.FontStyle, "Fett") <> 0 Then
strE = strE & "</b>"
End If
If InStr(1, r.Characters(l, 1).Font.FontStyle, "Kursiv") <> 0 Then
strE = strE & "</i>"
End If
If r.Characters(l, 1).Font.ColorIndex = 3 Then
strE = strE & "</span>"
End If
fctHTMLFormat2 = strE
End Function
Es ist also eine Funktion, die ein Range-Objekt (jeweils eine Zelle) auswertet und das Ergebnis als String (mit HTML-Tags) zurückgibt. Dass aus den einzelnen Strings ein größerer String zusammengesetzt wird (der u.a. HTML-Tabellen enthält) spielt hier nicht zur Sache. Denn das Problem ist ganz eindeutig diese Funktion.
Eigentlich macht die Funktion perfekt das, was ich will - jedoch dauert sie viel zu lange!
Der Parameter w ist dazu da, testweise auf das Auslesen der Formatierungen zu verzichten, bei w=vbNo=7 wird einfach der komlette Zellinhalt als String zurückgegeben, ansonsten erfolgt die detaillierte Format-Auswertung.
OHNE diese Format-Auswertung wird der komplette Code (von allen 1000 Zellen) in ca 2 Sekunden erzeugt, MIT hingegen dauert es je nach "Laune" von Excel zwischen 90 Sekunden und 20 Minuten!!
Hat einer 'ne Ahnung, woran das liegt oder 'ne Idee, wie es eleganter geht?