Discussion:
Erste und Letzte Zelle in einem gefilterten Bereich
(zu alt für eine Antwort)
Ernst Baumann
2004-07-10 08:17:42 UTC
Permalink
Hallo,

für bestimmte Manipulationen soll in einem Sheet über die Autofilter -
Funtion ein Bereich gefiltert werden.
Es können also alle vorhanden Spalten in Frage kommen
Über eine VBA Routine sollen Zellen berechnet werden , aktuallisiert
werden.
Ich suche also eine Funktion die mir die Erst und Letzte Zelle ermittelt
bzw damit dann die VBA Routine durch laufen kann .

For I = ertseZelle to LetzeZelle
....
....
Next I

natürlich mit der "wahren" Zelladressen

Gruss

Ernst
Frank Kabel
2004-07-10 08:34:53 UTC
Permalink
Hi Ernst
eine Möglichkeit ist, alle Zeilen zu durchlaufen und die 'hidden'
Eigenschaft prüfen. Also z.B.: wie folgt:
sub foo()
dim lastrow as long
dim row_index as long
with activesheet
LastRow = .Cells(Rows.Count, "A").End(xlUp).Row
For Row_Index = 2 To LastRow
if .rows(row_index).hidden then
'Deine Berechnung/Bearbeitung
end if
next
end with
end sub


--
Regards
Frank Kabel
Frankfurt, Germany
Post by Ernst Baumann
Hallo,
für bestimmte Manipulationen soll in einem Sheet über die
Autofilter -
Post by Ernst Baumann
Funtion ein Bereich gefiltert werden.
Es können also alle vorhanden Spalten in Frage kommen
Über eine VBA Routine sollen Zellen berechnet werden , aktuallisiert
werden.
Ich suche also eine Funktion die mir die Erst und Letzte Zelle
ermittelt bzw damit dann die VBA Routine durch laufen kann .
For I = ertseZelle to LetzeZelle
....
....
Next I
natürlich mit der "wahren" Zelladressen
Gruss
Ernst
Ernst Baumann
2004-07-10 09:03:43 UTC
Permalink
Danke Frank ,

Das Funktioniert !
Aber , ein aber gibt es.
Angenommen ich habe 5000 Zeilen und filtere 50 Zeilen raus
Dann durchläuft das jedes mal die 5000. Das kostet Zeit!
Aber der Ansatz ist gut. Muss mal weiter nachdenken.

Gruss
Ernst
Post by Frank Kabel
Hi Ernst
eine Möglichkeit ist, alle Zeilen zu durchlaufen und die 'hidden'
sub foo()
dim lastrow as long
dim row_index as long
with activesheet
LastRow = .Cells(Rows.Count, "A").End(xlUp).Row
For Row_Index = 2 To LastRow
if .rows(row_index).hidden then
'Deine Berechnung/Bearbeitung
end if
next
end with
end sub
--
Regards
Frank Kabel
Frankfurt, Germany
Post by Ernst Baumann
Hallo,
für bestimmte Manipulationen soll in einem Sheet über die
Autofilter -
Post by Ernst Baumann
Funtion ein Bereich gefiltert werden.
Es können also alle vorhanden Spalten in Frage kommen
Über eine VBA Routine sollen Zellen berechnet werden , aktuallisiert
werden.
Ich suche also eine Funktion die mir die Erst und Letzte Zelle
ermittelt bzw damit dann die VBA Routine durch laufen kann .
For I = ertseZelle to LetzeZelle
....
....
Next I
natürlich mit der "wahren" Zelladressen
Gruss
Ernst
Frank Kabel
2004-07-10 09:19:06 UTC
Permalink
Hi Ernst
evtl. beschreibst Du noch mal kurz, was du mit den gefilterten Daten
anfangen möchtest. Wenn du Sie nur kopieren willst, geht es natürlich
deutlich einfacher

--
Regards
Frank Kabel
Frankfurt, Germany
Post by Ernst Baumann
Danke Frank ,
Das Funktioniert !
Aber , ein aber gibt es.
Angenommen ich habe 5000 Zeilen und filtere 50 Zeilen raus
Dann durchläuft das jedes mal die 5000. Das kostet Zeit!
Aber der Ansatz ist gut. Muss mal weiter nachdenken.
Gruss
Ernst
Post by Frank Kabel
Hi Ernst
eine Möglichkeit ist, alle Zeilen zu durchlaufen und die 'hidden'
sub foo()
dim lastrow as long
dim row_index as long
with activesheet
LastRow = .Cells(Rows.Count, "A").End(xlUp).Row
For Row_Index = 2 To LastRow
if .rows(row_index).hidden then
'Deine Berechnung/Bearbeitung
end if
next
end with
end sub
--
Regards
Frank Kabel
Frankfurt, Germany
Post by Ernst Baumann
Hallo,
für bestimmte Manipulationen soll in einem Sheet über die
Autofilter -
Post by Ernst Baumann
Funtion ein Bereich gefiltert werden.
Es können also alle vorhanden Spalten in Frage kommen
Über eine VBA Routine sollen Zellen berechnet werden ,
aktuallisiert werden.
Ich suche also eine Funktion die mir die Erst und Letzte Zelle
ermittelt bzw damit dann die VBA Routine durch laufen kann .
For I = ertseZelle to LetzeZelle
....
....
Next I
natürlich mit der "wahren" Zelladressen
Gruss
Ernst
Ernst Baumann
2004-07-10 10:09:20 UTC
Permalink
Also Frank
Es geht um eine Liste die automatisiert mit Werten gefüllt wird.
Messwerte, die einmal erfasst werden , blöd gemischt erfasst. ( Lach nicht,
z.B. weise und braune Eier
gestempelt und ungestempelt ).
Wertabhängig werden nach einer bestimmten Brechnungsroutine weitere Spalten
im Sheet gleich beim einlesen berechnet.
Bei bestimmten Grenzwerten gelten die Brechnungformel nicht, dort müssen
Manuell oder später über eine weitere Routine
die fehlenden Werte gesetzt werden. Das Problem ist das die Routine dann
gefiltert laufen muss. (Alte Werte dürfen nicht verändert werden).
Das geht zwar, würde aber heisen es müssen alle 4000 durch laufen werden.
Normalerweise macht man sowas mit einer Datenbank, nachteilig ist dort die
Bearbeitung die nun mal Excel hat
Aufüllen... Farblich kennlich machen....
Derzeitig werden etwa 4000 Zeilen in 2 min erfasst und berechnet. Es kann
nicht im voraus gesagt werden
ob 10 oder 50 % der Daten nachbearbeitet werden müssen.
Ich denke noch nach.

Gruss

Ernst

PS: Wenn das Wetter besser ist geh ich erst mal an die Luft, den Kopf klar
machen.
Post by Frank Kabel
Hi Ernst
evtl. beschreibst Du noch mal kurz, was du mit den gefilterten Daten
anfangen möchtest. Wenn du Sie nur kopieren willst, geht es natürlich
deutlich einfacher
--
Regards
Frank Kabel
Frankfurt, Germany
Post by Ernst Baumann
Danke Frank ,
Das Funktioniert !
Aber , ein aber gibt es.
Angenommen ich habe 5000 Zeilen und filtere 50 Zeilen raus
Dann durchläuft das jedes mal die 5000. Das kostet Zeit!
Aber der Ansatz ist gut. Muss mal weiter nachdenken.
Gruss
Ernst
Post by Frank Kabel
Hi Ernst
eine Möglichkeit ist, alle Zeilen zu durchlaufen und die 'hidden'
sub foo()
dim lastrow as long
dim row_index as long
with activesheet
LastRow = .Cells(Rows.Count, "A").End(xlUp).Row
For Row_Index = 2 To LastRow
if .rows(row_index).hidden then
'Deine Berechnung/Bearbeitung
end if
next
end with
end sub
--
Regards
Frank Kabel
Frankfurt, Germany
Post by Ernst Baumann
Hallo,
für bestimmte Manipulationen soll in einem Sheet über die
Autofilter -
Post by Ernst Baumann
Funtion ein Bereich gefiltert werden.
Es können also alle vorhanden Spalten in Frage kommen
Über eine VBA Routine sollen Zellen berechnet werden ,
aktuallisiert werden.
Ich suche also eine Funktion die mir die Erst und Letzte Zelle
ermittelt bzw damit dann die VBA Routine durch laufen kann .
For I = ertseZelle to LetzeZelle
....
....
Next I
natürlich mit der "wahren" Zelladressen
Gruss
Ernst
Frank Kabel
2004-07-10 10:55:51 UTC
Permalink
Hi Ernst
ich sehe da dann wenig Chancen außer alle Zeilen zu durchlaufen. Was es
in der Regel schneller macht ist z.B.:
application.screenupdating=false
am Anfang der Routine und
application.screenupdating=true
am ende

--
Regards
Frank Kabel
Frankfurt, Germany
Post by Ernst Baumann
Also Frank
Es geht um eine Liste die automatisiert mit Werten gefüllt wird.
Messwerte, die einmal erfasst werden , blöd gemischt erfasst. ( Lach
nicht, z.B. weise und braune Eier
gestempelt und ungestempelt ).
Wertabhängig werden nach einer bestimmten Brechnungsroutine weitere
Spalten im Sheet gleich beim einlesen berechnet.
Bei bestimmten Grenzwerten gelten die Brechnungformel nicht, dort
müssen Manuell oder später über eine weitere Routine
die fehlenden Werte gesetzt werden. Das Problem ist das die Routine
dann gefiltert laufen muss. (Alte Werte dürfen nicht verändert
werden).
Das geht zwar, würde aber heisen es müssen alle 4000 durch laufen
werden. Normalerweise macht man sowas mit einer Datenbank, nachteilig
ist dort die Bearbeitung die nun mal Excel hat
Aufüllen... Farblich kennlich machen....
Derzeitig werden etwa 4000 Zeilen in 2 min erfasst und berechnet. Es
kann nicht im voraus gesagt werden
ob 10 oder 50 % der Daten nachbearbeitet werden müssen.
Ich denke noch nach.
Gruss
Ernst
PS: Wenn das Wetter besser ist geh ich erst mal an die Luft, den Kopf
klar machen.
Post by Frank Kabel
Hi Ernst
evtl. beschreibst Du noch mal kurz, was du mit den gefilterten Daten
anfangen möchtest. Wenn du Sie nur kopieren willst, geht es
natürlich
Post by Ernst Baumann
Post by Frank Kabel
deutlich einfacher
--
Regards
Frank Kabel
Frankfurt, Germany
Post by Ernst Baumann
Danke Frank ,
Das Funktioniert !
Aber , ein aber gibt es.
Angenommen ich habe 5000 Zeilen und filtere 50 Zeilen raus
Dann durchläuft das jedes mal die 5000. Das kostet Zeit!
Aber der Ansatz ist gut. Muss mal weiter nachdenken.
Gruss
Ernst
Post by Frank Kabel
Hi Ernst
eine Möglichkeit ist, alle Zeilen zu durchlaufen und die 'hidden'
sub foo()
dim lastrow as long
dim row_index as long
with activesheet
LastRow = .Cells(Rows.Count, "A").End(xlUp).Row
For Row_Index = 2 To LastRow
if .rows(row_index).hidden then
'Deine Berechnung/Bearbeitung
end if
next
end with
end sub
--
Regards
Frank Kabel
Frankfurt, Germany
Post by Ernst Baumann
Hallo,
für bestimmte Manipulationen soll in einem Sheet über die
Autofilter -
Post by Ernst Baumann
Funtion ein Bereich gefiltert werden.
Es können also alle vorhanden Spalten in Frage kommen
Über eine VBA Routine sollen Zellen berechnet werden ,
aktuallisiert werden.
Ich suche also eine Funktion die mir die Erst und Letzte Zelle
ermittelt bzw damit dann die VBA Routine durch laufen kann .
For I = ertseZelle to LetzeZelle
....
....
Next I
natürlich mit der "wahren" Zelladressen
Gruss
Ernst
Melanie Breden
2004-07-10 11:34:15 UTC
Permalink
Hallo Frank,
Post by Frank Kabel
ich sehe da dann wenig Chancen außer alle Zeilen zu durchlaufen.
warum lässt du '.SpecialCells(xlCellTypeVisible)' völlig ausser Acht?

Das ist doch die Chance, nur die sichtbaren Zeilen zu durchlaufen.

--
Mit freundlichen Grüssen

Melanie Breden
- Microsoft MVP für Excel -

http://excel.codebooks.de (Das Excel-VBA Codebook)
#Excel-Auftragsprogrammierung#
Frank Kabel
2004-07-10 11:42:01 UTC
Permalink
Hi Melanie
hatte ich auch dran gedacht, würde ich z.B.: auch sofort beim Kopieren
der Daten nutzen. Finde es aber eher umständlich (auch wenn es
wahrscheinlich performanter ist), mit mehren Areas zu arbeiten, wenn
ich jede einzelne Zeile bearbeiten will (d.h. zwei Schleifen nutzen
muss) :-)
Aber grundsätzlich hast Du natürlich recht !

Schönes Wochenede (auch wenn wir hier im Rheim-Main Gebiet nicht
wirklich gutes Wetter haben...)


--
Regards
Frank Kabel
Frankfurt, Germany
Post by Melanie Breden
Hallo Frank,
Post by Frank Kabel
ich sehe da dann wenig Chancen außer alle Zeilen zu durchlaufen.
warum lässt du '.SpecialCells(xlCellTypeVisible)' völlig ausser Acht?
Das ist doch die Chance, nur die sichtbaren Zeilen zu durchlaufen.
Melanie Breden
2004-07-10 09:46:50 UTC
Permalink
Hallo Ernst,
Post by Ernst Baumann
für bestimmte Manipulationen soll in einem Sheet über die Autofilter -
Funtion ein Bereich gefiltert werden.
Es können also alle vorhanden Spalten in Frage kommen
Über eine VBA Routine sollen Zellen berechnet werden , aktuallisiert
werden.
Ich suche also eine Funktion die mir die Erst und Letzte Zelle ermittelt
bzw damit dann die VBA Routine durch laufen kann .
For I = ertseZelle to LetzeZelle
....
....
Next I
mit der SpecialCells-Methode kann man die sichtbaren Zellen an eine Range-Variable
übergeben.

Bei einer Filterung bestehen meistens mehrere Areas innerhalb des Bereichs.
Diese müssen einzeln durchlaufen werden.

Versuche mal folgende Prozedur dazu:

Sub FilterZeilen()
Dim rngFilter As Range
Dim rngArea As Range
Dim lngRow As Long

' Bereich der sichtbaren Zellen ohne Überschriftenzeile ermitteln
With ActiveSheet.UsedRange
Set rngFilter = .Offset(1, 0).Resize(.Rows.Count - 1, 1) _
.SpecialCells(xlCellTypeVisible)
End With

For Each rngArea In rngFilter
For lngRow = 1 To rngArea.Rows.Count
' sichtbare Zeile in Filterung
Debug.Print rngArea.Row
' Zelladresse der ersten Spalte
Debug.Print rngArea.Cells(lngRow, 1).Address
Next lngRow
Next rngArea
End Sub

--
Mit freundlichen Grüssen

Melanie Breden
- Microsoft MVP für Excel -

http://excel.codebooks.de (Das Excel-VBA Codebook)
#Excel-Auftragsprogrammierung#
Ernst Baumann
2004-07-10 13:29:05 UTC
Permalink
Spitze !
Ja , wenn man kann. Ist es gaaaanz einfach.
Irgendwie mit den SpecialCells schwebte mir auch was vor, nur
die einfach in ne Range-Variable zustecken, da muss Mann erstmal drauf
kommen.
Daran hatte ich ehrlich nicht gedacht.
Diese Function von Melanie kommt in mein Goldenes Büchlein. ( Genial).
Komisch ich habe ne Menge Bücher, aber wenn ich es nicht selbst reinschreibe
finde ich sowas nicht. Über diese Uni-Function lässt sich eine Menge in
berechneten Zellen
Danke, nochmal Melanie.

Ein sonniges Wochenend
wünscht
allen
Ernst
Melanie Breden
2004-07-10 14:42:07 UTC
Permalink
Hallo Ernst,
Post by Ernst Baumann
Spitze !
finde ich auch, und um einiges schneller als die Hidden-Abfrage :-)
Post by Ernst Baumann
Ja , wenn man kann. Ist es gaaaanz einfach.
Irgendwie mit den SpecialCells schwebte mir auch was vor, nur
die einfach in ne Range-Variable zustecken, da muss Mann erstmal drauf
kommen.
die SpecialCells-Methode alleine ist es nicht.
Um die Überschriftenzeile auszugrenzen habe ich den UsedRange mit der
Offset-Eigenschaft um eine Zeile nach unten verschoben.
Damit dann unten nicht eine Zeile zuviel ist, den Bereich mit der
Resize-Eigenschaft wieder um eine Zeile gekürzt.
Post by Ernst Baumann
Daran hatte ich ehrlich nicht gedacht.
Diese Function von Melanie kommt in mein Goldenes Büchlein. ( Genial).
Komisch ich habe ne Menge Bücher, aber wenn ich es nicht selbst reinschreibe
finde ich sowas nicht.
Mein Buch ist zwar nicht golden, aber es stehen auch jede Menge
nützliche Tipps drin :-)
Post by Ernst Baumann
Über diese Uni-Function lässt sich eine Menge in
berechneten Zellen
Danke, nochmal Melanie.
Bittesehr, ist gern geschehen :-)
Post by Ernst Baumann
Ein sonniges Wochenend
wünscht
allen
Ernst
dein Wunsch ist prompt in Erfüllung gegangen, die Sonne lässt sich gerade blicken.

--
Mit freundlichen Grüssen

Melanie Breden
- Microsoft MVP für Excel -

http://excel.codebooks.de (Das Excel-VBA Codebook)
#Excel-Auftragsprogrammierung#

Lesen Sie weiter auf narkive:
Loading...