1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

Excel 2007 VBA Zufallszahl & Quersumme

Discussion in 'Office-Programme' started by MZurmuehlen, Sep 17, 2008.

Thread Status:
Not open for further replies.
  1. Hallo,
    ich hab mir selbst ne Funktion zusammen gebastelt, und zwar für eine Zufallszahl zwischen 1 und 1000 und dann für die Quersumme.
    nur leider zeigt er mir nur #WERT! an. Wieso?
    Ich gebe z.b. in A1=27 ein und in A2=Nummer(A1).
    Das sieht vielleicht ein bisschen komisch aus, ist aber richtig: ich möchte das er mir eine zahl ausspuckt zu der die quersumme passt. nur falls einer stutzt.
    Wär nett wenn ihr mir auf die Sprünge helfen könntet.
    Danke im Voraus. MfG Zurmühlen

    Code:
    Public Function Quersumme2(ByVal Zahl As Integer) As Integer
    Dim i As Integer

    For i = 1 To (Len(Zahl) + 1)
    Quersumme2 = Quersumme2 + Mid(Zahl, i, 1)
    Next

    End Function


    Public Function Nummer(ByVal Zahl As Range) As Integer

    Dim int_i As Integer
    int_i = Int(Rnd() * 1000)

    Dim i As Integer
    i = 1

    While (Quersumme2(int_i) <> Zahl)
    MsgBox ("Raum: " + int_i + " Quersumme: " + Quersumme2(int_i))
    int_i = Int(Rnd() * 1000)
    i = i + 1
    Wend
    Nummer = int_i

    End Function
     
  2. brum

    brum Kbyte

    Du kannst bei einer Funktion nicht den Namen der Funktion zum "Weiterrechnen" benutzen. Der Fehler entsteht also in der Zeile: Quersumme2 = Quersumme2 + Mid(Zahl, i, 1)

    Du musst eine neue Variable nehmen um das zu berechnen und am Schluss Quersumme2 = Variable eingeben.

    Gruss
    Bruno
     
  3. guter tipp danke aber das problem besteht leider weiterhin
     
  4. Hascheff

    Hascheff Moderator

    Hallo,
    ich musste selbst kürzlich die Erfahrung machen, dass es in Excel-VBA nicht möglich ist, im Code eine benutzerdefinierte Funktion aufzurufen. Die sind nur für den Einsatz in Excel-Formeln bestimmt.
    Du musst den Code der Funktion Quersumme2 mit im Code der Funktion Nummer einbauen.

    Was mich noch wundert ist, dass du nicht sauber zwischen Variablentypen unterscheidest, bei einer Operation Operanden verschiedenen Typs benutzt. In der MsgBox ist das kein Problem, da werden Zahlen automatisch in Text umgewandelt. Aber für die Verkettung von Texten würde ich den Operator & benutzen. + steht für die Addition von Zahlen.

    Code:
    Quersumme2 = Quersumme2 + Mid(Zahl, i, 1)
    Hier wird eine Zahl und ein Text addiert. Mid liefert eine Zeichenkette, auch wenn diese nur aus einer Ziffer besteht.

    Code:
    While (Quersumme2(int_i) <> Zahl)
    Hier wird eine Zahl mit einem Range verglichen.

    Ich habe nicht geprüft, ob die beiden letzten Codeschnipsel eine Fehlermeldung verursachen, oft führt das Programm automatisch Typumwandlungen durch, aber fehlerträchtig sind solche Befehle.
     
  5. Hallo,
    danke für den tipp
    ich hab das ganze jetzt mal ein bisschen umstrukturiert, bloß funktionieren tuts immer noch nich.
    Hab ich da jetz nen tipp von euch übersehen oder hab ich nen neuen fehler gemacht den ich nich sehe:

    Public Function Raumnummer(ByVal Zahl As Range) As Integer

    Dim int_i As Integer
    Dim int_zahl As Integer

    int_zahl = Zahl.Value
    int_i = Int(Rnd() * 1000)

    Dim i As Integer
    i = 1

    Dim a As Integer
    Dim quersumme As Integer

    For a = 1 To (Len(int_i))
    quersumme = quersumme + CInt(Mid(int_i, a, 1))
    Next

    While (quersumme <> int_zahl)
    MsgBox ("Versuch: " + i + " Raum: " + int_i + " Quersumme: " + quersumme)
    int_i = Int(Rnd() * 1000)
    For a = 1 To (Len(int_i))
    quersumme = quersumme + CInt(Mid(int_i, a, 1))
    Next
    i = i + 1
    Wend
    Raumnummer = int_i

    End Function
     
  6. Hascheff

    Hascheff Moderator

    Hallo,
    zunächst drei Hinweise, die nicht ursächlich waren.

    Ich schätze, "as Range" macht Ärger, wenn du als Parameter einen Bereich angibst. Klar, das machst du nicht, aber es ist hier nicht nötig. Gib als Datentyp Variant an, dann bist du vielleicht sicherer unterwegs.

    "Mid(int_i, a, 1)" liefert nicht das von dir erwartete Ergebnis, aber das Makro würde trotzdem laufen. Es wird eine Stringoperation auf eine Zahl angewendet. VBA wandelt die Zahl automatisch in einen String um, so wie es die Funktion "str" tun würde. In der Hilfe kann man lesen, dass dabei aber an erster Stelle ein Leer- oder Vorzeichen gesetzt wird. Deshalb bleibt die letzte Ziffer deiner Zahl für die Quersumme einfach unberücksichtigt.

    "While (quersumme <> int_zahl)" hätte Ärger verursacht, wenn das Makro überhaupt so weit gekommen wäre. Ich habe ja noch nicht so ganz verstanden, was dein Makro eigentlich bezweckt (und ich habe das Gefühl, der Zweck lässt sich auch einfacher erreichen), aber ich bezweifle, dass Quersumme genau int_zahl trifft.
    Ich finde, es genügt "While (quersumme < int_zahl)".

    Zum Schluss: Die eigentliche Absturzursache ist ganz simpel: In benutzerdefinierten Funktionen funktioniert MsgBox nicht. Es kommt aber auch keine Fehlermeldung zur Ursache in VBA.

    Vielleicht hast du MsgBox nur zum Testen eingebaut, dann ist vorher doch <> zum Zuge gekommen.
     
  7. Hallo,
    wenn du sagst das das auch leichter geht (wovon ich aber auch ausgehe), dann wüsste ich gern, wie du das gemacht hättest.
    in A1 steht eine zahl z.b. 24
    dann hatte ich vor das excel mir in A2 mittels einer formel möglichst eine zufällige zahl (zwischen 1 und 999) ausspuckt deren quersumme der zahl in A1 entspricht
    ich habe mir da ein paar formeln aus excel ausgeguckt und die einfach per vba-code eingesetzt, und an der stelle hab ich mich glaub ich ein wenig verheddert.
     
  8. Hascheff

    Hascheff Moderator

    Interessant!
    Heute ist es allerdings schon zu spät für einen Code, ich will mal meine Lösungsidee skizzieren:

    Zähler = 0
    Hunderter, Zehner, Einer = 0
    wiederhole bis (Hunderter = 9) oder (Hunderter + Zehner + Einer > Zahl)
    wiederhole bis (Zehner = 9) oder (Hunderter + Zehner + Einer > Zahl)
    wiederhole bis (Einer = 9) oder (Hunderter + Zehner + Einer > Zahl)
    Wenn Hunderter + Zehner + Einer = Zahl Dann Zähler = Zähler + 1
    Einer = Einer + 1​
    Zehner = Zehner + 1​
    Hunderter = Hunderter + 1​
    int_i = Int(Rnd() * Zähler) + 1
    Hunderter, Zehner, Einer = 0
    wiederhole bis (Hunderter = 9) oder (Hunderter + Zehner + Einer > Zahl) oder (int_i = 0)
    wiederhole bis (Zehner = 9) oder (Hunderter + Zehner + Einer > Zahl) oder (int_i = 0)
    wiederhole bis (Einer = 9) oder (Hunderter + Zehner + Einer > Zahl) oder (int_i = 0)
    Wenn Hunderter + Zehner + Einer = Zahl Dann int_i = int_i - 1
    Einer = Einer + 1​
    Zehner = Zehner + 1​
    Hunderter = Hunderter + 1​

    Raumnummer = Hunderter*100 + Zehner*10 + Einer
     
    Last edited: Sep 22, 2008
  9. ehrlich gesagt steige ich da nur durch wenn das zwei verschiedene möglichkeiten sein sollen
    gruß mzurmuehlen
     
  10. Hascheff

    Hascheff Moderator

    Zuerst wird gezählt, wieviele Zahlen mit der geforderten Quersumme es gibt. Dann wird eine Zufallszahl gebildet.
    int_i = Int(Rnd() * Zähler) + 1
    Und dann wird (mit dem gleichen Algorithmus wie im ersten Abschnitt) die int_i-te Zahl ausgewählt.

    Bei deinem Vorgehen musste ständig die Quersumme von in Frage kommenden Zahlen gebildet werden, was doch etwas umständlich ist. Indem ich die Zahl selbst gar nicht benutze, sondern Hunderter, Zehner, Einer, kann ich die leicht zusammenzählen.

    Bei dem von mir vorgeschlagenen Algorithmus ist jede der in Frage kommenden Zahlen gleich wahrscheinlich. Sonst bräuchte man den ersten Abschnitt gar nicht und könnte gleich mit
    int_i = Int(Rnd() * 1000) + 1
    anfangen. Wenn die Zufallszahl zu groß ist, wird die ganze Schleife einfach noch mal durchlaufen.
     
  11. Hi,
    ich hab jetzt deinen vorschlag mal übernommen:

    Public Function Raumnummer(ByVal zahl As Range) As Integer

    Dim int_zahl, zähler, hunderter, zehner, einer, int_i As Integer
    int_zahl = zahl.Value
    zähler = 0
    hunderter = 0
    zehner = 0
    einer = 0

    While hunderter <= 9 Or (hunderter + zehner + einer <= int_zahl)
    While zehner <= 9 Or (hunderter + zehner + einer <= int_zahl)
    While einer <= 9 Or (hunderter + zehner + einer <= int_zahl)
    If hunderter + zehner + einer = int_zahl Then zähler = zähler + 1
    einer = einer + 1
    Wend
    zehner = zehner + 1
    Wend
    hunderter = hunderter + 1
    Wend

    int_i = Int(Rnd() * zähler) + 1
    While hunderter <= 9 Or (hunderter + zehner + einer <= int_zahl) Or int_i = 0
    While zehner <= 9 Or (hunderter + zehner + einer <= int_zahl) Or int_i = 0
    While einer <= 9 Or (hunderter + zehner + einer <= int_zahl) Or int_i = 0
    If hunderter + zehner + einer = int_zahl Then int_i = int_i - 1
    einer = einer + 1
    Wend
    zehner = zehner + 1
    Wend
    hunderter = hunderter + 1
    Wend

    Raumnummer = hunderter * 100 + zehner * 10 + einer

    End Function

    allerdings krige ich bei der zahl 27 dann 1128 raus
    defacto muss der wert aber 999 sein

    gruß mzurmuehlen
     
Thread Status:
Not open for further replies.

Share This Page