Anzeige
Archiv - Navigation
1364to1368
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

Zeller per Zufall auswählen

Zeller per Zufall auswählen
20.06.2014 20:29:08
Ingo Siemon

Hallo
Ich habe eine Excel-Tabelle.
Ich möchte mir gerne ein Makro einrichten, um zufällig eine Zelle in Spalte B auszuwählen.
Wenn ich das Makro starte, soll also einfach nur der Cursor per Zufall in eine Zelle in Spalte B springen.
Also so, als wenn ich mit der Maus in eine Zelle klicke.
Ich weis leider nicht, ob meine Formulierung mit dem Cursor fachlich richtig ist, aber ich hoffe, man kann verstehen, was ich meine.
Diese Zufallsauswahl soll übrigens nur aus den Zeilen getroffen werden, in denen bei Spalte B auch ein Wert steht.
Die unteren leeren Zeilen sollen also nicht berücksichtigt werden.
Ist es sehr kompliziert, das mit VBA umzusetzen?
Oder ist das relativ einfach machbar?
Könntet Ihr mir da helfen?
Ich selber bin leider kein VBA Experte, muss ich gestehen.
Gruß
Ingo

39
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zeller per Zufall auswählen
20.06.2014 20:35:41
Daniel
HI
probier mal diesen Code:
Sub Makro2()
With ActiveSheet.UsedRange.Columns(2)
.Cells(WorksheetFunction.RandBetween(1, .Rows.Count), 1).Select
End With
End Sub
Gruß Daniel

AW: Zeller per Zufall auswählen
20.06.2014 20:49:37
Ingo Siemon
Hallo Daniel
Danke erstmal für Deine schnelle Hilfe.
Ich habe Deinen Code gerade ausprobiert.
Aber da bekomme ich eine Fehlermeldung.
Lauzeitfehler '438':
Objekt unterstützt diese Eigenschaft oder Methode nicht.
Gruß
Ingo

RandBetween erst ab Xl12 als WorksheetFunction!
20.06.2014 21:17:54
Luc:-?
Verwende stattdessen .Rand, Ingo,
und rechne das Ergebnis auf das benötigte Intervall um!
Gruß Luc :-?

Anzeige
AW: RandBetween erst ab Xl12 als WorksheetFunction!
20.06.2014 22:54:42
Ingo Siemon
Hallo Luc
Von VBA verstehe ich leider wirklich nicht besonders viel.
Darum sagt mir das von Dir empfohlene leider nichts.
Gruß
Ingo

Na, das ist die normale xlFkt ZUFALLSZAHL, ...
22.06.2014 02:36:35
Luc:-?
…Ingo;
allerdings hatte ich nicht überprüft, ob die auch als WorksheetFunction implementiert ist, da es ja die analoge vbFkt Rnd gibt, die dir dann ja zuerst von Daniel als Alternative vorgeschlagen wurde, wenn auch ohne das erforderliche Randomize. Da konnte man dann auch sehen, was mit Umrechnen gemeint war, denn solche Fktt liefern normalerweise eine Dezimalzahl zwischen 0 und 1.
Aber in Xl bist du doch gut! Da solltest du auch die Zufallszahl-Fktt kennen und wissen, was damit zu tun ist!
Weiteres dann unten.
Luc :-?

Anzeige
Evtl reicht aber auch das Setzen eines ...
20.06.2014 21:32:20
Luc:-?
…Verweises von deinem VBA-Projekt auf das AnalyseTools-AddIn (falls es vorhanden ist), Ingo,
und Weglassen von WorksheetFunction. vor RandBetween, was ich zZ allerdings nicht überprüfen kann (bei meinen spez AddIns reicht das).
Eine andere Alternative wäre das Verwenden von Evaluate mit einem entsprd FmlText. Dann muss das o.g. AddIn aber in Xl aktiviert sein.
Luc :-?

AW: Evtl reicht aber auch das Setzen eines ...
20.06.2014 22:56:04
Ingo Siemon
Hallo Luc
Danke Dir für Deine Mühe.
Aber man beachte: "Level: VBA bescheiden".
Mir sagt das leider nichts, was Du mir da vorschlägst.
Gruß
Ingo

So, dann mal an die Grundlagen, ...
22.06.2014 02:59:19
Luc:-?
…Ingo…
Dein VBA-Level schützt nicht vor VBA-/VBE-Grundkenntnis-Erwerbung und -Erwartung! ;->
Wer mit VBA arbeiten will, sollte sich frühzeitig mit dem VBEditor und seiner Hilfe befassen! Man kann ja auch kein Buch in einer bestimmten Sprache schreiben, ohne wenigstens nicht allzu komplexe Sätze zustande zu bringen, falls es nicht gerade Belletristik sein soll. Und VBA ist auch eine Sprache, sogar für Menschen (PgmEntwickler), nicht für den PC — der braucht dafür auch noch einen Dolmetscher. ;-)
Im VBE-Kopf gibt's einen DropDown-Button, der Extras heißt. Im DropDown ist dann ein Befehl Verweise zu finden. In der dazugehörigen Liste ist schon einiges standardmäßig angehakt, weiteres steht zur Auswahl. Da müsstest du dann nach dem Eintrag suchen, der im Begleittext so etwas wie AnalyseTools enthält.
In Xl reicht hierfür die Aktivierung des gleichen Tools durch Auswahl, denn das wird bis Xl11 (Xl2003) standardmäßig mitgeliefert. Ab Xl12 (Xl2007) sind die zugehörigen PgmBibliotheken (.dll) direkt in Xl integriert, deren Fktt stehen ab dem also immer zV.
Evaluate ist eine vbMethode/Fkt, mit der man FmlTexte in originaler (also US-)Schreibweise auswerten kann. So ein FmlText kann dann alle Fktt enthalten, die du auch im TabBlatt verwenden kannst. Sie entspricht also der XLM-Fkt (aus Xl4!) AUSWERTEN, die nur in benannten Formeln (also unter NamensDefinition) eingesetzt wdn kann. Allerdings versteht die XLM-Fkt auch deutsche FmlTexte!
Gruß + schöSo, Luc :-?

Anzeige
AW: So, dann mal an die Grundlagen, ...
22.06.2014 07:43:33
Ingo Siemon
Hallo Luc
Ja ich verstehe natürlich schon was Du meinst bezüglich dem Erwerb der Grundkenntnisse usw.
Und ich stimme Dir da natürlich auch zu.
Nur ist es bei mir eher so, dass ich ja nicht vorhabe, zu einem Experten von VBA zu werden.
Sondern ich habe eher nur ein kleines Anliegen (das mit der Zufallsauswahl).
Und da ist mir der Kosten-Nutzen-Faktor zu klein, wenn ich mich jetzt tief in VBA einarbeiten muss.
Wie gesagt, dass ist überhaupt nicht böse von mir gemeint!
Und ich kann auch gut verstehen, wenn der Wunsch nach fertigen Lösungen hier als frech empfunden wird.
Ich hatte bei meinem Ursprungs-Posting ja angegeben "Excel gut - VBA bescheiden".
Vielleicht hätte ja besser gepasst "kaum Excel/VBA Kenntnisse".
Ist denn die Lösung vom Matthias jetzt gut oder eher doch nicht?

Option Explicit
Sub Ingo_Siemon()
Randomize
With ActiveSheet.UsedRange.Columns(2)
Do
Cells((Rnd * .Rows.Count) + 1, 2).Select
Loop While Selection.Value = ""
End With
End Sub
Ich bin eben leider nicht in der Lage zu erkennen, was der Code genau macht.
Darum kann leider auch nicht beurteilen, ob der Code mein Anliegen erfüllt oder nicht.
Hoffentlich bist Du jetzt nicht sauer auf mich.
Vielleicht hast Du Lust, mir da dennoch mal einfach und schnell zu helfen?
Gruß
Ingo

Anzeige
Sagen wir so, ...
22.06.2014 19:29:24
Luc:-?
…Ingo,
da fehlt noch eine Kleinigkeit. Ich würde das so machen:
Sub ZufallsAuswahl()
Dim n As Long, x As Range
Randomize
Set x = ActiveSheet.UsedRange.Columns(3)
Do: n = Rnd * (x.Rows.Count - 1) + 1
Loop While x.Cells(n) = ""
x.Cells(n).Select
Set x = Nothing
End Sub
Gruß, Luc :-?

AW: Sagen wir so, ...
22.06.2014 19:44:39
Daniel
der Code ist gut, wenn in Spalte B alle bzw sehr viele Zellen einen Wert haben.
wenn in Spalte B jedoch viele Zellen leer sind, dann ist diese Variante ungünstig, weil dann die Wahrscheinlichkeit hoch ist, dass die Zufallsauswahl eine leere Zelle trifft und dann wiederholt werden muss.
Gruß Daniel

Anzeige
Wenn sich das bemerkbar machen soll, ...
22.06.2014 21:02:42
Luc:-?
…Daniel,
muss die Spalte wohl mehrere 100Tsd Zellen/Zeilen haben, denn eines kann eine CPU anhand eines Pgms immer am Besten und Schnellsten → Rechnen! Alle anderen Aufgaben erfordern etwas mehr Berechnung und damit Zeit… ;-)
Gruß Luc :-?

AW: Zeller per Zufall auswählen
20.06.2014 21:40:09
Daniel
Ups sorry, hab nicht auf deine Excelversion geachtet.
RandBetween gibts erst seit 2007.
für 2003 und davor so:
Sub Makro2()
With ActiveSheet.UsedRange.Columns(2)
.Cells(Rnd() * .Rows.Count, 1).Select
End With
End Sub
gruß Daniel

AW: Zeller per Zufall auswählen
20.06.2014 21:48:09
Matthias L
Hallo Daniel
Diese Zufallsauswahl soll übrigens nur aus den Zeilen getroffen werden, in denen bei Spalte B auch ein Wert steht.
Das trifft in Deinem BspCode aber nicht zu.
Gruß Matthias

Anzeige
...Und außerdem liefert sein Pgm stets dieselbe...
20.06.2014 22:29:56
Luc:-?
…Zeilenfolge, Matti,
und außerdem noch 0 (!) → bei mir nämlich 5;12;0;11;8;9;4;5;12;0;11;…!
Ein anfängerhafter Fehler, Randomize am PgmAnfang zu vergessen! :->
Gruß + schöWE dir, Luc :-?

AW: Zeller per Zufall auswählen
20.06.2014 22:25:36
Ingo Siemon
Hallo Daniel
Ah ja super.
Das funktioniert schon mal gut soweit.
Auch mit meiner uralten Excel XP Version :-)
Lässt es sich denn noch irgendwie machen, dass bei der Zufallsauswahl nur die Zeilen berücksichtigt werden, in denen ein Wert in Spalte B steht?
Also ich meine, dass nur der obere Teil der Tabelle berücksichtigt wird, bis zur letzten Zeile, in der Spalte B noch einen Wert beinhaltet.
Gruß
Ingo

Anzeige
AW: Zeller per Zufall auswählen
20.06.2014 22:30:52
Daniel
ich kenn jetzt deine Tabelle nicht.
wenn die Anzahl der bentutzen Zeilen fix, ist, dann kannst du auch anstelle dem .Rows.count dort die grösste mögliche Zeilennummer als Wert eintragen.
wenns noch leere Zellen zwischen drin gibt, dann müsstest du die Aktion per DO-Schleife solange wiederholen, biss eine Zelle mit Inhalt getroffen wird.
Sub Makro2()
With ActiveSheet.UsedRange.Columns(2)
do
.Cells(Rnd() * .Rows.Count, 1).Select
Loop while selection.Value = ""
End With
End Sub
Gruß, Daniel

Immer noch k.Randomize u.mit mögl 0! :-> oK!
20.06.2014 22:39:06
Luc:-?
:-?

AW: Immer noch k.Randomize u.mit mögl 0! :-> oK!
20.06.2014 22:43:18
Daniel
ok, ich bin zu doof und raus.

Anzeige
AW: Zeller per Zufall auswählen
20.06.2014 22:53:34
Ingo Siemon
Meine Tabelle ist folgendeermaßen:
* Die Zeilenzahl ist nicht fix, sondern verändert sich immer wieder mal.
* Es gibt keine Leerzeilen zwischendurch.
* Es fängt einfach oben an, dass die Zeilen gefüllt sind und hört dann eben irgendwann auf.

AW: Zeller per Zufall auswählen
20.06.2014 22:55:46
Daniel
HI
Luc! wird dir nach bestem Wissen und Gewissen weiterhelfen, wende dich bitte vertrauensvoll an ihn.
Gruß Daniel

AW: Zeller per Zufall auswählen
20.06.2014 22:57:55
Ingo Siemon
Hallo Daniel
OK, mal gucken.
Leider ist das alles viel zu hoch für mich, was mir der Luc da schreibt :-)
Aber ich danke Dir natürlich trotzdem sehr für Deine Hilfe.
Gruß
Ingo

AW: Zeller per Zufall auswählen
20.06.2014 23:02:32
Daniel
dann frag ihn doch, ober nicht einfach mal den entsprechenden Code hier zeigen kann.
Gruß Daniel

Anzeige
AW: Zeller per Zufall auswählen
20.06.2014 23:05:11
Ingo Siemon
Hallo Daniel
Jo, hatte ich auch schon überlegt.
Aber es ist ja immer ein bisschen frech, einfach nach fertigen Code zu fragen.
Das wird ja oft nicht gerne gesehen.
Dachte ich jedenfalls.
Gruß
Ingo

AW: Zeller per Zufall auswählen
20.06.2014 23:48:53
Daniel
wenn du die erklärungen von Luc nicht verstehst, dann kannst du natürlich nochmal nachfragen und ihn bitten, seinen Erläuterungen ein Codebeispiel beizufügen.
Gruß Daniel

so geht richtig ...
21.06.2014 08:39:18
Matthias L
Hallo
hier mal mit Daniels Ansatz
Option Explicit
Sub Ingo_Siemon()
Randomize
With ActiveSheet.UsedRange.Columns(2)
Do
Cells((Rnd * .Rows.Count) + 1, 2).Select
Loop While Selection.Value = ""
End With
End Sub
Gruß Matthias

AW: so geht richtig ...
21.06.2014 08:53:55
Ingo Siemon
Hallo Matthias
Oh ja vielen Dank.
Scheint ja gut zu funktionieren.
Gruß
Ingo

Ja, genau, Matti, hätte das auch so gemacht! ;-)
21.06.2014 18:49:41
Luc:-?
(Außer den ProzNamen natürlich! ;-])
Gruß + schöWE, Luc :-?

AW: na Luc! dann lies
21.06.2014 19:00:37
Daniel
mal deinen ersten Beitrag zu diesem Tread, da steht drin, wie du es gemacht hättest.
Gruß Daniel

An mich gerichtete BT, die m. 'Na ...' beginnen,..
22.06.2014 03:28:01
Luc:-?
…lese ich nur ausnahmsweise und antworte meist gar nicht oder später! Falls du mit dem slowboardenden Daniel aus dem OL-Forum identisch sein solltest, hättest du es ja schon mal auf eine BlackList geschafft. So etwas führe ich aber im Ggsatz zu manchem/r Anderen nicht! Noch kann ich mir gewisse Leute so merken… :->
In meinem 1.BT steht nicht wie ich es gemacht hätte! Er war nur ein, wenn vermutlich aber untauglicher, schneller KorrekturVersuch deines BTs! In der Zwischenzeit hatte ich darüber nachgedacht (obwohl ich zur gleichen Zeit nebenbei eine recht komplexe UDF pgmiert habe und mit einer weitaus komplexeren beschäftigt bin) und war zum gleichen Schluss wie Matti gekommen → um mit einer Do…Loop-Schleife auskommen zu können (2 ließen sich kaum koordinieren, da es sich um verschiedenartige Prozesse handelt!), muss zwingend 1 addiert wdn, um 0 (durch Rundung) als MinWert zu vermeiden, woran du offensichtl nicht gedacht hast. Der MaxWert sollte dann ggf auf die tatsächliche ZeilenAnzahl begrenzt wdn.
Übrigens, wenn man in der VBE-Hilfe zur vbFkt Rnd nachliest, stößt man zwangsläufig auch auf Randomize und die Erklärung der Notwendigkeit dieser „ZufallsInitialisierung“ … :->
Gr, Luc :-?

Korrigiere mich: Schleife natürlich ohne ...
22.06.2014 18:39:35
Luc:-?
.Select und dafür eine Variable bilden, Matti;
Zelle erst nach Verlassen der Schleife selectieren! :-|
Gruß Luc :-?

AW: Zeller per Zufall auswählen
22.06.2014 12:20:41
Daniel
noch mal ne andere Methode eine zufällige Zelle mit Inhalt auszuwählen.
hier werden gleich nur die Zellen mit Inhalt berücksichtigt, so dass die Schleife bis eine Zelle mit Inhalt zufällig getroffen wurde entfallen kann:
Sub ZufälligeZelle()
Dim Zeile As Long
With ActiveSheet.UsedRange
With .Columns(.Columns.Count + 1)
.FormulaR1C1 = "=IF(RC2="""",0,RAND())"
Zeile = WorksheetFunction.Match(WorksheetFunction.Max(.Cells), .Cells, 0)
.ClearContents
End With
.Cells(Zeile, 2).Select
End With
End Sub

Gruß Daniel

AW: Zeller per Zufall auswählen
22.06.2014 13:58:23
Ingo Siemon
Hallo Daniel
Oh ja prima.
Kannst Du mir bitte sagen, an welcher Stelle in dem Code die Spalte B "angesprochen" wird?
Gruß
Ingo

AW: Zeller per Zufall auswählen
22.06.2014 14:45:07
Daniel
Hi
.FormulaR1C1 = "=IF(RC2="""",0,RAND())"
.Cells(Zeile, 2).Select
Gruß Daniel

In der in der FolgeSpalte des UsedRange ...
22.06.2014 14:46:59
Luc:-?
…vorübergehend eingetragenen Fml, Ingo,
die anschließend wieder gelöscht wird, wodurch sich allerdings der UsedRange um eine Spalte erweitert, weil nur der Inhalt gelöscht wird, was aber nicht weiter schlimm sein muss.
Da es sich bei der Fml um eine R1C1-Fml (Fml in Z1S1-AdressSchreibweise) handelt, würde die jeweilige Zelle/Zeile der Spalte B mit RC2 identifiziert wdn, auf deutsch ZS2 → jeweilige Zeile in Spalte 2 (⇒$B).
Ähnliches kann man aber auch ohne Fml-Eintrag erreichen. Außerdem dürfte Matthias' Variante schnell genug sein (dazu oben).
Gruß Luc :-?

AW: In der in der FolgeSpalte des UsedRange ...
22.06.2014 15:03:49
Daniel
wie schnell Ingos variante ist, hängt davon hab wie viele Zellen in Spalte B einen Wert haben und wieviele leer sind aber trotzdem zum genutzen Bereich gehören.
Wenn von 100 Zellen nur noch 2 einen Wert haben, kann es schon etwas daueren, bis eine dieser Zellen zufällig getroffen wird und in der Zeit siehst du den Cursor übers Blatt flitzen.
Muss ja nicht sein.
Gruß Daniel

Das kann, aber muss nicht sein, ...
22.06.2014 18:42:38
Luc:-?
…Daniel,
Matti hätte doch noch mehr an deinem Code ändern* sollen, so wie zuvor auch ich es hätte tun sollen*!
*s.oben!
Gruß Luc :-?

AW: Das kann, aber muss nicht sein, ...
22.06.2014 18:57:16
Daniel
klar Luc!
du hast viele Möglichkeiten das Problem zu lösen.
Du kannst auch erst alle Zeilennummern von Zellen mit Inhalt in ein Array lesen und dann von diesen eines zufällig auswählen, geht alles.
ist halt von der Programmierung her etwas aufwendiger.
Aber du darfst gerne selbst mal mit einem Codebeispiel an den Start gehen.
Gruß Daniel

Dir ist doch klar, dass das ein Klacks ist, ...
22.06.2014 19:45:09
Luc:-?
…Daniel,
verglichen mit dem, was du hier und anderswo schon von mir lesen k⁽ö⁾nntest…
Normalerweise ignoriere ich derartige Aufforderungen, denn an einem „Wettstreit der PgmCodes“ bin ich nicht interessiert, nur richtig müssen sie halt sein! Aber da Ingo eine dementsprd Frage gestellt hatte, habe ich ihm diese nun auch beantwortet.
Luc :-?

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige