Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

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
Antworten 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
Antworten Top
#3
Code:
Sub Unterprogramm()
ActiveCell.Offset(1, 0).Select  
If ActiveCell.EntireRow.Hidden Then Unterprogramm
End Sub
Antworten Top
#4
Hallo,

Du könntest auch direkt die sichtbaren Zellen ansprechen:

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

Gruß Uwe
Antworten 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?
Antworten 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
Antworten 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!
Antworten 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
Antworten 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!)
Antworten 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)
Antworten Top


Gehe zu:


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