Registriert seit: 13.04.2014
Version(en): 365
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, 14: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
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, 21:10
(Dieser Beitrag wurde zuletzt bearbeitet: 25.02.2015, 21: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, 21:40
(Dieser Beitrag wurde zuletzt bearbeitet: 25.02.2015, 21: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, 21:45
(Dieser Beitrag wurde zuletzt bearbeitet: 25.02.2015, 21: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
|