Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

VBA gibt falsche Zahlen aus
#1
Hallo,

vielleicht könnt Ihr mir ja helfen, ich komm echt nicht weiter. 
Also geht um folgenden Code:

Sub test()

If Worksheets("Rechner").Cells(15, 3) <= "500" Then Worksheets("Rechner").Cells(16, 3) = "45"
If Worksheets("Rechner").Cells(15, 3) <= "1000" Then Worksheets("Rechner").Cells(16, 3) = "80"
If Worksheets("Rechner").Cells(15, 3) <= "1500" Then Worksheets("Rechner").Cells(16, 3) = "115"

End Sub

Die erste Zeile mit dem Berich bis 500 funktioniert einwandfrei.
Die zweite Zeile bis 1000 funktioniert gar nicht, von 501 bis 999 gibt es mir gar nichts aus und bei 1000 wird 115 ausgegeben (obwohl es 80 sein müsste).
Die dritte Zeile funktioniert zwar wieder, jedoch gibt es mir bei über 1500 auch 115 aus.

Hat jemand eine Idee?

Vielen Dank 

Basti
Antworten Top
#2
Hallo

mal grundsätzlich:

willst du Zahlen oder Text vergleichen?

MfG Tom
Antworten Top
#3
Hallo,

in solchen Fällen ist Select Case einfacher zu handhaben.


Code:
Sub test()
 With Worksheets("Rechner")
   .Cells(16, 3).ClearContents 'erst einmal die Zelle leeren
   Select Case .Cells(15, 3).Value
     Case 0 To 500
       .Cells(16, 3) = 45
      Case 501 To 1000
       .Cells(16, 3) = 80
     Case 1001 To 1500
       .Cells(16, 3) = 115
   End Select
 End With
End Sub


Ich wollte Dich auch darauf hinweisen, dass man Zahlen nicht in Anführungszeichen schreibt.
Dann können sie als Text gewertet werden.
Gruß Atilla
[-] Folgende(r) 1 Nutzer sagt Danke an atilla für diesen Beitrag:
  • Basti5
Antworten Top
#4
Hallo,

@ Tom die Zellen sollen als Währung formatiert sein.

@ Atilla , werde ich mal versuchen und danke vlt liegt es ja wirklich an den 
Anführungszeichen.  Ich Versuchs gleich mal.

VG
Antworten Top
#5
Hallo Basti,

ich glaube nicht das dein Problem mit Text zu tun hat (den Fehler gibt es auch!)  Hier liegt m.E. ein rein logischer Denkfehler vor, auf den ich auch schon öfter reingefallen bin.  Du wertest <= aus!!  Beachte bitte die korrekte Reihenfolge der Auswertung!!  Excel tut das grundsaetzlich auch!! Und fragt nicht danach ob Du logisch richtig programmiert hast??

Dreh das ganze bitte mal so um:   ich hoffe du erkennst selbst den grundlegenden Unterschied!!  Okay ...??

mfg Gast 123      (Erfahrung ist die Summe aller Fehler! Ich habe schon viel Erfahrung gesammelt ... hi hi hi)

Code:
If Worksheets("Rechner").Cells(15, 3) <= "1500" Then Worksheets("Rechner").Cells(16, 3) = "115"
If Worksheets("Rechner").Cells(15, 3) <= "1000" Then Worksheets("Rechner").Cells(16, 3) = "80"
If Worksheets("Rechner").Cells(15, 3) <= "500" Then Worksheets("Rechner").Cells(16, 3) = "45"
Antworten Top
#6
Hallo,

Deine Variante ginge, wenn du die Reihenfolge änderst:


Code:
Sub test2()
 Cells(16, 3).ClearContents
 If Worksheets("Rechner").Cells(15, 3) <= 1500 Then Worksheets("Rechner").Cells(16, 3) = 115
 If Worksheets("Rechner").Cells(15, 3) <= 1000 Then Worksheets("Rechner").Cells(16, 3) = 80
 If Worksheets("Rechner").Cells(15, 3) <= 500 Then Worksheets("Rechner").Cells(16, 3) = 45
End Sub


Bei einer Zahl kleiner 501 würde in die Zelle nacheinander, zuerst 115 dann 80 und am Ende 45 geschrieben.
Als Ergebnis ist es richtig. In disem fall auch unerheblich, dass die Zelle mehrmals beschrieben wird.
Muss man aber nicht machen, wenn es eine saubere Lösung gibt.
Gruß Atilla
Antworten Top
#7
Hey,

dann werde ich mal die Reinfolge wechseln.

Aber die Sache mit dem Select Case klappt auch sehr gut, wahrscheinlich werde ich damit weiterarbeiten.

Ich bedanke mich vielmals bei euch für die Hilfe.

Viele Grüße

Basti
Antworten Top
#8
Danke Kollegen,

Zahlen als Text ist mir noch garnicht aufgefallen.  Hut ab vor euch.  Liege ich mit meiner Beobachtung richtig das die If Then Reihenfolge nicht stimmt??

@Attila  völlig korrekt das die Reihenfolge bei Case richtig ist. Da wird jeder Fall nur einmal ausgewertet!  Bei  If Then, so wie er es aufgebaut hat, eben dreimal, völlig unabhaengig vom vorherigen Ergebnis!  Der kleine, aber feine Unterschied!

mfg  Gast 123
Antworten Top
#9
(18.02.2017, 22:30)Gast 123 schrieb: @Attila  völlig korrekt das die Reihenfolge bei Case richtig ist. Da wird jeder Fall nur einmal ausgewertet!  Bei  If Then, so wie er es aufgebaut hat, eben dreimal, völlig unabhaengig vom vorherigen Ergebnis!  Der kleine, aber feine Unterschied!

mfg  Gast 123

Hallo, ich versteh jetzt nicht ganz, was Du meinst.
Aber was Du schreibst ist nicht richtig.

Wie Du und ich es auch gezeigt haben, erhält er bei geänderte Reihenfolge richtige Ergebnisse.
Aber der Code arbeitet nicht immer alle If Abfragen durch!! Also nicht eben dreimal, wie du es schreibst.

Bei Zahlen <=500 alle drei
bei zahlen 501-1000 zwei
bei Zahlen 1001 bis 1500 nur die erste If Abfrage.
Gruß Atilla
Antworten Top
#10
Hallo an alle

@Atilla   deine Lösung sehe ich als mit die beste an.  Man kann sie auch mit If Then über ElseIf aufbauen:

Ich erwaehne es nur um dem Frager die Vielzahl der Lösungsmöglichkeiten aufzuzeigen. Als Excel Grundkurs!
Die Entscheidung was er nimmt liegt ganz allein bei ihm!!

mfg  Gast 123

Code:
'diese Variante entspricht der Case Select Methode
If Worksheets("Rechner").Cells(15, 3) <= 500 Then
  Worksheets("Rechner").Cells(16, 3) = "45"
ElseIf Worksheets("Rechner").Cells(15, 3) <= 1000 Then
  Worksheets("Rechner").Cells(16, 3) = "80"
ElseIf Worksheets("Rechner").Cells(15, 3) <= 1500 Then
  Worksheets("Rechner").Cells(16, 3) = "115"
End If
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste