For Each...Next-Anweisung läuft nicht mehr richtig

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
MsgBox
Bild

Betrifft: For Each...Next-Anweisung läuft nicht mehr richtig
von: Friedhelm
Geschrieben am: 23.06.2015 19:28:51

Hallo,
ich hatte von Tino am 22.04.2014 22:02:04 eine Hilfe bekommen die ich mit der For Each...Next Anweisung super lösen konnte.

Sub test()
Dim Re_Nr(), ArData, rng As Range
Dim n&, nn&
For Each rng In Tabelle1.AutoFilter.Range.SpecialCells(xlCellTypeVisible).Areas
    ArData = rng.Columns(2).Resize(, 2) 'Spalte mit RE-Nr Angeben 
    Redim Preserve Re_Nr(Ubound(ArData) + nn - 2)
    For n = 1 To Ubound(ArData)
        If nn > 0 Then
            Re_Nr(nn - 1) = ArData(n, 1)
        End If
        nn = nn + 1
    Next n
Next rng
'Ausgabe 
For n = Lbound(Re_Nr) To Ubound(Re_Nr)
    MsgBox Re_Nr(n)
Next n
End Sub

Ich hatte eine Erweiterung, durch Eingefügen einer Spalte, in der betroffenen Tabelle gemacht, aber außerhalb des Bereiches, der von der Anweisung genutzt wird (.Columns(4).Resize(,3) ).
Folgendes ist mir aufgefallen:
Wenn ich im Modul mit dem Curser über den Programmcode gehe, wird bei den Variablen, wenn vorhanden, der Wert angezeigt. In diesem Fall wird jetzt bei:
For Each rng In Tabe.....
der rng Wert: nothing angezeigt.
In der alten Version war das nicht.
Die Auswirkung in der neuen Version: die For Each...Next Anweisung wird zunächst komplett durchlaufen, die Daten richtig eingelesen, dann ist der Wert "nothing" bei rng weg, die Anweisung wird noch mal durchlaufen aber mit Werten, die irgendwo her kommen für mich aber nicht nachvollziehbar sind.
Eine Bsp Datei konnte ich nicht erstellen, da der Fehler dort nicht auftritt.
Ich hoffe das aus diesem Ganzen jemand schlau wird und mir helfen kann.
Schönen Gruß
Friedhelm

Bild

Betrifft: Da musst du wohl einiges überprüfen, ...
von: Luc:-?
Geschrieben am: 23.06.2015 21:54:18
…Friedhelm:
1. Ist Tabelle1 immer noch das relevante Blatt?
2. Sind evtl alle Zellen sichtbar? Dann gibt's nur eine Area.
3. Für ArData wdn 2 Spalten ab Spalte 2 eines zusammenhängenden Bereichs sichtbarer Zellen festgelegt. Hat sich die strukturelle Organisation der sichtbaren Zellen durch das Einfügen einer Spalte verändert? Nebenbei, das Pgm nutzt primär das ganze Blatt, insofern kann das Einfügen Auswirkungen haben.
4. Wenn der Autofilter sichtbare Zellen findet, sollte unmittelbar nach Schleifenstart rng nicht Nothing sein; nach Schleifenende wird rng aber automatisch auf Nothing gesetzt.
5. Es kann sein, dass das Pgm 2× abgearbeitet wird. Das könnte mit der Calc-Engine ab Xl10/XP zusammenhängen. Unter Xl12/2007 habe ich das bei Fktt beobachten können, wobei hier zuerst auch mit leeren Werten agiert wurde. Evtl liegt das aber auch an eingestellter Iteration.
Fazit: Was nun tatsächlich los ist, kann ich so nicht feststellen. Evtl kommen dem Pgm Berechnungen in die Quere.
Tipp: Versuche es mal mit abgeschalteter Berechnungsautomatik.
Gruß, Luc :-?

Besser informiert mit …

Bild

Betrifft: AW: Da musst du wohl einiges überprüfen, ...
von: Friedhelm
Geschrieben am: 23.06.2015 23:04:43
Hallo Luc,
danke für deine Hife.
zu 1: das richtige Tabellenblatt ist es geblieben.
zu 2: Die Spalten AC - AG sind ausgeblendet. Ich habe sie eingeblendet und es läuft.
Hier scheint der Fehler zu liegen. Gibt es einen Unterschied wenn die Spalten auf 0 Pixel gestellt wird oder ausgeblendet wird? Wenn ich die Spalten auf 1 Pixel stelle läuft es richtig.
Friedhelm

Bild

Betrifft: AW: Da musst du wohl einiges überprüfen, ...
von: Werner
Geschrieben am: 23.06.2015 23:28:12
Hallo Friedhelm,
wenn es an den ausgeblendeten Spalten liegt, dann kannst du die Spalten zu Beginn deines Codes doch einblenden und nach Durchlauf des Codes wieder ausblenden.
Gruß Werner

Bild

Betrifft: AW: Unterschied zwischen ein- und ausgeblendet
von: Daniel
Geschrieben am: 24.06.2015 00:32:20
Hi
da ist schon ein Unterschied, ob du ausblendest oder nur die Pixelzahl sehr klein stellst.
schließlich arbeitest du mit .SpecialCells(xlcelltypevisible).Areas
wenn du nämlich auch Spalten zwischen drin ausblendest, ist hier eine Grenze für deine Areas.
dh wenn du AC:AG sichtbar hast bekommst du eine Area über alle Spalten, wenn du sie ausgeblendet hast, zwei Areas, eine für die Spalten A:AB und eine für die zur Tabelle gehörenden Spalten ab AF.
Gruß Daniel

Bild

Betrifft: AW: Tipp 2
von: Gerd L
Geschrieben am: 23.06.2015 22:28:25
Hallo Friedhelm,
lade doch eine Beispieldatei hoch.
Gruß Gerd

Bild

Betrifft: Sagt er doch - Fehler tritt da nicht auf, Gerd!
von: Luc:-?
Geschrieben am: 24.06.2015 03:51:40
Evtl ist die Mappe jetzt korrupt, Friedhelm,
und du musst sie reparieren bzw neu anlegen?! Mehrere Areas sieht Tinos Pgm jedenfalls in For Each vor…
Aus der Ferne ist da leider schlecht raten!
Morrn, Luc :-?

Bild

Betrifft: AW: Sagt er doch - Fehler tritt da nicht auf, Gerd!
von: Friedhelm
Geschrieben am: 24.06.2015 11:52:26
Hallo
vielen Dank an alle, die sich mit dem Thema beschäftigt haben.
Luc: Wenn die Mappe korrupt ist, wird irgendwann irgendwas nicht mehr richtig laufen. kann ich das irgendwie feststellen?
Lässt sich Tinos Pgm in For Each auf ein Area ändern? Ich möchte ja nur die Spalte D in gefilterter Form laden.
Werner: Das ist sicherlich auch eine Möglichkeit das Problem zu umgehen, vielen Dank für den Tip
Gruß Friedhelm

Bild

Betrifft: AW: Sagt er doch - Fehler tritt da nicht auf, Gerd!
von: Daniel
Geschrieben am: 24.06.2015 12:39:06
Hi
nur die gefilterte Spalte D:

For Each rng In Intersect(Tabelle1.AutoFilter.Range.EntireRow, Tabelle1.Columns(4)). _
SpecialCells(xlCellTypeVisible).Areas
damit enthält dann rng immer den nächsten sichtbaren Block aus Spalte D im Bereich des Autofilters.
Gruß Daniel

Bild

Betrifft: AW: Ach so
von: Gerd L
Geschrieben am: 25.06.2015 00:45:19
Hallo Friedhelm!

Sub D_im_Filter_sichtbar()
        
        Dim Re_Nr(), X As Range
        Dim a As Long, b As Long, n As Long
        
                
        Set X = Intersect(Tabelle1.Columns(4), Tabelle1.AutoFilter.Range)
               
        
        For a = X.Row + 1 To X.Rows.Count - X.Row + 1
        
            If Rows(a).Height > 0 Then
                ReDim Preserve Re_Nr(b)
                Re_Nr(b) = X.Cells(a, 1)
                b = b + 1
            End If
        
        Next
        
        
        'Ausgabe
        For n = LBound(Re_Nr) To UBound(Re_Nr)
            MsgBox Re_Nr(n)
        Next n
        
        Set X = Nothing
End Sub
Gruß Gerd

 Bild

Beiträge aus den Excel-Beispielen zum Thema "Speicherort der PDF mit Msgbox ausgeben"