AW: Super Danke! ähm.kann man da nochn Turbo einbauen?
30.12.2014 13:23:27
Dieter Klemke
Hallo Thorben,
eine Beschleunigung erreichst du, wenn du deine Berechnung, die jetzt durch Formeln im Blatt "Berechnung" gemacht wird, auch in VBA durchführst.
Bei deiner Miniberechnung könnte das so aussehen:
Sub Verarbeitung_neu()
Dim C8 As Double
Dim D8 As Double
Dim D44 As Double
Dim dauer As Single
Dim E8 As Double
Dim fehl As Boolean
Dim letzteZeileE As Long
Dim rng As Range
Dim S41 As Double
Dim wb As Workbook
Dim wsB As Worksheet
Dim wsD As Worksheet
Dim wsE As Worksheet
Dim zeileD As Long
Dim zeileE As Long
dauer = Timer
Set wb = ThisWorkbook
Set wsB = wb.Worksheets("Berechnung")
Set wsD = wb.Worksheets("Daten")
Set wsE = wb.Worksheets("Ergebnis")
letzteZeileE = wsE.Cells(wsE.Rows.Count, "A").End(xlUp).Row
If letzteZeileE < 2 Then letzteZeileE = 2
wsE.Range(wsE.Cells(2, "B"), _
wsE.Cells(letzteZeileE, "C")).ClearContents
Set rng = wsD.Columns("A")
For zeileE = 2 To letzteZeileE
zeileD = Zeilennummer(Suchbegriff:=wsE.Cells(zeileE, "A"), _
SuchBereich:=rng, _
Fehler:=fehl)
If fehl Then
wsE.Cells(zeileE, "B") = "nicht gefunden"
Else
C8 = wsD.Cells(zeileD, "B")
D8 = wsD.Cells(zeileD, "C")
E8 = wsD.Cells(zeileD, "D")
S41 = C8 - D8
D44 = S41 * E8
wsE.Cells(zeileE, "B") = S41
wsE.Cells(zeileE, "C") = D44
End If
If zeileE Mod 100 = 0 Then
Application.StatusBar = "Zeile = " & zeileE
End If
Next zeileE
dauer = Timer - dauer
MsgBox "Dauer=" & Format$(dauer, "#,##0.00") & " Sek."
Application.StatusBar = Empty
End Sub
Function Zeilennummer(Suchbegriff As Double, _
SuchBereich As Range, _
Fehler As Boolean) As String
Fehler = False
On Error GoTo FehlerBeh
Zeilennummer = Application.WorksheetFunction. _
Match(Suchbegriff, SuchBereich, False)
On Error GoTo 0
Exit Function
FehlerBeh:
Fehler = True
End Function
Für den Zeitvergleich zwischen beiden Versionen habe ich eine Zeitmessung eingebaut.
Ich füge die ergänzte Mappe bei:
https://www.herber.de/bbs/user/94650.xlsm
Viele Grüße
Dieter