Excel-VBA: Nächste sichtbare Zeile bearbeiten

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Ich habe da mal was auf die Schnelle zusammengefummelt:

Sub Down()
Dim Sichtbar As Range
Dim Adresse As String

Set Sichtbar = ActiveCell.SpecialCells(xlCellTypeVisible)
Adresse = Sichtbar.Address
Adresse = Right(Adresse, Len(Adresse) - 1 - InStr(Adresse, ","))
Adresse = Left(Adresse, InStr(Adresse, ":") - 1)
Cells(Adresse, ActiveCell.Column).Select
End Sub

Das funktioniert SO aber nur, wenn nur EIN Bereich ausgeblendet ist.
Falls es mehrere Bereiche sind, müsstest Du den String Adresse wohl noch etwas aufwendiger bearbeiten.
Außerdem müssten da wohl noch Fehler abgefangen werden.

Das Ganze gefällt mir sowieso nicht wirklich, weil es irgendwie "von hintern durch die Brust ins Herz" ist.
Aber vielleicht fällt Dir ja nochwas ein, wie man das mithilfe von
SpecialCells(xlCellTypeVisible)
direkter und eleganter lösen kann.
Ich bin noch nicht darauf gekommen.

Woher ich das weiß:Berufserfahrung – IT-Administrator (i.R.)
maximilianus7  28.12.2014, 16:59

oops, das mit den xlCellTypeVisible kannte ich nicht.

hab aber da noch was gefunden: http://excelribbon.tips.net/T008524_Selecting_Visible_Cells_in_a_Macro.html

also vielleicht:

columns("A").Select
Selection.SpecialCells(xlCellTypeVisible).Select
for each cell in Selection
  ' cell.row liefert die row number 
next cell
3
Sapex22 
Fragesteller
 29.12.2014, 10:51
@maximilianus7

Danke euch beiden, das schaut vielversprechend aus. Damit werde ich jetzt weiter arbeiten.

0
Oubyi, UserMod Light  29.12.2014, 11:18
@Sapex22

@Sapex22:

Damit werde ich jetzt weiter arbeiten.

Genau DAS habe ICH gerade gemacht und bin (leider ein paar Minuten zu spät) auf diese Lösung gekommen:

Sub Down()
Dim Sichtbar As Range
Dim Zelle As Range
Dim Zeile As Long

Set Sichtbar = Range(Cells(ActiveCell.Row, 1), _
    Cells(UsedRange.Rows.Count, 1)).SpecialCells(xlCellTypeVisible)
Zeile = ActiveCell.Row - 1

For Each Zelle In Sichtbar
    If Zelle.Row <> Zeile + 1 Then
        Zelle.Select
        Exit For
    End If
    Zeile = Zelle.Row
Next Zelle
End Sub

Ich hoffe Du siehst es noch rechtzeitig.
Das sollte von der aktiven Zelle aus jeweils die erste Zelle im nächsten sichtbaren BLOCK selektieren (ohne die unsichtbaren Zellen abzuarbeiten). Teste mal genau.

0
Oubyi, UserMod Light  29.12.2014, 11:26
@Sapex22

@maximilianus:

DH!

Super Idee, das mit "For each" abzuarbeiten.
Dieser "Zündfunke* hat mir gefehlt.
Ich denke jetzt habe ich es ganz gut hinbekommen.

0
Sapex22 
Fragesteller
 29.12.2014, 13:16
@Sapex22
Super Idee, das mit "For each" abzuarbeiten.

Dem kann ich mich nur anschließen. Allerdings benötige ich "den nächsten sichtbaren Block" gar nicht. Ich will einfach nur alle sichtbaren Zellen in allen Blocks abarbeiten. Und dafür ist die Lösung von @maximilianus bereits völlig ausreichend und für meine Problemstellung genau das Richtige.

Nochmals Dank an euch beide.

0

also das sind dann auch grosse ausgeblendete Blöcke. du kannst auch ganze ranges auf hidden abfragen. versuch mal mit einer äußeren schleife 500er-blöcke zu testen. wenn ein block not hidden ist dann eine innere schleife über den aktuellen block.

wenn das die zeit reduziert, kannst du ja die block-grösse variabel gestalten und damit experimentieren. vielleicht ist auch ein 3. schleifen-level sinnvoll.

Sapex22 
Fragesteller
 29.12.2014, 09:52

Hallo maximilianus7,

zunächst ein dickes DANKE für deinen Vorschlag. Der ist genial einfach. Leider funktioniert er bei mir nicht. Excel liefert immer TRUE, sobald die erste Zeile des Blocks ausgeblendet ist. Alle anderen interessieren ihn nicht. Schade, das wäre genau die Lösung gewesen, die ich hätte brauchen können.

0

@Maximilianus7: Es geht natürlich auch ohne das ungeliebte Select (Bildschirmflackern):

Sub Visible_Only()
'Nur sichtbare Zellen eines Bereiches bearbeiten
Dim CheckRange As Range
Dim CheckCell As Range
Dim RangeVisible As Range

'Bereich festlegen
Set CheckRange = Range("A1:A28")


'Nur die sichtbaren wählen
Set RangeVisible = CheckRange.SpecialCells(xlCellTypeVisible)

'Nun bearbeiten
For Each CheckCell In RangeVisible
    Cells(CheckCell, 2) = "A"  ' beispielhaft!! setzt ein A neben die sichtbare Zelle in A

    ' CheckCell.row liefert die row number
Next CheckCell
End Sub