Mit FOR EACH durch einen Zellenbereich i
10.02.2022 14:07:56
Wolfgang
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.