Kann man mit VBA eine Zufallszahl aus einem Zellbereich der mit verschiedenen Zahlen gefüllt ist programmieren?
Hallo liebe Experten, ist folgende Aufgabe mit VBA zu lösen ? : Zellbereich A1:A10 ist gefüllt mit unterschiedlichen Zahlen und ich möchte eine zufällige Zahl aus diesem Zellbereich , es ist wichtig dass nur eine zufällige Zahl aus diesen Zahlen die in dem Zellbereich vorkommen gewählt wird. Es gibt kein minimum und keine maximum Angabe , die Zahlen in dem Bereich ändern sich ständig und somit kann ich mich auch nicht auf einen bestimmten Zahlenbereich festlegen zB. 1-100. Ist sowas überhaupt machbar? für eure Hilfe wie immer sehr dankbar MfG Uwe
2 Antworten
=INDIREKT("A"&GANZZAHL(ZUFALLSZAHL()*10)+1)
oder
=INDIREKT("A"&AUFRUNDEN(ZUFALLSZAHL()*10;0))
Nenn das übrigens Zufallstreffer, weils ja eine Auswahl beinhaltet, also nicht mehr ganz zufällig ist -nur zur Unterscheidung der Probleme für die Antwortenden.
obiges muss in beiden Fällen heissen:
...Cint(Rnd() * 10 + 1)...
sonst erhältst Du bei Rnd() < 0,1 einen Fehler und A10 wird gar nie angewählt. Cint entspricht im Wesentlichen der Fkt =Ganzzahl(Zahl).
Bei den Formeln hab ich noch drangedacht, hier nicht mehr
(jetzt muss ich aber wirklich dringend weg!)
- Ich würde noch einen Randomize vorschalten
- Alle Funktionen, die in Excel verwandt werden, können in VBA mit Application.WorksheetFunction erreicht werden (falls man die Excellösung schon hat und nicht nach den Visual Basic-Befehlen suchen will).
@ Subopt: Wie meinst Du das:
Ich würde noch einen Randomize vorschalten
?
@ Marc: es geht auch so kurz (grade ausprobiert, wenn A1:A10 des gleichen Blattes angesprochen werden soll):
ActiveCell = Range("A" & CInt(Rnd() * 10 + 1))
@Subopt:,@lamiam: Danke , aber bitte entschuldigt wenn meine VBA Kenntnisse nicht ausreichen um das umzusetzen, könntet ihr vielleicht von sub ..... bis sub End etwas für mich erstellen? Das wäre super vielen Dank im voraus!
Mit Randomize wird der Einstiegspunkt in die Zufallszahlenfolge variabel gestaltet. Früher (ich weiß nicht, ob heute immer noch) wurde hierfür der Timer verwendet
Früher in Basic: Randomize Timer
https://en.wikibooks.org/wiki/BASIC\_Programming/Random\_Number\_Generation
Heute: Randomize
https://goo.gl/9ls3ys
@lamiam: bei deiner Formel für Excel wo steht da der Zellbezug? "A"& ??? wo kommt der Bezug auf A1:A10 rein? Du musst bitte verstehen das ich keine Leuchte in Excel Formeln und VBA bin ich habe zwar schon viel dazu gelernt aber manche Dinge sind mir noch rätselhaft :-) verzeih mir deshalb meine doofe Frage! Danke
@Subopt: zusätzliches Randomize braucht es m.W. heute nicht mehr, die Rechner sind um Größenordnungen besser geworden. Auch beim automatischen Aufruf vieler Zufallszahlen schnell hintereinander ist jede individuell. (vllt ist das aber sogar versteckt drin in deren Programmierung)
@Marc: GANZZAHL(ZUFALLSZAHL()*10)+1 liefert eine Zahl von 1..10, was in Kombinbation mit "A" davor eine Adresse aus A1:A10 ergibt. Da diese aber aus Teilen zusammengesetzt ist, muß indirekt( davor.
in welche Zelle Du das reinschreibst, ist egal, eben dort, wo Du es haben willst oder auch als Teil einer Formel.
Du kannst das auch wie PWolff machen, aber dann kannst Du die Formel nur dann nach rechts oder unten kopieren, wenn Du $A$1 absolut setzt (und kürzer ist es auch nicht)
So sieht das Sub aus, je nachdem, wie Du arbeiten willst:
Alles im selben Blatt:
Sub ZufälligeZellauswahlNachZeilen()
ActiveCell = Range("A" & CInt(Rnd() * 10 + 1)) 'geht auch so kurz!
End Sub
Sub ZufälligeZellauswahlNachZeilen() 'lange Form (unnötig)
ActiveSheet.Range("T46").Value = ActiveSheet.Range("A" & CInt(Rnd() * 10 + 1))
End Sub
Wenn sich die Quellzellen A1:A10 in einem anderen (nämlich Quell-)Blatt befinden als die Zielzelle (Zielzelle ist die Zelle, wo das Ergebnis erscheinen soll) - das ist der übliche Fall und es schadet nichts, das IMMER so zu machen:
Sub ZufälligeZellauswahlNachZeilen()
ActiveCell = Worksheets("Quellblattname").Range("A" & CInt(Rnd() * 10 + 1)) 'auskommentierter Demo-Text
End Sub
(Cint() bedeutet: mach aus der Zahl eine Ganzzahl (Integer).
Es gibt auch Cdbl: wandle die Zahl zu einer 16-stelligen Zahl (ggf mit Komma) um.
Oder Cstr: mach Text (String) draus, ich glaube, es gibt noch weitere Umwandlungen zu anderen Datentypen, braucht man aber selten.
Es stimmt, dass der Umweg über VBA in diesem Fall überflüssig ist (es sei denn, in der Aufgabenstellung fehlen wesentliche Punkte).
Wozu der Umweg über "INDIREKT"? Ich würde
=BEREICH.VERSCHIEBEN(A1;GANZZAHL(ZUFALLSZAHL()*10);0)
verwenden.
OK, der Abschnitt bleibt konstant. Wo kommen die Zahlen her?
Der Wertebereich ist stets < x. Wie groß ist die maximale Zahl?
Du könntest dir mal Random angucken
http://www.techonthenet.com/excel/formulas/rnd.php
Sorry, hab das dicke VBA überlesen. also:
Activesheet.range("S, Z").value = Activesheet.Range("A" & Cint(Rnd() * 10))
müsste gehen, oder
Activesheet.Cells(z, s) = Activesheet.Cells(Activesheet.Cells(Cint(Rnd() * 10), 1))
kann sein, dass Du Dir das Activesheet. sparen kannst ebenso wie das .value
(sind wahrscheinlich VorgabeArgumente), kanns nicht mehr ausprobieren, muss weg.