Hi
das ist mal ein schönes Beispiel, um die Effektivität von verschiedenen Programmierungsarten auszuprobieren und zu erlerenen.
hier sind 5 Problemlösungsvarianten, jeweils mit Zeitmessung.
die Laufzeit wird in Zeile 1 gezeigt.
gestoppt wird nur die Laufzeit der Schleife, nicht das Rückschreiben der Werte, das ist sowieso bei allen gleich.
Variante 1:
Tinos lösungsansatz mit der Replace-Funktion und dem Goto-Sprung
Variante 2:
Tinos Lösung mit der Replace-Funktion aber ohne den Goto-Sprung, dafür mit Exit-For und IF-Prüfung
Variante 3:
Alternative Prüfung, es werden die Häufigkeiten der einzelnen Ziffern aufsummiert und der Max-Wert der HÄufigkeiten untersucht (muss 1 sein)
Variante 4:
statt einer Zählschleife werden 5 Verschachtelte Schleifen (für jede Ziffer eine) verwendet, dadurch entfällt die Vereinzelung der Ziffern (String-Funktion)
Variante 5:
auch wieder 5 Schleifen (für jede Ziffer), jetzt werden die Ziffern direkt miteinander verglichen.
Es ergeben sich folgende Erkenntnisse:
1. die Variante 5 ist die schnellste, obwohl sie den meisten Programmcode enthält. Allerdings werden nur sehr einfache Funktionen verwendet, nur direkte Vergleiche und Boolsche Operationen, keine String-Operationen
Variante 1 und 2 und 3 sind recht langsam, weil aufwendigen String- und Umform-Funktionen verwendet werden.
2. der Goto-Stprung hat keinen Positiven Einfluss auf die Geschwindigkeit, Variante 1 und 2 sind gleich schnell. Wahrscheinlich wird die Gesparte Zeit beim IF-Vergleich durch das Suchen der Sprungmarke wieder kompensiert
Ergo: kurzer und eleganter Code ist nicht immer schnell, es kommt auch auf die verwendeten Funktionen an.
alles was mit Strings zu tun hat, bremst.
Allerdings muss man hier natürlich abwägen, zwischen dem Zeitaufwand den Code zu erstellen und zu pflegen und der Zeit für den Programmlauf.
Sub Zahlen1()
Dim MyAr()
Dim A As Long, B As Long, i As Integer
Dim t As Double
Columns(1).ClearContents
Columns(1).NumberFormat = "00000"
t = Timer '-------------------------------
For A = 1234 To 98765
For B = 0 To 9
If Len(Replace(Format(A, "00000"), B, ""))
Sub Zahlen2()
Dim MyAr()
Dim A As Long, B As Long, i As Integer
Dim t As Double
Columns(2).ClearContents
Columns(2).NumberFormat = "00000"
t = Timer '-----------------------------------
For A = 1234 To 98765
For B = 0 To 9
If Len(Replace(Format(A, "00000"), B, ""))
Sub Zahlen3()
Dim t As Double
Dim MyAr()
Dim A As Long, B As Long, i As Integer, x As Integer
Dim check(9)
Columns(3).ClearContents
Columns(3).NumberFormat = "00000"
t = Timer '--------------------------------------
For A = 1234 To 98765
Erase check
For B = 1 To 5
x = Mid$(Format(A, "00000"), B, 1)
check(x) = check(x) + 1
Next B
If WorksheetFunction.Max(check) = 1 Then
i = i + 1
ReDim Preserve MyAr(1 To 1, 1 To i)
MyAr(1, i) = A
End If
Next A
t = Timer - t '----------------------------------------
Cells(1, 3).Value = t
Cells(2, 3).Resize(UBound(MyAr, 2), UBound(MyAr, 1)) = WorksheetFunction.Transpose(MyAr)
Rows(1).NumberFormat = "General"
End Sub
Sub Zahlen4()
Dim t As Double
Dim MyAr()
Dim A1 As Integer, A2 As Integer, A3 As Integer, A4 As Integer, A5 As Integer, B As Long, i _
As Integer, x As Integer
Dim check(9) As Integer
Columns(4).ClearContents
Columns(4).NumberFormat = "00000"
t = Timer '-------------------------------------
For A1 = 0 To 9
For A2 = 0 To 9
For A3 = 0 To 9
For A4 = 0 To 9
For A5 = 0 To 9
Erase check
check(A1) = check(A1) + 1
check(A2) = check(A2) + 1
check(A3) = check(A3) + 1
check(A4) = check(A4) + 1
check(A5) = check(A5) + 1
If WorksheetFunction.Max(check) = 1 Then
i = i + 1
ReDim Preserve MyAr(1 To 1, 1 To i)
MyAr(1, i) = A1 * 10000# + A2 * 1000 + A3 * 100 + A4 * 10 + A5
End If
Next A5
Next A4
Next A3
Next A2
Next A1
t = Timer - t '-------------------------------------
Cells(1, 4).Value = t
Cells(2, 4).Resize(UBound(MyAr, 2), UBound(MyAr, 1)) = WorksheetFunction.Transpose(MyAr)
Rows(1).NumberFormat = "General"
End Sub
Sub Zahlen5()
Dim t As Double
Dim MyAr()
Dim A1 As Integer, A2 As Integer, A3 As Integer, A4 As Integer, A5 As Integer, B As Long, i _
As Integer, x As Integer
Dim check As Boolean
Columns(5).ClearContents
Columns(5).NumberFormat = "00000"
t = Timer '---------------------------------
For A1 = 0 To 9
For A2 = 0 To 9
For A3 = 0 To 9
For A4 = 0 To 9
For A5 = 0 To 9
check = False
check = check Or (A1 = A2)
check = check Or (A1 = A3)
check = check Or (A1 = A4)
check = check Or (A1 = A5)
check = check Or (A2 = A3)
check = check Or (A2 = A4)
check = check Or (A2 = A5)
check = check Or (A3 = A4)
check = check Or (A3 = A5)
check = check Or (A4 = A5)
If Not check Then
i = i + 1
ReDim Preserve MyAr(1 To 1, 1 To i)
MyAr(1, i) = A1 * 10000# + A2 * 1000 + A3 * 100 + A4 * 10 + A5
End If
Next A5
Next A4
Next A3
Next A2
Next A1
t = Timer - t '-------------------------
Cells(1, 5).Value = t
Cells(2, 5).Resize(UBound(MyAr, 2), UBound(MyAr, 1)) = WorksheetFunction.Transpose(MyAr)
Rows(1).NumberFormat = "General"
End Sub
Gruß, Daniel