Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1852to1856
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
Inhaltsverzeichnis

Zufall mit Bedingung

Zufall mit Bedingung
04.11.2021 14:28:56
Ingo
Hallo
Ich habe hier den Code für ein Markro. Das Makro wählt mir aus meiner Excel Tabelle zufällig eine Zeile aus. Eine Bedingung ist, dass in der Zelle der Spalte 19 ein Wert enthalten ist. Es sollen also nur eine Zeile per Zufall ausgewählt werden, in dessen Spalte 19 sich ein Wert befindet.
Nun würde ich gerne noch eine weitere Bedingung per UND hinzufügen. Und zwar soll sich in Spalte 27 kein Wert befinden.
Wenn ich das Marko auslöse soll mir also per Zufalle eine Zeile "ausgesucht" werden, die
* in Spalte 19 einen Wert hat
UND
* in Spalte 27 keinen Wert hat
Da ich das leider selber nicht lösen kann, weil ich dafür von VBA zu wenig verstehe, wollte ich Euch um Hilfe bitten.
Gruß
Ingo

Sub Zufall()
Dim ar As Long
Dim c As Long
With ActiveSheet.Columns(19).SpecialCells(xlCellTypeConstants)
ar = WorksheetFunction.RandBetween(1, .Areas.Count)
c = WorksheetFunction.RandBetween(1, .Areas(ar).Cells.Count)
.Areas(ar).Cells(c).Select
End With
End Sub

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zufall mit Bedingung
04.11.2021 14:52:14
{Boris}
Hi,
das kann man quick and dirty z.B. so lösen. 100 steht für die maximale Anzahl der benutzten Zeilen - das musst Du auf Deinen Bedarf anpassen.

Sub zufalltest()
Dim x As Long
Randomize Timer
Do
x = Int((100 * Rnd) + 1)
Loop Until Cells(x, 19)  "" And Cells(x, 27) = ""
Rows(x).Select
End Sub
VG, Boris
AW: Zufall mit Bedingung
04.11.2021 15:26:53
Daniel
HI
nutze doch Worksheetfunction.RandBetween. Das gibt gleich Ganzzahlen aus und braucht kein Randomize.
Die Anzahl der Zeillen lässt man sich automatisch bestimmen:
also:

x = Worksheetfunction.RandBetween(1, ActiveSheet.Cells.SpecialCells(xlcelltypelastcell).Row
wenn man hier statt dem Do ein For_Next verwendet, kann man auch gleich eine Sicherheit gegen die Endlosschleife einbauen, die hier passieren kann wenn es keine passende Zeile gibt:

Sub zufalltest()
Dim x As Long
Dim i as long
const MaxDurchläufe as long  = 10000
For i = 1 to MaxDurchläufe
x = Worksheetfunction.RandBetween(1, Cells.SpecialCells(xlcelltypelastcell).Row)
if  Cells(x, 19)  "" And Cells(x, 27) = "" then Exit For
Next
If 1 > MaxDurchläufe then
Msgbox "Abbruch, keine passende Zelle gefunden"
Else
Rows(x).Select
End if
End Sub
Gruß Daniel
Anzeige
Mir musst Du das nicht erklären...
04.11.2021 15:33:14
{Boris}
Hi Daniel,
...ich war etwas schreibfaul - daher auch "quick and dirty" - es ging mir nur um das mögliche Prinzip - und der Code läuft ja - und auch mit gleicher Eintrittswahrscheinlichkeit.
Einen Ausstiegszähler einzubauen, ist natürlich dann sinnvoll, wenn es definitiv vorkommen kann, dass kein Treffer existiert.
VG, Boris
AW: Mir musst Du das nicht erklären...
04.11.2021 16:53:09
Daniel
es baut aber auf deinem Code auf.
und du hast es nicht drin gehabt.
also ist da mein Beitrag schon richtig platziert.
und WorksheetFunction.RandBetween spart dann doch aufwand, also das nicht zu verwenden hat mit Schreibfaulheit nichts zu tun.
Gruß Daniel
Anzeige
AW: Zufall mit Bedingung
04.11.2021 15:04:54
Daniel
Hi
probiers mal so:

Sub Zufall()
Dim ar As Long
Dim c As Long
With Intersect(ActiveSheet.Columns(19).SpecialCells(xlCellTypeConstants), ActiveSheet.Columns(27).SpecialCells(xlcelltypeblanks).EntireRow)
ar = WorksheetFunction.RandBetween(1, .Areas.Count)
c = WorksheetFunction.RandBetween(1, .Areas(ar).Cells.Count)
.Areas(ar).Cells(c).Select
End With
End Sub
allerdings musst du dir mit dieser zweistufigen Auswahl (erst die Area bestimmen, dann die Einzelzelle) darüber im klaren sein, dass einzelstehende Zellen hierbei eine größere Chance haben ausgewählt zu werden, als Zellen die sich in einer größeren Area (lückenloser Zellblock) befinden.
Kleines Extrembeispiel: die Zellen für die die Bedingung zutrifft, sind die Zellen 1 und die Zellen 3-102 (also 2 nicht)
dh du hast zwei Areas, 1 und 3-102.
Das Zeile 1 ausgewählt wird, hat eine Wahrscheinlichkeit von 50%, dass eine der hundert anderen Zeilen ausgewählt wird, nur eine Wahrscheinlichkeit von 0,5%.
Wenn du ein Verfahren willst, bei dem alle Zellen die gleiche Chance haben, brauchst du was anderes.
Gruß Daniel
Gruß Daniel
Anzeige
AW: Zufall mit Bedingung
04.11.2021 15:19:01
Ingo
Hallo Daniel
Ah ja, das mit den verschiedenen Chancen ist ein interessanter Gedanke.
Wie ist das denn bei der Lösung, die der {Boris} hier kurz vor Dir gepostet hat? Haben denn da alle Zellen die gleiche Chance?
Gruß
Ingo
AW: Zufall mit Bedingung
04.11.2021 15:18:30
Daniel
Hi
noch ne Lösungsvariante, die alle Zellen gleichberechtigt:

dim rng as range
die Zelle as range
dim Zufall as long
dim x as long
set rng = Intersect(Columns(19).SpecialCells(xlcelltypeconstants), Columns(27).SpecialCells(xlcelltypeblanks).EntireRow)
Zufall = Worksheetfunction.RandBetween(1, rng.Cells.Count)
x = 0
For Each Zelle in rng
x = x + 1
if x = Zufall then Exit For
Next
Zelle.Select
funktioniert aber nur, wenn es in Spalte 19 gefüllte und in Spalte 27 leere Zellen gibt
Gruß Daniel
Anzeige
Danke Euch für die Hilfe
04.11.2021 17:51:41
Ingo
Ich danke Euch für die Hilfe.

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige