Excel-VBA: Nächste sichtbare Zeile bearbeiten
Ich muss z.T. große Dateien mit VBA bearbeiten, wobei oftmals mehrer 10.000 Datensätze ausgeblendet sein können. Diese müssen nicht bearbeitet werden.
Bisher habe ich die nächste zu verarbeitende Zeile gesucht, indem ich alle ausgeblendeten Zeilen per Schleife ignoriert habe (If ActiveSheet.Rows(_ExcelRow).EntireRow.Hidden). Dies kann bei 30.000 Sätzen aber schon mal eine ganze Weile dauern. Gibt es stattdessen eine elegantere Methode? Sendkeys("{Down}") funktioniert bei mir nicht, wenn Excel minimiert ist.
3 Antworten
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.
Danke euch beiden, das schaut vielversprechend aus. Damit werde ich jetzt weiter arbeiten.
@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.
@maximilianus:
DH!Super Idee, das mit "For each" abzuarbeiten.
Dieser "Zündfunke* hat mir gefehlt.
Ich denke jetzt habe ich es ganz gut hinbekommen.
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.
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.
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.
@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
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: