Wir wünschen allen Forenteilnehmern ein frohes Fest und einen guten Rutsch ins neue Jahr. x

Alternative für rekursiven Programmaufruf gesucht
#1
Hallo liebe VBA Gemeinde,

ich habe ein kleines Programm zum Navigieren in Excel-Zellen geschrieben. Ausgeblendete
Zeilen werden dabei durch rekursiven Programmaufruf mittels Verwendung eines GoTo Befehls beim Aufruf der Programmroutine Unterprogramm() übersprungen. Hat jemand eine Idee wie man so etwas besser, noch schneller lösen kann? Irgendeinen programmierbaren Einzeiler?

Code:
Sub Unterprogramm()
Nochmal:
ActiveCell.Offset(1, 0).Select  
If ActiveCell.EntireRow.Hidden Then GoTo Nochmal
End Sub
Top
#2
Hallo,

mal ohne Sprungmarke und nur einmal wird selektiert (ist aber ungetestet). Ob es schneller ist? Keine Ahnung.

Code:
Sub Unterprogramm()
   Dim lngZeile As Long
  
   lngZeile = ActiveCell.Row
  
   Do
      lngZeile = lngZeile + 1
   Loop While Rows(lngZeile).Hidden
   ActiveCell.Offset(lngZeile - ActiveCell.Row, 0).Select

End Sub
Gruß Stefan
Win 10 / Office 2016
Top
#3
Code:
Sub Unterprogramm()
ActiveCell.Offset(1, 0).Select  
If ActiveCell.EntireRow.Hidden Then Unterprogramm
End Sub
Top
#4
Hallo,

Du könntest auch direkt die sichtbaren Zellen ansprechen:

Code:
Sub SichtbareZellenMarkieren()
  ActiveCell.EntireColumn.SpecialCells(xlCellTypeVisible).Select
End Sub

Gruß Uwe
Top
#5
Hallo Uwe,

Dein Vorschlag würde mir schon super gefallen. Nur soll es ja so sein, das durch den Aufruf
Unterprogramm die nächste sichtbare Zeile ausgewählt wird. Wie und wo kriege ich
denn das Offset da rein oder wie baue ich deinen Einzeller sonstwie um?
Top
#6
Hallo,

so aus dem Zusammenhang gerissen und als "Unterprogramm" für keine Ahnung was für ein Hauptprogramm
sehe ich auch keinen Sinn in meinem Vorschlag. Wink

Gruß Uwe
Top
#7
Hallo Uwe,

ich formuliere nochmal anders. Ich habe die ganzen Code in einer Userform geschrieben, d.h.

1. mit ActiveCell.Offset(1,0).Select gehe ich eine Zeile vorwärts
2. da ich nun ausgeblendete Zeilen umgehen möchte mache ich ich so etwas durch Aufruf von Unterprogramm.

Sub Unterprogramm()
ActiveCell.Offset(1, 0).Select
If ActiveCell.EntireRow.Hidden Then Unterprogramm
End Sub

diese Routine löst die Angelegenheit dann durch rekursive Abarbeitung.

3. Jetzt die Preisfrage, gehts vielleicht nicht doch wenn man deine Programmzeile:
ActiveCell.EntireColumn.SpecialCells(xlCellTypeVisible).Select

irgendwie umbaut?

Das wäre dann ein schöner Einzeiler und noch eleganter!
Top
#8
Hallo,

schildere doch bitte einmal, was das Hauptprogramm macht / machen soll.

Wenn Du jedoch an der bisherigen Struktur mit Unterprogramm
festhalten willst, gibt es keinen Spielraum mehr.

Gruß Uwe
Top
#9
Hallo Uwe,
nein ich halte nicht an der kleinen Subroutine Unterprogramm fest.
Die Aufgabe ist einfach:
Es gibt in der Userform ein Textfeld und einen Commandbutton. Der CommandButton geht bei jedem Klick eine
Zeile vorwärts. Das TextFeld zeigt dann den Inhalt in der jeweilig selektierten ExcelZelle an.
(Diese simple Aufgabe wird natürlich hinterher in ein größeres Programm integriert, ist hier aber ohne Belang!)
Top
#10
Hallo julia,

mit diesem Ansatz gibt Dir Excel die Adressen der jeweils ersten sichtbaren Zelle aus. Beim Ausblenden ergeben sich für Excel intern sogenannte Areas, die man einzeln ansprechen kann.

Code:
Sub SichtbareBereiche()
'Variablendeklaration
'Integer
Dim iCnt%
'Mit den sichtbaren Zellen im Bereich A1:A10
With Range("A1:A10").SpecialCells(xlCellTypeVisible)
    'Schleife ueber die einzelnen sichtbaren Bereiche
    For iCnt = 1 To .Count
        'Ausgabe der Adresse der ersten Zelle im Bereich
        MsgBox .Areas(iCnt).Cells(1, 1).Address
    'Ende Schleife ueber die einzelnen sichtbaren Bereiche
    Next
'Ende Mit den sichtbaren Zellen im Bereich A1:A10
End With
End Sub
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste