Visual Basic
Hey ,bin hier neu auf der Plattform,deshalb sorry wenn ich mich noch nicht so gut auskenne.
Mein Propblem sieht so aus;
For i = 1000 to 9999
If i mod 17 = 0 then
Ergebnis = Ergebnis +1
End If
Next
MsgBox "Ergebnis"
Eigentlich sollte mir die Msgbox alle Zahlen zwischen 1000 und 9999 auflisten die durch 17 teilbar sind.
Leider funktioniert dies nicht,
Kann mir jemand sagen was an der syntax falsch ist ?
Gruß
libertes
Mein Propblem sieht so aus;
For i = 1000 to 9999
If i mod 17 = 0 then
Ergebnis = Ergebnis +1
End If
Next
MsgBox "Ergebnis"
Eigentlich sollte mir die Msgbox alle Zahlen zwischen 1000 und 9999 auflisten die durch 17 teilbar sind.
Leider funktioniert dies nicht,
Kann mir jemand sagen was an der syntax falsch ist ?
Gruß
libertes
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 136478
Url: https://administrator.de/contentid/136478
Ausgedruckt am: 16.11.2024 um 03:11 Uhr
20 Kommentare
Neuester Kommentar
Ergebnis sollte ja nun auch kein String sein. Ich bin nun nicht der vba fraggle, aber versuch mal long.
Stefan
Stefan
Hallo libertes!
Funktioniert besser, wenn Du
1. Einen Zähler als Integer definierst (String = Text, Integer = Zahl)
2. Auch was zum Teilen nimmst (Nothing Mod 17)
Gruß Dieter
Funktioniert besser, wenn Du
1. Einen Zähler als Integer definierst (String = Text, Integer = Zahl)
2. Auch was zum Teilen nimmst (Nothing Mod 17)
Dim Ergebnis As Integer
For i = 1000 To 9999
If i Mod 17 = 0 Then Ergebnis = Ergebnis + 1
Next
MsgBox Ergebnis
Gruß Dieter
Dan n versuche es mal so:
Dim i As Integer
Dim iCounter As Integer
'Anzahl der Treffer (erst mal auf 0 setzten)
iCounter = 0
For i = 1000 To 9999
If i Mod 17 = 0 Then
iCounter = iCounter + 1
End If
Next
'Nach durchlauf der Schleife das Ergebnis ausgeben (Anzahl der Treffer)
MsgBox("Es gibt : " & iCounter & " Treffer")
Gruß
HaPe
Dim i As Integer
Dim iCounter As Integer
'Anzahl der Treffer (erst mal auf 0 setzten)
iCounter = 0
For i = 1000 To 9999
If i Mod 17 = 0 Then
iCounter = iCounter + 1
End If
Next
'Nach durchlauf der Schleife das Ergebnis ausgeben (Anzahl der Treffer)
MsgBox("Es gibt : " & iCounter & " Treffer")
Gruß
HaPe
[OT]
Ja, ich weiß, ob nun Dualcore oder Quadcore, das macht preislich kaum einen Unterschied... und die Rechner sind ja wirklich sauschnell heutzutage....
Und natürlich kann man/frau einen armen wehrlosen Skriptschnipsel zur Prüfung von 8999 Zahlen auf Teilbarkeit durch 17 auch 8999mal durch eine Schleife jagen...
Aber im Ernst - würdet ihr ohne Computer den gleichen Algorithmus anwenden?
So oder so ähnlich hätte ein Nicht-Quadcore-Besitzer diesen Algorithmus wohl eher formuliert...
Grüße
Biber
[Edit] Etwas leserlicher formuliert. [/Edit]
[/OT]
Ja, ich weiß, ob nun Dualcore oder Quadcore, das macht preislich kaum einen Unterschied... und die Rechner sind ja wirklich sauschnell heutzutage....
Und natürlich kann man/frau einen armen wehrlosen Skriptschnipsel zur Prüfung von 8999 Zahlen auf Teilbarkeit durch 17 auch 8999mal durch eine Schleife jagen...
Aber im Ernst - würdet ihr ohne Computer den gleichen Algorithmus anwenden?
Dim Anzahl As Integer
Dim Von as Integer
Dim Bis as Integer
Dim Modwert as Integer
Dim First As Integer
Dim Last As Integer
Von = 1000
Bis = 9999
Modwert =17
First = int(Von / modwert)
Last = int (Bis /modwert)
If (int(Von / modwert) <> Von / modwert) Then First = First+1
Anzahl= Last -First +1
MsgBox ("Es gibt : " &Last & "-" &First &" +1 = " & Anzahl & " Treffer.")
So oder so ähnlich hätte ein Nicht-Quadcore-Besitzer diesen Algorithmus wohl eher formuliert...
Grüße
Biber
[Edit] Etwas leserlicher formuliert. [/Edit]
[/OT]
Zitat von @Biber:
So oder so ähnlich hätte ein Nicht-Quadcore-Besitzer diesen Algorithmus wohl eher formuliert...
So oder so ähnlich hätte ein Nicht-Quadcore-Besitzer diesen Algorithmus wohl eher formuliert...
Hallo,
es war schon immer viel schlauer Hirn statt Rechenleistung zu verwenden.
Respekt! Auf diese ganz einfache Idee bin ich ja nun auch nicht gekommen.
Stefan
Dieser "einfache" Programmcode verbraucht schonmal 6 Variablen während der "rechenaufwändige" mit einer auskommt. Nicht nur das man damit bei "Nicht-Quadcore-Rechnern" und größeren Programmen dieser Art den heutzutage wertvolleren Arbeitsspeicher zumüllt, sondern auch die Übersichtlichkeit geht hier flöten. Wer bei solch trivialen For-Schleifen im Jahre 2010 an die Rechenleistung denkt, der ist vor einigen Jahren mal irgendwo stehen geblieben. Selbst ein halbwegs guter Pentium 2 würde diesen Quellcode in unter ner Sekunde durchrattern.
@ Biber: Ich willt nicht deinen Programmcode schlecht machen, im Gegenteil - mehrere Lösungen für ein Ziel sind immer besser als nur eine, aber die Lösung mit der Performanceverschwendung der anderen Codes zu begründen ist für mich Schwachsinn.
MfG Heinrich
@ Biber: Ich willt nicht deinen Programmcode schlecht machen, im Gegenteil - mehrere Lösungen für ein Ziel sind immer besser als nur eine, aber die Lösung mit der Performanceverschwendung der anderen Codes zu begründen ist für mich Schwachsinn.
MfG Heinrich
Ach HeinrichXII,
da machen wir gar nicht viel Heckmeck drumrum... da mach ich mal ein liebloses Copy&Paste:
...und lass das als VBS.Version laufen.... und der Lüfter jault...
Ich denke, die anderthalb Minuten deines Algorithmus in Runde 2 sind erkennbar.
Und von den 6 Variablen, die ich habe, sind 5 nur wegen der Lesbarkeit drin....
Grüße
Biber
Nachtrag: Ergebnisse der Runde drei (von 1000 bis 100Mio-1:
[Edit]
[/Edit]
da machen wir gar nicht viel Heckmeck drumrum... da mach ich mal ein liebloses Copy&Paste:
' Quicktest ....Anzahl durch 17 teilbare Zahlen Von:1000 Bis:10Mio-1
Wscript.echo vblf & " Runde 1 ...10 Mio " & vbcrlf
wscript.echo "For every number - Loop start " & time
Ergebnis=0
For i = 1000 To 9999999
If i / 17 = Int(i / 17) Then
Ergebnis = Ergebnis + 1
End If
Next
wscript.echo "Ergebnis: " & Ergebnis
wscript.echo "For every number - Loop end "& time
'------
wscript.echo "--------------------------------------"
wscript.echo "mit 6 variablen start" & time
Von = 1000
Bis = 9999999
Modwert =17
First = int(Von / modwert)
Last = int (Bis /modwert)
If (int(Von / modwert) <> Von / modwert) Then First = First+1
Anzahl= Last -First +1
Wscript.echo (vblf & "Es gibt : " &Last & "-" &First &" +1 = " & Anzahl & " Treffer." & vblf)
wscript.echo "mit 6 variablen end" & time
Wscript.echo vblf & " Runde 2 ...50 Mio " & vbcrlf
' Quicktest ....Anzahl durch 17 teilbare Zahlen Von:1000 Bis:50Mio-1
wscript.echo "For every number - Loop start " & time
Ergebnis=0
For i = 1000 To 49999999
If i / 17 = Int(i / 17) Then
Ergebnis = Ergebnis + 1
End If
Next
wscript.echo "Ergebnis: " & Ergebnis
wscript.echo "For every number - Loop end "& time
'------
wscript.echo "--------------------------------------"
wscript.echo "mit 6 variablen start" & time
Von = 1000
Bis = 49999999
Modwert =17
First = int(Von / modwert)
Last = int (Bis /modwert)
If (int(Von / modwert) <> Von / modwert) Then First = First+1
Anzahl= Last -First +1
Wscript.echo (vblf & "Es gibt : " &Last & "-" &First &" +1 = " & Anzahl & " Treffer." & vblf)
wscript.echo "mit 6 variablen end" & time
...und lass das als VBS.Version laufen.... und der Lüfter jault...
>e:\schnipsel\Quicktestmod17.vbs
Runde 1 ...10 Mio
For every number - Loop start 19:49:08
Ergebnis: 588177
For every number - Loop end 19:49:24
--------------------------------------
mit 6 variablen start19:49:24
Es gibt : 588235-59 +1 = 588177 Treffer.
mit 6 variablen end19:49:24
Runde 2 ...50 Mio
For every number - Loop start 19:49:24
Ergebnis: 2941118
For every number - Loop end 19:50:43
--------------------------------------
mit 6 variablen start19:50:43
Es gibt : 2941176-59 +1 = 2941118 Treffer.
mit 6 variablen end19:50:43
(=19:50:44 D:\temp=)
Ich denke, die anderthalb Minuten deines Algorithmus in Runde 2 sind erkennbar.
Und von den 6 Variablen, die ich habe, sind 5 nur wegen der Lesbarkeit drin....
Grüße
Biber
Nachtrag: Ergebnisse der Runde drei (von 1000 bis 100Mio-1:
Runde 3 ...100 Mio
For every number - Loop start 20:03:18
Ergebnis: 5882294
For every number - Loop end 20:05:49
--------------------------------------
mit 6 variablen start20:05:49
Es gibt : 5882352-59 +1 = 5882294 Treffer.
mit 6 variablen end20:05:49
[Edit]
Selbst ein halbwegs guter Pentium 2 würde diesen Quellcode in unter ner Sekunde durchrattern.
Na ja, dann hab' ich mir wohl so'n Billig-Import andrehen lassen ... [/Edit]
Hallo,
danke für deinen Post. Ich muss zugeben der war ziemlich aufschlussreich. Es ist ja schön, dass du das alles mal so simulierst und ich traue auch deinen Testergebnissen, nur war die Frage hier nicht nach 10, 50 oder 100 Millionen, sondern nach rund 9000 Zahlen und das schafft dann auch ein Pentium II.
MfG Heinrich
danke für deinen Post. Ich muss zugeben der war ziemlich aufschlussreich. Es ist ja schön, dass du das alles mal so simulierst und ich traue auch deinen Testergebnissen, nur war die Frage hier nicht nach 10, 50 oder 100 Millionen, sondern nach rund 9000 Zahlen und das schafft dann auch ein Pentium II.
MfG Heinrich
Zitat von @HeinrichXII:
Wer bei solch trivialen For-Schleifen im Jahre 2010 an die Rechenleistung denkt, der ist vor einigen Jahren mal irgendwo stehen geblieben.
Hallo,Wer bei solch trivialen For-Schleifen im Jahre 2010 an die Rechenleistung denkt, der ist vor einigen Jahren mal irgendwo stehen geblieben.
aber wer im kleine schludert....
Oder wie willst Du erklären warum Windows 7 auf einem Core i5 gegenüber Windows 98 auf einem P2 nicht ein bischen schneller ist.
Stefan
PS: zeigt das Bild Dein Büro?
Moin HeinrichXII,
na ja, ich bin davon ausgegangen, dass libertes' Skizze ja auch nur eine zarte Andeutung sein sollte...für die paar durch 17 teilbaren Zahlen zwischen 1000 und 9999 braucht er ja wohl kaum ein Programm schreiben. Bestenfalls einen Bierdeckel.
Und selbst wenn er dieses Programmschnipselchen nur in diesem daumengroßen Zahlenbereich von bis 10000(-1) verwendet - nach 1000x Starten ist er bei 10Mio.
Also sooooooooo verwegen und realitätsfern finde ich den Quicktest nicht.
Aber ich geb dir natürlich Recht... eine For-Schleife 10000x durcheiern.... das braucht auf den heutigen Rechnern (und gestrigen bis runter auf PentiumII)- natürlich nur einen Lidschlag.
Grüße
Biber
na ja, ich bin davon ausgegangen, dass libertes' Skizze ja auch nur eine zarte Andeutung sein sollte...für die paar durch 17 teilbaren Zahlen zwischen 1000 und 9999 braucht er ja wohl kaum ein Programm schreiben. Bestenfalls einen Bierdeckel.
Und selbst wenn er dieses Programmschnipselchen nur in diesem daumengroßen Zahlenbereich von bis 10000(-1) verwendet - nach 1000x Starten ist er bei 10Mio.
Also sooooooooo verwegen und realitätsfern finde ich den Quicktest nicht.
Aber ich geb dir natürlich Recht... eine For-Schleife 10000x durcheiern.... das braucht auf den heutigen Rechnern (und gestrigen bis runter auf PentiumII)- natürlich nur einen Lidschlag.
Grüße
Biber
Aloha,
@ Biber: die Worte "verwegen" und "realitärsfern" stammen aus deinem Munde . Wie gesagt ich fand den Test sehr aufschlussreich (und das mein ich wirklich nicht ironisch)
@ Stefan: Das is aber auch ein hinkender Vergleich - Windows 7 und 98 sind sowohl im Funktionsumfang, Sicherheit, Rechteverwaltung, Grafik und verwendete Treiber nicht Ansatzweise zu vergleichen. Sicher magst du Recht haben das es von der Geschwindigkeit keinen Unterscheid gibt, von der Bedienbarkeit her aber einen riesigen.
MfG Heinrich
Edit: Nein zeigt es nicht, aber was nicht ist kann ja noch werden .
@ Biber: die Worte "verwegen" und "realitärsfern" stammen aus deinem Munde . Wie gesagt ich fand den Test sehr aufschlussreich (und das mein ich wirklich nicht ironisch)
@ Stefan: Das is aber auch ein hinkender Vergleich - Windows 7 und 98 sind sowohl im Funktionsumfang, Sicherheit, Rechteverwaltung, Grafik und verwendete Treiber nicht Ansatzweise zu vergleichen. Sicher magst du Recht haben das es von der Geschwindigkeit keinen Unterscheid gibt, von der Bedienbarkeit her aber einen riesigen.
MfG Heinrich
Edit: Nein zeigt es nicht, aber was nicht ist kann ja noch werden .
Hallo zusammen!
@Biber
Dein PC ist ganz schön langsam
Hier mein Test ohne Startverzögerung:
Und meine Zeiten:
Ansonsten hast Du natürlich recht, dass es von keinem guten Programmierstil zeugt, derartige Codes zu schreiben.
Gruß Dieter
@Biber
Dein PC ist ganz schön langsam
Hier mein Test ohne Startverzögerung:
Start = time: Ergebnis=0
For i = 1000 To 9999999
If i Mod 17 = 0 Then Ergebnis = Ergebnis + 1
Next
wscript.echo "Start: " & Start & " Stop: "& time & vbTab & Ergebnis
Start = time: Ergebnis=0
For i = 1000 To 49999999
If i Mod 17 = 0 Then Ergebnis = Ergebnis + 1
Next
wscript.echo "Start: " & Start & " Stop: "& time & vbTab & Ergebnis
Start = time: Ergebnis=0
For i = 1000 To 99999999
If i Mod 17 = 0 Then Ergebnis = Ergebnis + 1
Next
wscript.echo "Start: " & Start & " Stop: "& time & vbTab & Ergebnis
Und meine Zeiten:
Runde 1 ...10 Mio
For every number - Loop start 20:41:00
Ergebnis: 588177
For every number - Loop stop 20:41:02
--------------------------------------
Runde 2 ...50 Mio
For every number - Loop start 20:41:30
Ergebnis: 2941118
For every number - Loop stop 20:41:43
--------------------------------------
Runde 3 ...100 Mio
For every number - Loop start 21:00:07
Ergebnis: 5882294
For every number - Loop stop 21:00:33
Ansonsten hast Du natürlich recht, dass es von keinem guten Programmierstil zeugt, derartige Codes zu schreiben.
Gruß Dieter
Moin didi1954,
Du müsstest diesen Proof-of-Concept-Test wahrscheinlich eher im Bereich von 100Mio, 500Mio und 1Mrd machen...
Ich habe mich ja nur zu diesem Konter hinreißen lassen, weil ich sofort bei HeinrichXIIs Kommentar "aber die Lösung mit der Performanceverschwendung der anderen Codes zu begründen ist für mich Schwachsinn." unter der Decke geklebt habe... da kann ich dann auch stur sein...*g
Na ja, mein heissblütiges norddeutsches Temperament halt.
Aber eine Doktorarbeit sollte es auch nicht werden...
Andererseits sind für mich hier im Forumsbereich schon die Algorithmen und die Lösungsstrategien ein wichtigerer Punkt als diese Das-ist-mein-Laden-Argumentation, dass alles einfach immer mit einem neueren Boliden doppelt so schnell gehen wird.
Und wenn zwei jeweils 5zeilige Schnipsel in der Performance um den Faktor 1000 abweichen, dann ist es für mich schon ein Kriterium.
So, nun aber gut mit diesem kleinen Exkurs.
Grüße
Biber
Dein PC ist ganz schön langsam
jahaa, und dein PC ganz schön schnell.Du müsstest diesen Proof-of-Concept-Test wahrscheinlich eher im Bereich von 100Mio, 500Mio und 1Mrd machen...
Ich habe mich ja nur zu diesem Konter hinreißen lassen, weil ich sofort bei HeinrichXIIs Kommentar "aber die Lösung mit der Performanceverschwendung der anderen Codes zu begründen ist für mich Schwachsinn." unter der Decke geklebt habe... da kann ich dann auch stur sein...*g
Na ja, mein heissblütiges norddeutsches Temperament halt.
Aber eine Doktorarbeit sollte es auch nicht werden...
Andererseits sind für mich hier im Forumsbereich schon die Algorithmen und die Lösungsstrategien ein wichtigerer Punkt als diese Das-ist-mein-Laden-Argumentation, dass alles einfach immer mit einem neueren Boliden doppelt so schnell gehen wird.
Und wenn zwei jeweils 5zeilige Schnipsel in der Performance um den Faktor 1000 abweichen, dann ist es für mich schon ein Kriterium.
So, nun aber gut mit diesem kleinen Exkurs.
Grüße
Biber
Moin Moin an alle
Sehr interressant das alles. Am Anfang schreibt libertes: "Ich brauch mal Hilfe. Ich bin neu hier und habe ein kleines Problem.... "
Wenn man sich dann den Code ansieht, würd ich mal sagen, dass sich das "neu" nicht nur auf das Forum bezieht.
Mit den ersten Lösungsvorschlägen ist dem Kollegen dann erst mal geholfen. Es funktioniert, wie es sollte.
Ob es da Verbesserungen gibt, war nicht die eigentliche Frage.
Der Rest der Diskussion gleitet dann ab in den Bereich "Algorithmen" und ist HIER eigentlich fehl am Platz.
Wie dem auch sei, Biber hat insofern Recht, das es seit einiger Zeit aus der Mode gekommen ist, effizienten Code zu schreiben.
In Zeiten von QuadCore und gigabyte großem Arbeitspeicher macht man sich keinen Gedanken mehr um "schlanken" und effizienten Code.
Vielleicht sollte man den Thread dann auch in einen anderen Forumsbereich verschieben und da weitermachen
@libertes: Hat es denn wenigstens geholfen?
Gruß
HaPe
@HeinrichXII: Für eine komplette Büroausstattung fehlt aber noch die Kaffeemaschine
Sehr interressant das alles. Am Anfang schreibt libertes: "Ich brauch mal Hilfe. Ich bin neu hier und habe ein kleines Problem.... "
Wenn man sich dann den Code ansieht, würd ich mal sagen, dass sich das "neu" nicht nur auf das Forum bezieht.
Mit den ersten Lösungsvorschlägen ist dem Kollegen dann erst mal geholfen. Es funktioniert, wie es sollte.
Ob es da Verbesserungen gibt, war nicht die eigentliche Frage.
Der Rest der Diskussion gleitet dann ab in den Bereich "Algorithmen" und ist HIER eigentlich fehl am Platz.
Wie dem auch sei, Biber hat insofern Recht, das es seit einiger Zeit aus der Mode gekommen ist, effizienten Code zu schreiben.
In Zeiten von QuadCore und gigabyte großem Arbeitspeicher macht man sich keinen Gedanken mehr um "schlanken" und effizienten Code.
Vielleicht sollte man den Thread dann auch in einen anderen Forumsbereich verschieben und da weitermachen
@libertes: Hat es denn wenigstens geholfen?
Gruß
HaPe
@HeinrichXII: Für eine komplette Büroausstattung fehlt aber noch die Kaffeemaschine