235 Aufrufe
Gefragt in Tabellenkalkulation von robbi58 Mitglied (147 Punkte)

Ich möchte ein Blatt mit fortlaufenden Rechnungen erstellen. Dazu habe ich in Spalte A Zufallsbereiche generiert

=ZUFALLSBEREICH(1;100) .

Diese übertrage ich in die blauen Felder mit einer Formel ( = A1, ... ). So weit so gut. In die grüne Spalte kommen die Ergebnisse der "Kopfrechnung". Mitunter passiert es jedoch, dass mit dem Klick auf eine grüne Zelle die Zufallszahlen erneut generiert werden, was die vorherigen Eingaben in den Ergebnisfeldern nutzlos macht. Wie kann ich dies verhindern. Oder gibt es eine Möglichkeit, die Zufallszahlen per CommandButton etc. zu generieren? Danke Robert M.

28 Antworten

+1 Punkt
Beantwortet von m-o Profi (11.5k Punkte)

Hallo Robert,

natürlich kannst du versuchen mit WENN-Abfragen jede mögliche Kombination deiner Formeln zu erstellen. Statt WENN-Abfragen biete ich dir eine FUNCTION (benutzerdefinierte Formel) an:

Public Function FORMELERGEBNIS(ByVal rngBereich As Range) As Double

Dim rngZelle As Range
Dim strFormel As String

'Zellen im Bereich einlesen und Formel zusammenstellen
For Each rngZelle In rngBereich
 'allerdings nur, wenn Zellen im Bereich nicht leer sind
 If rngZelle.Value <> "" Then strFormel = strFormel & rngZelle.Value
Next rngZelle

'nun noch x durch * und : durch / ersetzen
strFormel = Replace(strFormel, "x", "*")
strFormel = Replace(strFormel, ":", "/")
'Falls Formel leer ist, dann Function verlassen
If strFormel = "" Then Exit Function
FORMELERGEBNIS = Evaluate(strFormel)

End Function

Diese Function kopierst du einfach in Standard-Modul deiner Tabelle. Dann schreibst du in deine Zelle S2 die folgende Formel:

=formelergebnis(G2:Q2)

Das war es auch schon.

Mit der Funktion wird aus allen Zellen im Bereich G2 und Q2 - soweit sie nicht leer sind - eine Formel erstellt und das Ergebnis berechnet. Gibst du dort Buchstaben oder andere Zeichen ein, die nicht als Rechenzeichen erkannt werden, wird ein Fehler angezeigt. Die Eingabe von x für multiplizieren und : für dividieren wird in der Funktion abgefangen und die Zeichen entsprechend umgewandelt.

Gruß

M.O.

0 Punkte
Beantwortet von robbi58 Mitglied (147 Punkte)
Hallo M. O.

Ich habe das Makro zur Formelberechnung eingegeben und die auch deine Anweisung zur Eingabe in S2 befolgt.

Und es hat funktioniert, wie immer.
Einfach toll deine Tipps.

Danke Robert
0 Punkte
Beantwortet von robbi58 Mitglied (147 Punkte)

Noch eine letzte Frage!

Ich generiere mit dem Code 

...

 Randomize

 Cells(lngZeile, 1) = Int((Obergrenze - Untergrenze + 1) * Rnd + Untergrenze)

Next lngZeile

eine Ganzzahl.

Was muss ich ändern, um eine Dezimalzahl zu erzeugen?

Danke Robert

+1 Punkt
Beantwortet von m-o Profi (11.5k Punkte)

Hallo Robert,

durch das INT werden ganze Zahlen erzeugt.

Wenn du den Code wie folgt änderst bekommst du Kommazahlen mit 2 Nachkommastellen:

Sub Kommazahlen()
Dim Untergrenze As Long
Dim Obergrenze As Long
Dim lngZeile As Long

Untergrenze = 1
Obergrenze = 100

For lngZeile = 4 To 9
 Randomize
 Cells(lngZeile, 1) = WorksheetFunction.Round((Obergrenze - Untergrenze + 1) * Rnd + Untergrenze, 2)
Next lngZeile

End Sub

Die Anzahl der Nachkommastellen wird durch die Zahl nach der Untergrenze festgelegt. Willst du 4 Nachkommastellen, musst du die Zeile wie folgt ändern:

 Cells(lngZeile, 1) = WorksheetFunction.Round((Obergrenze - Untergrenze + 1) * Rnd + Untergrenze, 4)
Gruß
M.O.
0 Punkte
Beantwortet von robbi58 Mitglied (147 Punkte)
Danke vielmals!

Jetzt habe ich viele Werkzeuge zur Hand, um meine Übungseinheiten mit Selbstkontrollen für meine Schülerinnen (sie arbeiten alle mit dem IPadPro) zu kreieren.

Leider existieren im Web nur wenige Beispiele (oder aber ich habe nicht intensiv genug danach gesucht) bzw. entsprechen sie nicht meinen Bedürfnissen, weshalb ich auf die Idee gekommen bin, es mal selbst zu probieren. Aber ohne Hilfe hier im Forum wäre dies nicht möglich gewesen.

Danke.
0 Punkte
Beantwortet von robbi58 Mitglied (147 Punkte)

Ich bin gerade dabei, ein Vorlagenblatt zu erstellen, in der ich die unterschiedlichsten Zahlentypen generiere (Ganze Zahlen, nur Zehner-, Hunderter-- und Tausenderzahlen, Dezimalzahlen) usw.

Jetzt habe ich versucht, die schon hier gepostete Lösung zur Generierung von Rechenoperatoren auf eine Spalte zu beschränken.

  Select Case Int((Obergrenze - Untergrenze + 1) * Rnd + Untergrenze)

    Case Is = 1

      strOperator = "+"

    Case Is = 2

      strOperator = "-"

    Case Is = 3

      strOperator = "*"

    Case Is = 4

     strOperator = ":"

     Range("H1:H20") = strOperator

End Select

Next lngZeile

In der Ausgabe der Spalte H 1 - H20 erhalte ich jedoch nur Divisionszeichen.

Robert

+1 Punkt
Beantwortet von m-o Profi (11.5k Punkte)

Hallo Robert,

mit dem Befehl

Range("H1:H20") = strOperator

weist du dem Bereich H1 bis H20 immer den selben Operator zu. Außerdem hast den Befehl bei dem Divisionszeichen angefügt, so dass der Bereich immer mit : gefüllt wird.

Wenn du den Bereich H1 bis H20 mit verschiedenen Zeichen füllen willst, musst du das über eine Schleife lösen (siehe auch meine Codes bei den anderen Antworten):

'Zähler für die Durchläufe
For lngZeile = 1 To 20

 Select Case Int((Obergrenze - Untergrenze + 1) * Rnd + Untergrenze)

    Case Is = 1

      strOperator = "+"

    Case Is = 2

      strOperator = "-"

    Case Is = 3

      strOperator = "*"

    Case Is = 4

     strOperator = ":"

   End Select

Range("H" & lngZeile) = strOperator

Next lngZeile

Natürlich musst du das ggf. für deinen Code anpassen (ggf. neue Variable für diese Schliefe nutzen).

Falls du etwas tiefer in VBA einsteigen willst, kannst du ja z.B. mal hier schauen: https://www.vba-tutorial.de/

Gruß

M.O.

0 Punkte
Beantwortet von robbi58 Mitglied (147 Punkte)
Nun ja.

Wenn ich Formeln im Forum als Feedback erhalte, dann probiere ich immer etwas herum, um diese besser zu verstehen, bzw. zu analysieren. Und vielleicht schadet es wirklich nicht, mich etwas genauer mit den Grundlagen auseinander zu setzen.

Danke Robert
0 Punkte
Beantwortet von robbi58 Mitglied (147 Punkte)

Ich habe das ursprüngliche Beispiel etwas abgeändert und möchte mehrere Rechenoperationen mit Zufallszahlen durchführen.

Sowohl die Zahlen (in diesem Beispiel 1 bis 30) als auch die Rechenzeichen Plus und Minus (* , die Multiplikation ist fix vorgegeben)  werden mittels Makro (Start ist ein CommandButton) generiert. Ich habe das Problem bisher so gelöst, dass ich für die Felder d bzw. d und f beim untersten Beispiel höhere Zahlen generieren lassen , damit ich den negativen Bereich vermeide. Könnte man das Problem auch anders lösen. Wenn ich z. B. das unterste Beispiel noch weiter erweitern möchte (5 *11 - 4 * 18 - 3 * 2 = -23) wird es noch schwieriger. Muss ich Beziehungen zwischen den Eingabefeldern aufbauen, um den negativen Bereich zu vermieden. Hätte jemand im Forum eine Idee zur Lösung meines Problems. Danke im Voraus.

Robert

0 Punkte
Beantwortet von m-o Profi (11.5k Punkte)

Hallo Robert,

ich habe mal eine Prüfroutine für deine Formeln gebastelt. Dabei wird die erste Zahl in der Formel so lange um 1 erhöht, bis das Ergebnis größer Null ist:

Sub groesserNull()

Dim lngZeile As Long
Dim lngSpalte As Long
Dim strFormel As String
Dim arrFormel() As Variant
Dim lngZaehler As Long
Dim i As Long

'alle Zeile in Spalte Ddurchlaufen
For lngZeile = 1 To ActiveSheet.Cells(Rows.Count, 4).End(xlUp).Row
 'Prüfen, ob etwas in Spalte D steht
 If IsEmpty(Cells(lngZeile, 4)) = False Then
   'Zaehler auf Null zurücksetzen
   lngZaehler = 0
   'String für Formel leeren
   strFormel = ""
   'Schleife für das Suchen des Endes der Formel =
   Do Until Cells(lngZeile, 4 + lngZaehler).Value = "="
     lngZaehler = lngZaehler + 1
   Loop
   'letztes Zeichen = nicht mit einlsen
   lngZaehler = lngZaehler - 1
        
   'nun die Spalten einlesen
   arrFormel = Range(Cells(lngZeile, 4), Cells(lngZeile, 4 + lngZaehler))
   
   'und Formel zusammenbauen
   For i = LBound(arrFormel, 2) To UBound(arrFormel, 2)
    strFormel = strFormel & arrFormel(1, i)
   Next i
   
   'nun prüfen ob Formel größer Null
   If Evaluate(strFormel) < 1 Then
    'nun Schleife, die den ersten Wert so lange erhöht, bis das Ergebnis größer Null ist
    Do Until Evaluate(strFormel) > 0
     'ersten Wert erhöhen
     arrFormel(1, 1) = arrFormel(1, 1) + 1
     'und Formel neu zusammenbauen
      strFormel = ""
      For i = LBound(arrFormel, 2) To UBound(arrFormel, 2)
        strFormel = strFormel & arrFormel(1, i)
      Next i
    Loop
   
    'dann den neuen Wert für Spalte D in Tabelle schreiben
    Cells(lngZeile, 4) = arrFormel(1, 1)
      
   End If
     
 End If
   
Next lngZeile

End Sub

Du kannst das Makro in ein allgemeines Modul deiner Arbeitsmappe kopieren.

Am Ende des Codes, mit dem du deine Zufallszahlen generierst kannst du (vor End Sub) die folgende Zeile einfügen:

Call groesserNull

Dann wird das Makro automatisch aufgerufen.

Bei dem Makro gehe ich davon aus, dass die erste Zahl der Formel immer in Spalte D steht.

Gruß

M.O.

...