ID tematu: 1832
 |
23. Ostatni wiersz |
| Autor |
Wiadomość |
toxic
Excel Expert

Posty: 357
|
Wysłany: 2007-06-29, 00:05 23. Ostatni wiersz
|
|
|
Przy bardzo wielu makrach konieczne jest odnalezienie ostatniej komórki w danej kolumnie wypełnionej danymi.
Jeśli obszar jest spójny (nie ma pustych komórek w środku, wystraczy (tu dla kolumny A):
| Kod: |
ostatnia = Range("A1").End(xlDown)
|
Jeśli pomiędzy wypełnionymi obszarami istnieją przerwy można wykorzystać następujący kod:
| Kod: |
ostatnia = WorksheetFunction.CountA(Columns(1))
If ostatnia <> 0 Then ostatnia = Columns(1).Find(What:="*", After:=Cells(1, 1), _
SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
|
Wyznaczenie ostatniej komórki może być przydatne np do określenia, gdzie mają być wpisywane kolejne dane. Wystarczy wtedy przejść do kolejnego rzędu:
| Kod: | pierwsza_pusta = ostatnia.offset(1,0)
|
|
|
 | ID posta:
9185
|
|
|
 |
|
EXCELFORUM.pl POLECA - Bezplatne triki prosto na skrzynke email
|
waldek_r
słuchacz

Posty: 5
|
Wysłany: 2007-08-02, 15:58
|
|
|
W jaki sposób zmodyfikować powyższy kod, aby móc wyszukać Ostatni wiersz w dowolnym Arkuszu.
Np. kod makro przypisany jest do Arkusza1 i chcemy dowiedzieć się, jaki jest ostatni wiersz w Arkusz2.
[ Dodano: 2007-08-02, 16:04 ]
Rozwiązanie okazało się proste:
| Kod: | ostatnia = WorksheetFunction.CountA(Sheets(3).Columns())
If ostatnia <> 0 Then ostatnia = Sheets(3).Columns().Find(What:="*", After:=Cells(1, 1), _
SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row |
|
_________________ --
Poznaję Excela |
|
 | ID posta:
11531
|
|
|
 |
|
EXCELFORUM.pl POLECA - Bezplatne triki prosto na skrzynke email
|
Piotr_Korbicz
Excel Expert

Posty: 534
|
Wysłany: 2007-12-22, 15:01
|
|
|
rozwiązanie
| Kod: | | ostatnia = Range("A1").End(xlDown) |
to nic innego jak wykonanie ruchu klawiaturowego CTRL + strzałka w dół
Lecz zdarza się, że Excel głupieje i zamiast do ostatniej wypełnionej komórki po wykonaniu tego ruchu przechodzi na koniec arkusza - do ostatniego wiersza
Ja stosują zamiennie nastepujące rozwiązania:
1. Jeśli dane mają formę lisy (nie ma między nimi pustych wierszy)
| Kod: | | ostatnia = Range("A1").CurrentRegion.Rows.Count |
2. Jeśli dane mają nieciekawą formę
| Kod: | | ostatnia = Range("A1").UsedRange.Rows.Count |
|
|
 | ID posta:
22985
|
|
|
 |
LAnd
Excel Expert

Posty: 609
|
Wysłany: 2007-12-22, 16:28
|
|
|
CurrentRegion - zgłosi błąd w chronionym arkuszu
UsedRange - obejmie puste komórki ale ze sformatowanym np. obramowaniem
metoda Find "zawija" obszar przeszukiwany i poprzednia komórka ( xlPrevious ) dla pierwszej komórki zakresu Zakres.Cells(1,1) poprzednią komórką będzie ostatnia komórka tego zakresu ( prawa dolna ) i od niej rozpocznie się przeszukiwanie wierszami ( xlByRows ) od końca ( xlPrevious ) każdego wiersza
| Kod: | Function OstatniWierszNiePusty(Zakres As Range) As Long
On Error Resume Next 'jeżeli arkusz będzie pusty
With Zakres
OstatniWierszNiePusty= .Find("*", .Cells(1, 1), xlValues, xlWhole, xlByRows, xlPrevious).Row
End With
On Error GoTo 0
End Function |
|
_________________ Wspólnymi siłami wyjaśnimy wszystko, a potem resztę (http://paradowska.blog.polityka.pl/?p=250#comment-73024)
Hominis est errare, insipientis in errore perseverare |
|
 | ID posta:
22987
|
|
|
 |
|
EXCELFORUM.pl POLECA - Bezplatne triki prosto na skrzynke email
|
Lukasz
słuchacz

Posty: 7
|
Wysłany: 2008-04-30, 15:14
|
|
|
lub:
| Kod: | | ostatnia_niepusta = Range("A65536").End(xlUp).Row |
Zaletą tego jest że nie "przeszkadzają" blanki w środku kolumny - po prostu łapie ostatni niepusty.
Edit: dotyczy Excela w wersji do 2003 |
|
 | ID posta:
34530
|
|
|
 |
Trebor
Excel Expert

Posty: 2319
|
Wysłany: 2008-04-30, 17:58
|
|
|
| Lukasz napisał/a: | | po prostu łapie ostatni niepusty. |
Niezupełnie. Łapie ostatni widoczny wiersz, przy założeniu posiadania 65536 wierszy i pustej komórce w kolumnie A w wierszu 65536.
Co to oznacza?
Jeśli "po drodze" będą ukryte wiersze z zapełnionymi komórkami, to nie zostaną one ujawnione
Komórka z której startujesz musi być sprawdzona osobno (czy nie jest zapisana).
Każdą kolumnę musisz sprawdzać osobno.
Pozdrawiam |
_________________ Trebor |
|
 | ID posta:
34543
|
|
|
 |
|
EXCELFORUM.pl POLECA - Bezplatne triki prosto na skrzynke email
|
iskandir
Starszy Forumowicz


Posty: 28
|
Wysłany: 2010-10-17, 22:39
|
|
|
Ostatnio mialem z tym niezly problem przy imporcie danych z Accessa - znalazlem fajne rozwiazanie. Otoz gdy importujemy z Accessa, to Excel automatycznie tworzy tabele. Tabela ta ma wlasciowosc .count. Wystarczy liczbe zwrocona podzielic przez liczbe kolumn i mamy liczbe wierszy. I nie daje sie zwiesc jakims tam pustym wierszom :)
Moze komus sie kiedys przyda.
Pozdrawiam |
|
 | ID posta:
98008
|
|
|
 |
Szarkiz
Exceloholic

Posty: 153
|
Wysłany: 2010-10-21, 09:23
|
|
|
| Kod: |
Dim ostatniPelnyWiersz as Long
ostatniPelnyWiersz = Activesheet.Range("B1").End(xlDown).Row
|
ma podstawowową wadę. Jeżeli jedynym wypełnionym wierszem będzie wiersz pierwszy (np. szukamy pierwszej wolnej komórki w kolumnie B ) i w B1 bedzie cokolwiek wpisane efektem powyższego kodu bedzie ostatni wiersz arkusza: dla Ex2003 wartosc 65536, dla Ex2007: 1048576.
Zamiast szukac ostatniego wypełnionego od góry lepiej poszukać pierwszego pełnego od dołu.
| Kod: |
Activesheet.Range("B" & activesheet.Rows.Count).End(xlUp).Row
|
wydaje sie być uniwersalniejszym rozwiązaniem. |
|
 | ID posta:
98279
|
|
|
 |
|
EXCELFORUM.pl POLECA - Bezplatne triki prosto na skrzynke email
|
chips
Exceloholic


Posty: 242
|
Wysłany: 2010-10-25, 13:36
|
|
|
| Szarkiz napisał/a: | | Kod: |
Dim ostatniPelnyWiersz as Long
ostatniPelnyWiersz = Activesheet.Range("B1").End(xlDown).Row
|
|
Podoba mi się to rozwiązanie. Tylko jak zamienić "B1" na zmienną? Czyli gdy kolumna nie jest stale okreslona. |
_________________ Pozdrawiam. CHIPS |
|
 | ID posta:
98566
|
|
|
 |
Szarkiz
Exceloholic

Posty: 153
|
Wysłany: 2010-10-25, 14:13
|
|
|
| chips napisał/a: |
Podoba mi się to rozwiązanie. Tylko jak zamienić "B1" na zmienną? Czyli gdy kolumna nie jest stale okreslona. |
to zależy jaka pętla jest źródłem informacji o zmiennej kolumnie.
1. jesli w efekcie pętli czy dowolnej metody wyboru symbolem kolumny jest po prostu jej oznaczenie literowe (np: "A", "B", "ZZ"), uzwasz intuicyjnej skladni:
| Kod: |
dim symbol_kolumny as string
dim ostatni_pelny as long
symbol_kolumny = "A"
ostatni_pelny = obiekt_arkusza.Range(symbol_kolumny & obiekt_arkusza.Rows.Count).End(xlUp).Row
|
2. jeśli w efekcie pętli lub dowolnej metody wyboru/przypisania otrzymujesz numer kolumny, czyli jej kolejne miejsce w arkuszu (np: 1, 23, 100) wtedy:
| Kod: |
dim nr_kolumny as long
dim ostatni_pelny as long
nr_kolumny = 3
ostatni_pelny = obiekt_arkusza.cells(obiekt_arkusza.Rows.Count, nr_kolumny).End(xlUp).Row
|
|
|
 | ID posta:
98573
|
|
|
 |
|
EXCELFORUM.pl POLECA - Bezplatne triki prosto na skrzynke email
|
bodek


Posty: 1679
|
|
 | ID posta:
98930
|
|
|
 |
|
|