Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Makro´s beschleunigen

Forumthread: Makro´s beschleunigen

Makro´s beschleunigen
05.12.2016 15:30:44
Blue
Servus,
ich habe 2 Makros die auf Grund von Großen Datenmengen sehr lange brauchen um ausgeführt zu werden.
Das 1. liest aus externen Dateien Texte aus und schreibt sie in die Excelliste.
Das 2. Markiert in Tabelle1 Texte die in Tabelle2 stehen.
1.

Sub F_Dateien_einlesen()
With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual
.EnableEvents = False
End With
Dim spfad As String, sExt As String, sDatei As String
Dim wb1 As Workbook, WB2 As Workbook
Set wb1 = ThisWorkbook
spfad = Left(wb1.Path, InStrRev(wb1.Path, "\") - 0)
spfad = Left(spfad, InStrRev(spfad, "\")) & "Test\PPS\"
sExt = "*.f"
sDatei = Dir(spfad & sExt)
Application.ScreenUpdating = False
wb1.Worksheets(2).Cells.Delete
Do While Len(sDatei) > 0
Set WB2 = Workbooks.Open(spfad & sDatei)
WB2.Worksheets(1).Rows(3).Copy wb1.Worksheets(2).Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
WB2.Close
sDatei = Dir()
Loop
With Application
.ScreenUpdating = True
.Calculation = xlCalculationAutomatic
.EnableEvents = True
End With
End Sub

2.

Sub Pläne_markieren()
Dim rngMatch As Range, rngC As Range, rngA As Range, strMatch
Dim lngCol As Long, i As Integer
Application.ScreenUpdating = False
With Tabelle2
Set rngMatch = .Range(.Cells(1, 1), .Cells(Rows.Count, 1).End(xlUp))
End With
For Each rngA In Tabelle1.UsedRange.Cells
For Each rngC In rngMatch
lngCol = rngC.Font.Color
For i = 1 To Len(rngA) - Len(rngC) + 1
strMatch = Mid(rngA, i, Len(rngC))
Debug.Print strMatch
If strMatch = rngC Then
With rngA.Characters(i, Len(rngC)).Font
.Color = lngCol
.Bold = True
.Italic = True
End With
End If
Next i
Next rngC
Next rngA
End Sub

Gibt es eine Möglichkeit diese Makros irgendwie zu beschleunigen?
mfg Blue Bird
Anzeige

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Makro´s beschleunigen
05.12.2016 15:46:46
Rudi
Hallo,
auf jeden Fall
Debug.Print strMatch

löschen.
Evtl. ist das schneller:
Sub Pläne_markieren()
Dim rngMatch As Range, rngC As Range, rngA As Range, strMatch
Dim i As Integer, j As Integer
Dim arrColors(), strSearch As String
Application.ScreenUpdating = False
With Tabelle2
Set rngMatch = .Range(.Cells(1, 1), .Cells(Rows.Count, 1).End(xlUp)).Resize(, 2)
ReDim arrColors(1 To rngMatch.Rows.Count, 1 To 2)
For Each rngC In rngMatch
i = i + 1
arrColors(i, 1) = rngC
arrColors(i, 2) = rngC.Font.Color
Next rngC
End With
For Each rngA In Tabelle1.UsedRange.Cells
For j = 1 To UBound(arrColors)
strSearch = arrColors(i, 1)
For i = 1 To Len(rngA) - Len(strSearch) + 1
strMatch = Mid(rngA, i, Len(strSearch))
If strMatch = strSearch Then
With rngA.Characters(i, Len(strSearch)).Font
.Color = arrColors(j, 1)
.Bold = True
.Italic = True
End With
End If
Next i
Next j
Next rngA
End Sub
Gruß
Rudi
Anzeige
AW: Makro´s beschleunigen
05.12.2016 16:21:15
Daniel
Hi
etwas schneller fürs 2. Marko (Pläne markieren) vielleicht so:
Sub Pläne_markieren2()
Dim rngMatch As Range, rngC As Range, rngA As Range, strMatch
Dim txtA As String, txtC As String
Dim lngCol As Long, i As Integer
Application.ScreenUpdating = False
With Tabelle2
Set rngMatch = .Range(.Cells(1, 1), .Cells(Rows.Count, 1).End(xlUp))
End With
For Each rngA In Tabelle1.UsedRange.Cells
txtA = rngA.Value
For Each rngC In rngMatch
lngCol = rngC.Font.Color
txtC = rngC.Value
i = 0
Do
i = InStr(i + 1, txtA, txtC)
If i = 0 Then Exit Do
With rngA.Characters(i, Len(txtC)).Font
.Color = lngCol
.Bold = True
.Italic = True
End With
Loop
Next rngC
Next rngA
End Sub
wenns nicht schon anderweitig sicherstgestellt ist das es in den zusammenkopierten Dateien keine Duplikate gibt, solltest du in der Tabelle2 noch die Duplikate entfernen, damit die Texte nicht mehrfach gefärbt werden.
dazu müsste dann an den Anfang des zweiten oder Ende des ersten Makros der Code.
Tabelle2.Columns(1).RemoveDuplicates 1, xlno
Gruß Daniel
Anzeige
AW: Makro´s beschleunigen
05.12.2016 18:25:48
Michael
Hi,
fürs 2. eine Variation von Daniels Code:
Sub Plaene_markieren3()
Dim rngMatch As Range, rngC As Range, rngA As Range, strMatch
Dim txtA As String, txtC As String
Dim aM, aMz&, amMax& ' array "Match", Zähler und max.; & = as long
Dim lngCol As Long, i As Long ' Immer long schadet nicht...
Dim t0 As Double
t0 = Timer
Application.ScreenUpdating = False
With Tabelle1 ' vertauscht! **** bitte bei Deiner Datei wieder ändern!
i = .Range("A" & .Rows.Count).End(xlUp).Row
aM = .Range("A1").Resize(i, 3)
amMax = UBound(aM)
For i = 1 To amMax
aM(i, 2) = Len(aM(i, 1))
aM(i, 3) = .Range("A" & i).Font.Color
Next
End With
For Each rngA In Tabelle2.UsedRange.Cells
txtA = rngA.Value  ' .text?! trim/Lcase?
For aMz = 1 To amMax
i = 0
Do
i = InStr(i + 1, txtA, aM(aMz, 1)) ' 4. Parameter?
If i = 0 Then Exit Do
With rngA.Characters(i, aM(aMz, 2)).Font
.Color = aM(aMz, 3)
.Bold = True
.Italic = True
End With
Loop
Next
Next rngA
MsgBox Timer - t0
End Sub

Der Knackpunkt ist: len() ist eine Funktion, die bei jedem Aufruf "rechnet", ebenso benötigt das wiederholte Auslesen der Farbe Zeit.
Deshalb mache ich das nur einmal und schreibe sowohl Länge und Farbe zusätzlich zu den Daten in ein Array. Das benötigt dann nur noch ca. 1/5 der Zeit.
Beim ersten Fall vermute ich, daß Excel bei der Endung ".f" damit Zeit vertut, jede einzelne Datei zu analysieren, um was für einen Datenstruktur es sich handelt. Das reine Kopieren geht dann zwar "sehr schön" über nur eine Befehlszeile, aber ich vermute, daß das Einlesen von Text in einen String und das "händische" Zerpflücken desselben deutlich schneller geht.
Dazu wäre aber eine Beispieldatei sinnvoll.
Schöne Grüße,
Michael
Anzeige
;

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige