Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
804to808
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
804to808
804to808
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Zufallszbereich

Zufallszbereich
29.09.2006 18:39:25
Volker
Hallo zusammen :)
ich hätte da ein Problem, welches mit VBA sicher super-einfach zu lösen ist - meine Erfahrung aber nicht ausreicht... lange Rede kurzer Sinn: hier das Problem:
Ich habe in Spalte A verschieden viele Zahlen - z.B. 119 oder 221 Stück. In Spalte B möchte ich eben diese Werte wiedergegeben vorfinden - nur in zufällig variierter Reihenfolge - Also z.B. A1 = B23, A2 = B1, A3 = B56 usw.
Wie kann ich das machen?
Danke schonmal im Voraus und allerbeste Grüsse aus Tübingen,
Volker Presser

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zufallszbereich
29.09.2006 19:32:58
ingUR
Hallo, Volker,
ich gehe davon aus, dass Du jedes Element in einer Zelle der Spalte A auch nur sooft in der Spalte B vorfinden willst, wie es in der Spalte A vorhanden ist, denn ansonsten wäre auch eine Zellenformel einfach möglich.
Nachfolgende Prozedur ist ein ein Standardmofulordner des Projektes zu kopieren.
Sub ZufallsOrdnung()
Dim idx As Long, index() As Long, maxIdx As Long
Dim rng As Range
Randomize
'ermittle letzte gefüllte Zeile in der Spalte A
maxIdx = Cells(Rows.Count, 1).End(xlUp).Row
'dimensioniere Indexvektor der Zeilen
ReDim index(maxIdx)
'Schleife über alle Elemente der Spalte A
For Each rng In Range("A1:A" & maxIdx)
Do
Do
'liefere eine Zufallszahl zwischen 1 und maxIdx+1
idx = Rnd() * maxIdx + 1
Loop Until idx <= maxIdx
'ist die Zelle in Spalte B frei?
If index(idx) = 0 Then
'ja, dann markiere Zeile als nunmehr gefüllt
index(idx) = 1
'Schreibe  aktuellen Zellenwert der Spalte A
'in Zelle der Spalte B mit der Zufallszeilennummer idx
Cells(idx, 2) = rng.Value
'liefere Erkennung, das Zellenwert geschrieben wurde
idx = -1
End If
'Schleifendurchgang bis idx<0 ist!
Loop Until idx < 0
'nächste Zeile in Spalte A behandeln
Next
End Sub

Gruß,
Uwe
Anzeige
AW: Zufallszbereich
29.09.2006 22:33:38
Volker
Hi Uwe,
herzlichen Dank für die Antwort! Eine Zusatzfrage hätte ich noch... wenn ich in den nächsten Spalten (C, D, etc.) auch noch weitere Variationen der Daen von Spalte A haben möchte - wie müsste ich dann den Quelltext modifizieren?
Nochmals danke :)
Volker
AW: Zufallszbereich
30.09.2006 21:35:31
ingUR
Nicht nur eine Frage habe ich erwartet, Volker,
nein, trotzz meiner Kommentarzeilen hane ich so einige Ergänzungsfragen erwartet, die ich gerne versuchen würde, zu beantworten.
Doch, ohne Umschweife, ich hatte gehofft, die Fragen würden eingeleitet mit: "Das mit den Cells(Zeile, Spalte) habe ich verstanden, doch ..." oder "Den Anweisungsblock For Each rng .... next konnte ich nachvollziehen, und ich habe versucht ...".
Es stellt sich also mir die Frage, ob Du Dich mit VBA beschäftigen möchtest oder nur fertige Lösungen erfragen willst.
Ich gehe einmal davon aus, dass Du VBA soweit verstehen möchtest, dass Du in naher Zukunft in der Lage sein wirst, derartige Ändereungen und Erweiterungen, wie Du sie heute erfragst, selber vornehmen kannst.
Daher hier ein Versuch von mir eine Hilfe zur Selbsthilfe, wobei der Umgang mit dem VBA-Editor, insbesondere der Umgang mit der Online-Hilfe (F1), vorrangig selbst vertieft werden sollte.
    For Each rng In Range("A1:A" & maxIdx)
Next

Dies sind also im Programm sie Eröffnung und Schlußzeile des Blocks, der dafür zuständig ist dass jeder Zelleninhalt der Spalte A, in den Zeilen von 1 bis maxIdx, in eine Zelle der Spalte B übertragen wird.
Diese Übertagung erfolgt durch den Zuweisungsbefehl Cells(idx, 2) = rng.Value. die Variable rng ist dabei das Zekkenobjekt der Spalte A, das durch den ajtuallen Schleifendurchlauf bestimmt ist - For Each rng in Range("A1:A" & maxIdx).
Der Inhalt (Wert) aus der Zelle rng, wird in das Objekt Cells(idx, 2) übertragen, wobei idx die durch Zufallsgenerator bestimmte Zeilennummer entspricht und die Zigffer 2 die zweite Spalte anspricht (markiere Cells und rufe über F1 die Hilfe auf).
   For Each rng In Range("A1:A" & maxIdx)
<b>Cells(idx, 2)</b>
Next

Um also nun weitere Spalten mit den Werten der Spalte A in zufälliger Ordnung zu füllen, müßte der gleiche Schleifendurchlauf für jede neu zu füllende Spalte erneut ausgeführt werden (setze den Curor auf das Wort For und rufe über F1 die Hilfe zur "For ... Next-Anweisung auf).
Diese For-Schleife soll also dafür zuständig sein, dass die Zuweisungsanweisung sich auf die Spalten 2 (=B), 3 (=C), ... beziehen wird.
   For c = 2 to 5
For Each rng In Range("A1:A" & maxIdx)
Cells(idx, c)
Next
next c

Doch hier ist vor einem zweiten Schleifendurchlauf nioch eine Vorarbeit zu leisten. Zur Erinnerung: In der "Liste" index haben wir die Zeilennummern mit dem Wert 1 "markiert", die bereits übertragen wurde. Am Ende eines Schleifendurchlaufes enthält diese Liste natürlich in allen Feldern - index(1 ... maxIdx) - eine Eins.
Also muß vor jedem neuen Schleifenblock jedes dieser Indexfelder wieder auf Null gesetzt werden. Auch diese Aufgabe wird durch eine For-Schleife ausgeführt.
For idx = 1 to maxIdx
index(idx) = 0
next idx

Diesen Block an die betreffende Stelle eingefügt sichert, das auch eine zweite und dritte Spalte gefüllt wird.
Eine Organisatorische Besonderheit ist noch zu berücksichtigen: Durch die Direktive Option Explicit wird bestimmt, dass jede Variable durch eine Dim-Anweisung besonders zu deklarieren ist. Da die Variable c neu hinzugekommen ist, ist eine Dim-Aweisung hinzuzufügen:
Dim c as Integer
Die Variable c ist also vom Typ Ganzzahl (Integer), die eine Werte zwischen -32768 und +32767 annehmen kann (siehe Online-Hilfe, Mauszeiger auf Integer, F1 und von dort auf Verweis: "siege auch", Thema: Datentyp (Zusammenfassung)).
So, nun wünsche ich Erfolg beim Umsetzen, denn wenn dieser eintritt, wird die Länge der Anwort vielleicht doch ais angenemer emnpfunden werden, als die blße Vorstellung des erweiterten Programmcodes. Auf jeden Fall soll die Länge der Antwort vor weiteren Anworten abschrecken, nur anregen, eigene Versuche zu starten.
Gruß,
Uwe
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige