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