Anzeige
Archiv - Navigation
1340to1344
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Gleiche Werte zählen
03.12.2013 09:11:34
Howard

Hallo,
habe folgenden Code:
Sub Zufallszahl_Bereich()
Randomize
With Range("B1:B24")
.Formula = "=Round(Rand(),0)"
.Value = .Value
With Range("E1:E25")
.Formula = "=Round(Rand(),0)"
.Value = .Value
End With
End With
End Sub
Der Code generiert entweder den Wert 0 oder 1 und trägt ihn in die Zellen B1:B24 und
E1:E25 ein.
Nun habe ich drei Fragen:
1.) Wie kann man den Code kürzer fassen? Wie kriegt man nach Randomize in Range
beide Spalten eingetragen, damit man nicht alles zweimal hat?
2.) Ich wollte die Summe aller Werte, die 1 betragen, ermitteln und versuchte es
so:
Range("B25") = "ZÄHLENWENN("B1:B24";1)"
Range("B26") = "ZÄHLENWENN("E1:E25";1)"
Range("B27") = "SUMME(Range("B25")+ Range("B26"))
3.) Wie muß der Code aussehen, wenn das Makro erst die Zufallswerte in die beiden
Spalten einträgt, dann überprüft ob die Summe der 1-Werte gleich 35 ergibt,
und wenn dies nicht der Fall ist, solange weiter Zufallswerte generiert
bis 35 mal die 1 gekommen ist?

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Nicht kürzer, aber viiieel schöner :-)
03.12.2013 10:43:11
Marc
Moin!
Bei deiner Ausgabe der Zahlen werden in Spalte "E" nur 1 oder O ausgegeben, was mir aber bei der generierung einer Zufallszahl nicht zielführend zu sein scheint.
Daher betrachte ich jetzt beide Bereiche getrennt.
Die Formeln hab ich korrigiert, Randomize halte ich nicht für notwendig, das Ergebnis ist gleich.
Gruß, MCO
Sub Zufallszahl_Bereich()
Set rng1 = Range("B1:B24")
Set rng2 = Range("E1:E25")
With rng1
.Formula = "=Round(Rand(),0)"
.Copy
.PasteSpecial xlPasteValues
End With
With rng2
.Formula = "=Round(Rand(),0)"
.Copy
.PasteSpecial xlPasteValues
End With
Application.CutCopyMode = False
Range("A1").Select
Range("B25").FormulaLocal = "=ZÄHLENWENN(B1:B24;1)"
Range("B26").FormulaLocal = "=ZÄHLENWENN(E1:E25;1)"
Range("B27").FormulaLocal = "=summe(B25:B26)"
End Sub

Anzeige
AW: Nicht kürzer, aber viiieel schöner :-)
03.12.2013 20:16:42
Howard
Hallo Marc,
erstmal Danke für Deine Mühe.
Hab Deinen Vorschlag nun ausprobiert. In Spalte B und E sollen tatsächlich nach dem Zufallsprinzip
nur 0 oder 1 generiert werden. Das ganze Projekt zu erklären, würde hier zu weit führen. Nur so viel: es besteht aus einer ganzen Reihe von Makros, die Werte übertragen in Tabellen, wo sie auf diverse Bedingungen hin überprüft werden.
Dein Lösungsvorschlag funktioniert, hat aber den Nachteil, daß er nicht die gewünschten 35 1-Werte
liefert. Kann es sein, daß Du im Eifer des Gefechts die dritte Frage übersehen hast?
Gruß
Howard

Anzeige
oder ohne Formeln
03.12.2013 10:55:23
Erich
Hi Howard,
probier mal

Option Explicit
Sub Zufall_24_25()
Dim arB(1 To 24, 1 To 1) As Integer, arE(1 To 25, 1 To 1) As Integer
Dim ff As Double, m1 As Integer, m2 As Integer, ii As Integer
Const mSoll As Integer = 35
Randomize
ff = (UBound(arB) + UBound(arE)) / mSoll
Do Until m1 + m2 = mSoll
m1 = 0
For ii = 1 To UBound(arB)
arB(ii, 1) = -(ff * Rnd() > 0.5)
m1 = m1 + arB(ii, 1)
Next ii
m2 = 0
For ii = 1 To UBound(arE)
arE(ii, 1) = -(ff * Rnd() > 0.5)
m2 = m2 + arE(ii, 1)
Next ii
Loop
Cells(1, 2).Resize(UBound(arB)) = arB
Cells(1, 5).Resize(UBound(arE)) = arE
Cells(25, 2) = m1
Cells(26, 2) = m2
Cells(27, 2) = m1 + m2
End Sub
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
AW: oder ohne Formeln
03.12.2013 20:51:44
Howard
Hallo Erich,
klappt ganz hervorragend, tausend Dank.
Hab Const mSoll As Integer = 35 umgewandelt in mSoll = Range("A37"),
so kann ich den Wert der gewünschten 1er-Werte per Eingabefeld verändern, ohne jedesmal das
Makro umschreiben zu müssen ( Idee kam mir fünf Sekunden nachdem ich den Beitrag abgeschickt hab ).
Hab zu Deinem Code noch ein paar Fragen:
1.) In Deinem Code heißt es:
Do Until m1 + m2 = mSoll
....script...
Loop
Hätte
Do
....script....
Loop Until m1 + m2 = mSoll
die gleiche Wirkung, oder gäbe es da einen Unterschied?
2.) Manche benutzen bei Zufallszahlen Randomize, andere verzichten darauf. Wann sollte man
also Randomize verwenden, wann nicht?
3.) Du hast, abgesehen von ff, alle Werte als Integer deklariert. Denkbar wäre doch auch eine
Deklaration als Long, oder?
Hab mir jetzt auch Deine Erklärung zu Deiner Formel für die Berechnung des Datums der nächsten
Lottoziehung angesehen. So ist das schon verständlicher.
Gruß
Howard

Anzeige
AW: oder ohne Formeln
04.12.2013 02:25:16
Erich
Hi Howard,
zu 1.)
Ja, "Until m1 + m2 = mSoll" kann man auch am Ende hinter Loop schreiben.
Ist auch besser. Hat hier dieselbe Wirkung, und doch gibt es einen Unterschied:
Bei meiner ersten Programmversion wird bei "Do Until m1 + m2 = mSoll" die Bedingung auch vor dem ersten
Schleifendurchlauf geprüft. Das ist unnötig - wir wissen ja, dass zu Beginn m1 + m2 = 0 < mSoll ist.
zu 2.)
Randomize ist notwendig, man kann auch Randomize Timer schreiben.
Ohne Randomize sind die Rnd()-Werte nicht zufällig, sondern wiederholen sich bei jedem Start der Mappe.
zu 3.)
Ja, statt Integer geht auch eine Deklaration als Long. Das verwende ich meist auch.
Sinnvoll, manchmal notwendig ist Long sowieso, wenn VBA Long-Werte liefert (wie bei Count)
oder erwartet (wie bei Zeilen- oder Spaltennhummern).
Hier meine neue Version:

Sub Zufall_24_25_v2()
Dim arB(1 To 24, 1 To 1) As Long, arE(1 To 25, 1 To 1) As Long
Dim ff As Double, m1 As Long, m2 As Long, ii As Long
Dim mSoll As Long
mSoll = Cells(37, 1)
ff = (UBound(arB) + UBound(arE)) / mSoll
Randomize Timer
Do
m1 = 0
For ii = 1 To UBound(arB)
arB(ii, 1) = -(ff * Rnd() > 0.5)
m1 = m1 + arB(ii, 1)
Next ii
m2 = 0
For ii = 1 To UBound(arE)
arE(ii, 1) = -(ff * Rnd() > 0.5)
m2 = m2 + arE(ii, 1)
Next ii
Loop Until m1 + m2 = mSoll
Cells(1, 2).Resize(UBound(arB)) = arB
Cells(1, 5).Resize(UBound(arE)) = arE
Cells(25, 2) = m1
Cells(26, 2) = m2
Cells(27, 2) = m1 + m2
End Sub
"... Datums der nächsten Lottoziehung angesehen. So ist das schon verständlicher ..." Prima! :-)
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige

307 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige