Excel Forum - Porady, Pomoc,  Excel Help, Excel FAQ Strona Główna
 FAQ  RegulaminRegulamin  Szukaj   Użytkownicy   Grupy   Rejestracja   Profil   Twoje wiadomości   Zaloguj 


Poprzedni temat «» Następny temat
ID tematu: 1832 Skopiuj do schowka 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 Skopiuj do schowka
 
 

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 Skopiuj do schowka
 
 

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 Skopiuj do schowka
 
 
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 Skopiuj do schowka
 
 

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 Skopiuj do schowka
 
 
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 :mrgreen:
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 Skopiuj do schowka
 
 

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 Skopiuj do schowka
 
 
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 Skopiuj do schowka
 
 

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 Skopiuj do schowka
 
 
 
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 Skopiuj do schowka
 
 

EXCELFORUM.pl POLECA - Bezplatne triki prosto na skrzynke email

bodek 



Posty: 1679
Wysłany: 2010-10-28, 19:51   

Panie/Panowie nie odkrywajmy ponownie czegoś, co już dawno ktoś zrobił...
Trebor zadał sobie swego czasu trud i problem rozpracował -> http://excelperfect.pl/vba/50-ostatni-wiersz
_________________
Szkolenia MS Excel, Świat Excela, Blog o Excelu
ID posta: 98930 Skopiuj do schowka
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
Theme xandgreen created by spleen& Programosy modified v0.3 by warna
Opieka techniczna www.marketingNET.pl

Archiwum