Kann man mit VBA eine Zufallszahl aus einem Zellbereich der mit verschiedenen Zahlen gefüllt ist programmieren?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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

Iamiam  03.02.2016, 09:19

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.

2
Iamiam  03.02.2016, 09:50
@Iamiam

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

3
Suboptimierer  03.02.2016, 10:15
@Iamiam
  • 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).
3
Iamiam  03.02.2016, 15:07
@Suboptimierer

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

0
Marceloblau01 
Fragesteller
 03.02.2016, 15:19
@Iamiam

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

0
PWolff  03.02.2016, 15:28

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.

0
Marceloblau01 
Fragesteller
 03.02.2016, 15:33

@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

0
Iamiam  03.02.2016, 19:01
@Marceloblau01

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

0