Registriert seit: 13.04.2014
Version(en): 365, 2019
Hallo Atilla,
Deine Variante ist ca. 1/3 schneller, erzeugt aber eine Menge von Dopplern, was definitiv nicht gewünscht ist.
Gruß
Edgar
Meine Antworten sind freiwillig und ohne Gewähr!
Über Rückmeldungen würde ich mich freuen.
Registriert seit: 14.04.2014
Version(en): 2003, 2007
(25.02.2015, 13:15)BoskoBiati schrieb: Hallo Atilla,
Deine Variante ist ca. 1/3 schneller
Hallo Edgar,
ich habe das bei mir genau umgekehrt beobachtet.
Das mit den Dopplern hatte ich festgestellt. Aber Du hast recht. Das darf natürlich nicht sein.
Danke für den Hinweis.
Wie ich schon schrieb, werde ich mich heute Abend noch einmal damit auseinander setzen.
Gruß Atilla
Registriert seit: 13.04.2014
Version(en): 365, 2019
Hallo Atilla,
Deine Variante ist mehr als doppelt so schnell, aber ich verstehe die Abläufe schon mal gar nicht, das ist mir noch viel zu tief in VBA.
Hier mal meine Werte aus mehreren Testläufen:
Arbeitsblatt mit dem Namen 'Tabelle1' | | M | N | O | 2 | Edgar | 0,435 | | 3 | Atilla | 0,184 | 42% |
Diese Tabelle wurde mit Tab2Html (v2.4.1) erstellt. ©Gerd alias Bamberg |
Gruß
Edgar
Meine Antworten sind freiwillig und ohne Gewähr!
Über Rückmeldungen würde ich mich freuen.
Registriert seit: 14.04.2014
Version(en): 2003, 2007
25.02.2015, 20:10
(Dieser Beitrag wurde zuletzt bearbeitet: 25.02.2015, 20:13 von atilla.)
Hallo Edgar,
Du verlierst die meiste Zeit beim schreiben in die Tabelle.
Statt in die Tabelle Zeileweise zu übertragen, überträgst Du nochmal in ein Array.
Den Inhalt dieses Arrays schreibst Du in einem Rutsch in den Bereich A1:D1000.
Hier Deine Variante mit den erwähnten Änderungen:
Code: Option Explicit
Sub Klick()
Dim loA As Long
Dim loB As Long
Dim lozahl As Long
Dim k As Long
Dim arrZahlen, arrZahlen2(3), arrZahlen3(999)
Dim arr(999, 3)
Dim bolTreffer As Boolean
Application.ScreenUpdating = False
loA = 0
Do
bolTreffer = False
arrZahlen = ""
Do
Randomize
lozahl = Application.WorksheetFunction.RandBetween(0, 36) 'vier unterschiedliche Zufallszahlen generieren
If InStr(arrZahlen, lozahl) = 0 Then
arrZahlen = lozahl & " " & arrZahlen 'Zufallszahlen in ein mit Leerzeichen getrennt in ein Array schreiben
arrZahlen2(loB) = lozahl
loB = loB + 1
End If
Loop While loB < 4
For loB = 0 To 3
arrZahlen3(loA) = arrZahlen3(loA) & WorksheetFunction.Small(arrZahlen2, loB + 1) & " " 'Mit kkleinste sortiert den Arrayinhalt wieder zurückschreiben
Next
If loA > 0 Then
For loB = 0 To loA - 1
If arrZahlen3(loB) = arrZahlen3(loA) Then bolTreffer = True
Next
End If
If bolTreffer = False Then loA = loA + 1
loB = 0
Loop While loA < 1000
For loA = 0 To 999
k = 0
For loB = 0 To 3
arr(loA, k) = Split(arrZahlen3(loA))(loB)
k = k + 1
Next loB
Next
With Range("A1:D1000")
.Value = arr
.NumberFormat = "General"
.Value = .Value
End With
Application.ScreenUpdating = True
End Sub
Da kann mein Code nicht mehr mithalten.
Mein Code ist aber auch ziemlich unbrauchbar. Da habe ich Mist zusammengebastelt.
Bei Dir würde ich auf diesen Teil noch ganz verzichten:
Code: .NumberFormat = "General"
.Value = .Value
Ich würde die Formate in der Tabelle schon vorgeben.
Gruß Atilla
Registriert seit: 01.11.2014
Version(en): 2007, 2010
Hallo zusammen,
hier eine andere Variante.
Code: Sub EintausendZufallszahlenOhneDoppelte()
Dim Varray As Variant
Dim i As Integer
Dim Zahl As Integer
Dim Zahl2 As Integer
Dim Zufall As String
Dim z As Long
'Werte zwischen 0 und 36 in Array schreiben
ReDim Varray(0 To 36)
For i = 0 To 36
Varray(i) = i
Next i
'Schleife für das Schreiben der Ergebnisse
For z = 1 To 1000
'Werte werden innerhalb des Arrays umsortiert
For i = 36 To 0 + 1 Step -1
Zahl = Int(Rnd() * (i - 0 + 1)) + 0
Zahl2 = Varray(Zahl)
Varray(Zahl) = Varray(i)
Varray(i) = Zahl2
Next i
Anzahl = 4
'Die ersten vier Werte aus Array werden ausgelesen und an Zufall übergeben
For i = 0 To 0 + Anzahl - 1
Zufall = Zufall & ", " & Varray(i)
Tabelle1.Range("A" & z) = Zufall
Tabelle1.Range("A" & z) = Mid(Trim(Tabelle1.Range("A" & z)), 2)
Next i
Zufall = ""
Next z
End Sub
Klappt leider nicht bei jedem Versuch ohne doppelte aber ich blicke es nicht mehr.
Vielleicht hat jemand von Euch noch eine Idee dazu.
Würde mich über Feedback freuen.
BTW: Arrays mag ich immer noch nicht :20:.
Gruß
Max
Registriert seit: 14.04.2014
Version(en): 2003, 2007
Hallo Edgar,
wenn ich das richtig beobachte, dann kommen bei Dir auch doppelte vor.
Sowohl mit Deinem Original Code als auch mit dem von mir angepassten.
Arbeitsblatt mit dem Namen 'Tabelle3' | | A | B | C | D | E | F | G | H | I | 1 | 5 | 8 | 10 | 29 | 5#8#10#29 | 1 | 962 | 1000 | 71 |
Zelle | Formel | E1 | =A1&"#"&B1&"#"&C1&"#"&D1 | F1 | =ZÄHLENWENN($E$1:$E$2001;E1) | G1 | =ZÄHLENWENN(F1:F2001;"=1") | H1 | =ANZAHL(F1:F2000) | I1 | =VERGLEICH(2;F:F;0) |
Diese Tabelle wurde mit Tab2Html (v2.4.1) erstellt. ©Gerd alias Bamberg |
Teste gleich noch mit # als Trenner statt Leerzeichen im Code
Gruß Atilla
Registriert seit: 14.04.2014
Version(en): 2003, 2007
Hallo Max,
bei mir kommt mit Deinem Code so etwas raus:
Arbeitsblatt mit dem Namen 'Tabelle4' | | A | 1 | 7, 14, 32, 11 | 2 | 1, 3, 30, 26 | 3 | 8, 32, 34, 16 | 4 | , 3, 8, 2 | 5 | 7, 31, 30, 3 | 6 | 9, 10, 4, 28 | 7 | 5, 25, 16, 11 | 8 | 2 | 9 | 4 | 10 | 1 | 11 | 0 | 12 | | 13 | | 14 | | 15 | 0 | 16 | |
Diese Tabelle wurde mit Tab2Html (v2.4.1) erstellt. ©Gerd alias Bamberg |
Du solltest Dir unbedingt angewöhnen mit Optin Explicit zu arbeiten.
Dann würdest Du sofort erkennen ob Variablen deklariert sind und kannst dann vermeiden in Fehler zu laufen.
In diesem Fall war Anzahl nicht deklariert.
Gruß Atilla
Registriert seit: 01.11.2014
Version(en): 2007, 2010
25.02.2015, 20:40
(Dieser Beitrag wurde zuletzt bearbeitet: 25.02.2015, 20:41 von Max.)
Hallo Atilla,
ich habe den Code bei mir mindestens 20 Mal laufen lassen, ohne einmal so ein Ergebnis zu bekommen.
Ich wusste, dass ich Anzahl nicht deklariert hatte.
Aber warum kommt bei Dir direkt so ein Mist und bei mir läuft der Code mehrfach sauber?
Das mit dem Option Explicit hatte ich ja schon versprochen...
Der Geist ist willig aber die Finger sind schwach :32:
Gruß
Max
Registriert seit: 01.11.2014
Version(en): 2007, 2010
25.02.2015, 20:45
(Dieser Beitrag wurde zuletzt bearbeitet: 25.02.2015, 20:48 von Max.)
Hi,
hier jetzt mit Deklaration.
Code: Option Explicit
Sub EintausendZufallszahlenOhneDoppelte()
Dim Varray As Variant
Dim i As Integer
Dim Zahl As Integer
Dim Zahl2 As Integer
Dim Zufall As String
Dim z As Long
Dim Anzahl As Long
'Werte zwischen 0 und 36 in Array schreiben
ReDim Varray(0 To 36)
For i = 0 To 36
Varray(i) = i
Next i
'Schleife für das Schreiben der Ergebnisse
For z = 1 To 1000
'Werte werden innerhalb des Arrays umsortiert
For i = 36 To 0 + 1 Step -1
Zahl = Int(Rnd() * (i - 0 + 1)) + 0
Zahl2 = Varray(Zahl)
Varray(Zahl) = Varray(i)
Varray(i) = Zahl2
Next i
Anzahl = 4
'Die ersten vier Werte aus Array werden ausgelesen und an Zufall übergeben
For i = 0 To 0 + Anzahl - 1
Zufall = Zufall & ", " & Varray(i)
Tabelle1.Range("A" & z) = Zufall
Tabelle1.Range("A" & z) = Mid(Trim(Tabelle1.Range("A" & z)), 2)
Next i
Zufall = ""
Next z
End Sub
Gruß
Max
Edit:
... und Option Explicit :32: Da wa es wieder!
Registriert seit: 14.04.2014
Version(en): 2003, 2007
Hallo Max,
ich bekomme immer noch das gleiche Egebnis. Au?erdem bei jedem Durchlauf die gleichen Zahlen.
Also keine Zufallszahlen. Ich habe mir Deinen Code aber nicht genau angesehen, dass ich sagen könnte woran es liegt.
Aber an der fehlenden Deklaration sicher nicht. Das hat hier keine Auswirkungen.
Du musst Option Explicit nicht hier einstellen, sondern bei Dir nutzen.
Mir fiel das ja deswegen auf, weil es bei mir immer drin ist. Das kannst Du im Editor in den Optionen einstellen.
Das weiß Du aber sicher.
Gruß Atilla
|