| 
		
	
	
	
		
	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
 |