Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1204to1208
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Geschwindigkeitsoptimierung

Geschwindigkeitsoptimierung
Michael
Hallo Forum,
Meine Frage dreht sich um die Optimierung eines VBA Ablaufes, der momentan einige Sekunden benötigt.
Meine Vorlage nutzt unter anderem ein Worksheet als A4 Textblatt. Dabei sind alle Zellen auf A4 Größe verbunden zu einer einzigen .Range("L13"). Mit einer Routine werden vorgefertigte Textblöcke zu einem neuen Text kombiniert. Überschriften werden dabei Fett eingesetzt. Beim Hinzufügen von Text verliert die Zelle die individuelle Formatierung der einzelnen Buchstaben.
Um das zu umgehen, habe ich eine Routine geschrieben, welche alle Buchstaben (bis zu 3000) nach fetter Formatierung abfragt und als Variablen (bBold) speichert. Nach dem Zusammenlesen wird die Formatierung wieder von den Variablen auf die Buchstaben übertragen. Dieser Teil geht recht schnell, da ich größere Pakete auf einmal formatieren kann.
Wo ich nicht weiter komme, ist beim Einlesen in den Variablenspeicher. Das dauert bei einer voller A4 Seite mit ca.2000 Buchstaben mehrere Sekunden. Folgende Routine benutze ich, um die Schnelligkeit zu prüfen:

Option Explicit
Private Declare Function GetTickCount Lib "kernel32" () As Long
Sub RecordFormat()
Dim bBold(3000) As Byte
Dim rText As Range
Dim iCount As Integer
Dim iZeit As Long
Dim iCellLength As Integer
iCount = 1
Set rText = ActiveSheet.Range("L13")  'Verbunden A4 große Zelle
iCellLength = Len(rText.FormulaR1C1)  'Bereits geschriebener Text
iZeit = GetTickCount
'Fette Buchstaben werden gemerkt
Do
If rText.Characters(iCount, 1).Font.Bold Then bBold(iCount) = 1
iCount = iCount + 1
Loop Until iCount = iCellLength
MsgBox "Millisekunden: " & GetTickCount - iZeit
End Sub

Gibt es eine schnellere Möglichkeit die Formatierung zu erfassen?
Danke
Michael

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Geschwindigkeitsoptimierung
22.03.2011 09:21:40
Rudi
Hallo,
Sub RecordFormat()
Dim bBold(3000)
Dim rText As Range
Dim iCount As Integer
Dim iZeit As Long
Dim iCellLength As Integer
iCount = 1
Set rText = ActiveSheet.Range("L13")  'Verbunden A4 große Zelle
iCellLength = Len(rText)  'Bereits geschriebener Text
iZeit = GetTickCount
'Fette Buchstaben werden gemerkt
For iCount = 1 To iCellLength
bBold(iCount) = rText.Characters(iCount, 1).Font.Bold
iCount = iCount + 1
Next
MsgBox "Millisekunden: " & GetTickCount - iZeit
End Sub

ist ca 3 Sek schneller. Vor allem For iCount = 1 To iCellLength bringt's.
Gruß
Rudi
Anzeige
AW: Geschwindigkeitsoptimierung
22.03.2011 09:34:34
Kawensmann
Hallo,
klar ist das schneller, du prüfst ja auch nur noch die Hälfte der Zeichen.
Nimm das
iCount = iCount + 1
mal raus ...
Gruß
Kawensmann
Aaargh! Schande über mich. owT
22.03.2011 09:41:46
Rudi
AW: Geschwindigkeitsoptimierung
22.03.2011 10:31:02
Timo
Hallo Michael,
das Einfügen von With rText hat bei mir zumindest 79 Milisekunden gespart. (getestet mit beliebigem Text in Länge 2000 Zeichen)
Option Explicit
Private Declare

Function GetTickCount Lib "kernel32" () As Long

Sub RecordFormat()
Dim bBold(3000) As Byte
Dim rText As Range
Dim iCount As Integer
Dim iZeit As Long
Dim iCellLength As Integer
iCount = 1
Set rText = ActiveSheet.Range("L13")  'Verbunden A4 große Zelle
iCellLength = Len(rText.FormulaR1C1)  'Bereits geschriebener Text
iZeit = GetTickCount
'Fette Buchstaben werden gemerkt
With rText
Do
If .Characters(iCount, 1).Font.Bold Then bBold(iCount) = 1
iCount = iCount + 1
Loop Until iCount = iCellLength
End With
MsgBox "Millisekunden: " & GetTickCount - iZeit
End Sub

Gruß
Timo
Anzeige
...Also hat er schon das Optimum! ;-) orT
22.03.2011 13:56:03
Luc:-?
Gruß Luc :-?
AW: Geschwindigkeitsoptimierung
22.03.2011 14:48:06
Michael
Hallo Timo, Luc und Rudi,
ich hatte gehofft, dass es vielleicht eine ganz andere Möglichkeit gibt die Sache zu lösen.
Wenn man die Zelle mit dem Text kopiert, dann bleiben alle Formatierungen erhalten.
Wie mach Excel denn das intern so schnell?
Gibt es eine Chance den ganzen Text auf einmal mit Formatierung in eine Variable zu kopieren und dann von dort die Info über die Formatierung abzufragen?
Vielen Dank für Eure Bemühungen
Das läuft über die Copy&Paste-Schiene und...
22.03.2011 17:01:04
Luc:-?
…kann in VBA auch nur so genutzt wdn, Michael,
nicht mit gleicher Geschwindigkeit über Einlesen in Variablen. Und auf die xl-internen Prozesse bei Copy&Paste bietet VBA keinen Zugriff. Du kannst nur den allgemeinen Zwischenspeicher abrufen.
Gruß Luc :-?
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige