Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1868to1872
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Mit FOR EACH durch einen Zellenbereich i

Mit FOR EACH durch einen Zellenbereich i
10.02.2022 14:07:56
Wolfgang
Gegenüber FOR NEXT ist FOR EACH der bessere Iterator durch ein Range, genauer gesagt einen Zellbereich [.cells()],
nur der VBA-Compiler legt sich quer, lt. Microsoft
https://docs.microsoft.com/de-de/office/vba/excel/concepts/cells-and-ranges/looping-through-a-range-of-cells
geht das,
allerdings zieht man sich zurück mit https://docs.microsoft.com/de-de/cpp/dotnet/for-each-in?view=msvc-170
FOR EACH ist nun plötzlich ein nicht standardgemäßige Schlüsselwort.
Dessen Verwendung nicht empfohlen wird.
Gleichermaßen ambivalen verhält sich der VBA-Compiler,
anscheinen war Microsoft sich nicht schlüssig ob man diese Schleife implementieren soll.
Das Problem ist, daß man die "EACH-Variable" nicht als "cell" deklarieren kann,
dieser Variablentyp gibt es nicht, nur als property von Worksheet.Range die
Zellenansammlung "cells()" und da ist unser "EACH-Element" drin,
das wir notgedrungen als "Range" deklarieren, alldieweil "cell" ist ja eigentlich ein "Range" mit nur einer Zelle.
Wir kodieren also:

Dim l As Integer      'die Zeilennr der gefundene Zelle
private sub zelleniterator() {
Dim oW As Worksheet
Dim i As Integer 'Zählvariable für die Zeilen
Dim r As cells     'der zu durchsuchen Zellenbereich
Dim c As range  'die einzelne Zelle und sozusagen der Rückgabewert der Iteration
'nun können wir diese Variablen instanziieren, wie folgt:
Set oW = Thisworkbook.Worksheets("Iterator") 'Achtung Name richtigstellen
i = 1                       'initialisieren der Zählvariable
'nun können wir iterieren:
FOR EACH c In oW.Range(A1, A256)                      'die ganze erste Spalte durchsuchen
i = i + 1             'Zeile hochzähle nach langweiliger,
'aber sichererer Art,
'schöner wäre "++i" aber das gibt's leider nicht
'mache irgendwas mit c,
'ich checke, ob die Zelle leer ist:
If (c.Value = "") {
'alter Stil, aber so funktioniert es
'ich habe ausprobiert,
/* "If (IsEmpty(c.Value))" viel elegant und es wird kompiliert
aber, wie bei "FOR EACH" im Einzelschritt der Laufzeitfehler
1004 "Anwendungs- oder objektdefinierter Fehler",
bei Verwendung von FOR EACH ist das aber wurst; denn diesen Fehler wird man nicht los,
da kommt es nicht auf noch einen Laufzeitfehler, schließlich wird das ganze kompiliert
und man kann den Code sowieso nicht ausführen, weder mit dem grünen Pfeil, noch im Einzelschritt.
l = i - 1
End If
NEXT 'Für FOR EACH
Fazit FOR NEXT gibt's nicht in VB, man nehme "FOR NEXT"
und zur Feststellung, ob eine Zelle leer ist, kann man nicht "IsEmpty" verwenden.

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Was willst Du uns...
10.02.2022 14:15:35
{Boris}
Hi,
...damit sagen?
Dein Fazit Fazit FOR NEXT gibt's nicht in VB, man nehme "FOR NEXT" kapier ich auch nicht.
Zudem macht IsEmpty von Haus aus Folgendes
Gibt einen Boolean-Wert zurück, der angibt, ob eine Variable initialisiert wurde.

Dim r As cells - was soll das sein?
Fazit: Klär bitte auf ;-)
VG, Boris
Das wdn wohl die Tücken der Online-Hilfe ...
10.02.2022 15:30:50
Luc:-?
…sein, Boris,
in der sich der gute Wolfgang verirrt hat. Da war man bei seiner Xl-Version und bis Xl14/2010 mit der Offline-Hilfe besser bedient. Als in VBA Guter hätte er ja auch bemerken können, dass es beim 2.Link gar nicht um VBA geht, beim 1. aber schon… ;-]
Fazit: Dieser Beitrag hat das Potenzial, VBA-Anfänger eher zu verwirren (genauso wie oder gar mehr als die Online-Hilfe, die zwar umfassender aber letztlich in ihrer Abfassung/Übersetzung und damit Wirkung schlechter als die letzte Offline-Hilfe ist, die ohnehin nicht besser war als ihre Vorgängerin).
Ansonsten versucht er wohl, seiner Verwirrung Ausdruck zu verleihen und so letztlich Eulen nach Athen zu tragen… ;->
Gruß, Luc :-?
Anzeige
Möglich ist es...
10.02.2022 15:54:51
{Boris}
Hi Luc,
...aber soll Wolfgang erstmal antworten, was ihn zu diesem Beitrag veranlasst hat.
Solange unterschreibe ich Deine Aussage Dieser Beitrag hat das Potenzial, VBA-Anfänger eher zu verwirren ;-)
VG, Boris
Mal sehen,...
10.02.2022 16:46:43
Luc:-?
…Boris,
falls ihn unsere AWen nicht verschreckt haben. Viell wollte er ja nur in der inzwischen gewonnenen Freizeit* seine VBA-Kenntnisse erweiternd auffrischen. Eine Frage hat er ja nicht gestellt, was normalerweise bedeutet, dass er uns nur seine „Erkenntnisse“ mitteilen wollte. Jedenfalls sind meine StartBeiträge idR so zu verstehen… ;-)
* Er scheint gerademal 2 Jahre jünger als meine Frau zu sein und die ist schon seit ein paar Jahren Rentnerin (von mir ganz zu schweigen).
Luc :-?
Anzeige
Meine Kritik der Online-Hilfe ...
12.02.2022 16:27:06
Luc:-?
…hast Du ja inzwischen aufgegriffen (auf ol.de/p), Boris. ;-)
Gruß, Luc :-?
AW: Mit FOR EACH durch einen Zellenbereich i
10.02.2022 15:24:22
JoWE
Hallo,
ich habe nicht wirklich herauslesen können, was Dein Ziel ist.
Der hier folgende Code durchläuft mittels
"For Each" die Spalte A von Zeile 1 bis Zeile 256 (also NICHT!!! Zitat: "die ganze erste Spalte").
Bei diesem Code legt sich trotz "For Each" nicht einmal annähernd irgendetwas quer!!

Sub test()
Dim oW As Worksheet
Dim c As Range
Dim i As Long 'long ist wertvoller als integer (größerer Zahlenraum)
Set oW = ThisWorkbook.Worksheets("Iterator")
For Each c In oW.Range("A1:A256")    'die Spalte A von Zeile 1 bis Zeile 256 durchsuchen, "c" repräsentiert jeweils genau 1 Zelle
'i = i + 1                        'in diesem Beispielcode wird die Variable nicht genutzt
If (c.Value = "") Then
oW.Cells(c.Row, 2) = "Inhalt von Zeile " & c.Row & " Zelle ist leer!"
'was auch immer geschehen soll kann hier gemacht werden
'und
'hier könnte mit der Variable i auch noch irgendetwas gemacht werden
Else
oW.Cells(c.Row, 2) = "Inhalt von Zeile " & c.Row & " lautet: " & c.Value
'was auch immer geschehen soll kann hier gemacht werden
'und
'hier könnte mit der Variable i auch noch irgendetwas gemacht werden
End If
Next
End Sub
Gruß Jochen
Anzeige
AW: ups, XL2003 (zu spät gesehen!)
10.02.2022 16:12:00
JoWE
Also doch die gesamte Spalte 😀
AW: This is NOT EVEN WRONG ! (owT)
10.02.2022 16:51:04
EtoPHG

AW: This is NOT EVEN WRONG ! (owT)
11.02.2022 04:35:51
Wolfgang
Hallo Boris,
vielen Dank dafür, daß Du mich auf meinen Fehler im Fazit, aufmerksam gemacht hast, ich wollte natürlich schreiben "FOR EACH gibt's nicht"
Un ja, ja ich weiß wie "IsEmpty" funktioniert, jedenfalls kann man dieses Statement auf Cell.Value anwenden.
Netten Gruß
Wolfgang
Ich habe aber immer noch nicht...
11.02.2022 09:05:50
{Boris}
Hi Wolfgang,
...verstanden, was Du eigentlich mitteilen wolltest. Dass Du bei Deiner For-Next/For-Each-Behauptung falsch lagst, wurde Dir ja bereits aufgezeigt, da Du als "Referenz" auf eine andere Programmiersprache verwiesen hast.
Habe ich noch was überlesen?
VG, Boris
Anzeige

152 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige