Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

For Funktion mit zwei Zahlenbereichen

For Funktion mit zwei Zahlenbereichen
11.01.2016 16:03:15
Sebastian
Hallo liebe User,
ich suche nach dem richtigen Befehl. Ich will y von 7 bis 26 und danach von 29 bis 34 zählen lassen. Gibt’s da eine Möglichkeit?
Mein Versuch:
For y = 7 To 26 and 29 to 34
Next y
Vielen Dank
Grüße Sebastian

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: For Funktion mit zwei Zahlenbereichen
11.01.2016 16:22:28
selli
hallo sebastian,
For y = 7 To 34
if y>26 and y else
dein code
end if
Next y
um die zahlen zw. 26 und 29 auszuschliessen.
"vba gut"
gruß
selli

AW: For Funktion mit zwei Zahlenbereichen
11.01.2016 16:27:25
Sebastian
Hallo Selli,
das "VBA gut" hättest du dir sparen können.
So wie in deinem Beispiel hätte ich es auch hin bekommen. Ich hatte gehofft es gibt eine spezielle For-Funktion um weniger Zeilen zu reduzieren.
So z.B.:
Sub Test
For y = 7 To 26 and 29 to 34
Next y
End Sub
oder so.:
Sub Test
For y = 7 To 26; 29 to 34
Next y
End Sub
trotzdem Danke
Gruß Sebastian

Anzeige
alle achtung...
11.01.2016 16:41:58
selli
hallo,
... du bist ja ein ganz netter.
du könntest das nächst mal noch erwähnen welche antworten deiner nicht würdig sind.
....eine spezielle For-Funktion um weniger Zeilen zu reduzieren.

manchmal ist weniger eben mehr.
gruß
selli

AW: For Funktion mit zwei Zahlenbereichen
11.01.2016 16:28:23
Sebastian
Noch jemand andere vorschläge?

AW: For Funktion mit zwei Zahlenbereichen
11.01.2016 16:46:29
Rudi
Hallo,
sowas gibt es nicht.
Eine Alternative:
Sub aaa()
Dim vArr, i As Long, y As Long
vArr = Array(Array(7, 29), Array(26, 34))
For i = LBound(vArr(0)) To UBound(vArr(0))
For y = vArr(0)(i) To vArr(1)(i)
'mach was
Next y
Next i
End Sub

Gruß
Rudi

Anzeige
Und noch ne Variante …
11.01.2016 16:53:15
RPP63
… aber kürzer wird es dadurch auch nicht:
Sub Quatsch()
Dim i As Integer
For i = 7 To 34
Select Case i
Case Is  28
'Dein Code
End Select
Next
End Sub
Gruß Ralf

AW: For Funktion mit zwei Zahlenbereichen
11.01.2016 17:08:05
Daniel
Hi
in der For-Schleife kann man den Schleifenzähler verändern.
daher ggf auch so, wenn man keinen Wert auf guten Stil legt:
For y = 7 to 34
if y = 27 then y = 29
Next
Gruß Daniel

Da hätte ich eher Folgendes verwendet, ...
11.01.2016 20:32:11
Luc:-?
Daniel:
y = y - 2 * CInt(y = 27) oder besser, weil schneller mit 2 Indizes:
z = y + 2 * (y \ 27) für y = 7 To 32
Dann ist es auch stil-stimmig, weil der Index sauber durchläuft!
Ansonsten hat Selli durchaus recht mit der kleinen Spitze, Sebastian,
denn And ist bekanntlich ein Logik-Operator, der in einem Schleifenkopf wohl kaum anders interpretiert würde, und das VBA-ListenTrennzeichen (bei Aufzählungen!) ist das Komma, was aber nicht in SchleifenKöpfen üblich ist! Außerdem ist der Kopf von For-Schleifen statisch, er wird nur 1× (bei Start) benötigt. Folglich würden auch hier angegebene Alternativen nur generell gelten und keine Zähl-Sprünge verursachen können. Du müsstest also einen anderen Schleifentyp verwenden. Das hängt dann natürlich auch davon ab, was das Pgm bezweckt bzw worauf sich der Index beziehen soll. Sind das (Auflistungs-)Objekte (hier mal Ranges angenommen), kann ggf auch mit For Each y In Range("A7:A26,A29:A34") bzw For Each y In Union(Range("A7:A26"), Range("A29:A34")) gearbeitet wdn.
Ansonsten war es in der Urzeit der EDV ein beliebter Wettstreit, ein Problem mit dem physisch kürzesten Pgm zu lösen. Das ist heute kaum noch sinnvoll… ;->
Gruß, Luc :-?
Besser informiert mit …

Anzeige
AW: das hättest du , weil so eine Berechnung, ...
11.01.2016 22:14:56
Daniel
wichtiger aussieht als ein profanes IF-Then
y = y - 2 * CInt(y = 27)
macht genau das gleiche wie
if y = 27 then y = 29
nämlich y + 2 rechnen, wenn y = 27 ist.
deine Variante sieht halt wie ne wichtige Berechnung aus und die eigentliche Funktion ist erst auf den zweiten Blick erkennbar.
auch die zweite Variante ist nicht schneller.
die Anzahl der Schleifenumläufe welche für die Bearbeitungszeit ausschlaggebend ist, ist für alle Varianten gleich.
du führst aber zusätzlich bei jedem Umlauf noch eine mehr oder wenige komplizierte Berechnung durch, ich jedoch mache bei jedem Umlauf nur einen einfachen Vergleich und rechne nur dann, wenn es erforderlich ist.
daher sollten deine Varianten etwas langsamer sind (wobei die Zeitunterschiede so gering sind, dass sie normalerweise nur bei einer sehr hohen Umlaufzahl messbar werden)
Gruss Daniel

Anzeige
Einfacher Vgl? Weißt du überhaupt, ...
12.01.2016 00:29:22
Luc:-?
…was ein Vgl rechenpgmtechnisch bedeutet, Daniel?
Für einen „einfachen“ Vgl sind mehr interne RechenOperationen erforderlich als für eine arithmetische Berechnung mit Zuweisung. Das macht sich natürlich bei wenigen Durchläufen wie hier nicht bemerkbar. Ich habe mir das aus dem genannten Grund aber generell angewöhnt.
Aber viell ist das ja in den harten Kernel-Algorithmen schon berücksichtigt und heutzutage auch nicht mehr erforderlich. Bliebe noch der obfuskatorische Aspekt…
Luc :-?

AW: Einfacher Vgl? Weißt du überhaupt, ...
12.01.2016 08:28:46
Sebastian
Danke an alle.
Werde dann wohl in zukünftigen Anfragen "VBA - bescheiden" eingeben

Anzeige
AW: Einfacher Vgl? Weißt du überhaupt, ...
12.01.2016 08:45:45
Daniel
Hi Luc
da magst du recht haben, dass ein Vergleich aufwendig ist.
nichtsdestotrotz ist
Vergleich + Wertwandlung + Multiplikation + Subtraktion + Wertzuweisung
aufwendiger als
Vergleich + Wertzuweisung
dein zweiter Code enthält zwar keinen Vergleich, aber mit der Division auch keine ganz simple Berechnung.
Vielleicht bezieht sich dein Wissen über den aufwendigen Vergleich ja auf die IIF-Funktion, diese ist tatsächlich sehr langsam, das gilt aber nicht für IF-Then.
kannst ja mal testen, hier ein code dazu:

Sub test()
Dim t As Double
Dim i As Long, y As Long, z As Long
Const anz = 100000000
t = Timer
For i = 1 To anz
Next
Debug.Print "Leerschleife", Timer - t
t = Timer
For i = 1 To anz
If y = 27 Then y = 29
Next
Debug.Print "If Then", Timer - t
t = Timer
For i = 1 To anz
y = y - 2 * CInt(y = 27)
Next
Debug.Print "Vergleich", Timer - t
t = Timer
For i = 1 To anz
z = y + 2 * (y \ 27)
Next
Debug.Print "Division", Timer - t
t = Timer
For i = 1 To anz
z = y + IIf(y >= 27, 2, 0)
Next
Debug.Print "IIF", Timer - t
End Sub
der ergibt bei mir folgende Laufzeiten (c.a. in sec)
Leerschleife: 0,5
IF Then 1,0
Vergleich: 1,5
Division: 1,5
IIF: 15
Gruss Daniel

Anzeige
Nee, nicht darauf, sondern auf IT-Interna, ...
12.01.2016 14:52:14
Luc:-?
…Daniel;
ich habe mal gelernt, das, was ein Computer am Besten und Schnellsten kann, ist rechnen, möglichst Grundrechenarten - alles nur Bit-Verschiebungen. Vergleiche setzen sich aus einer Vielzahl solcher einfachen Rechnungen zusammen. Deshalb verwende ich die idR nicht, wenn's nicht sein muss (ist auch oft kürzer u/o logischer).
Aber das ist bei wenigen DatenDurchläufen ohnehin irrelevant und bei modernster R-Technik wahrscheinlich ebenfalls zweitrangig. Aber gewohnt ist gewohnt… ;-)
Gruß, Luc :-?

304 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige