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 
ExcelSpec


Posty: 356
Wysłany: 29-06-2007, 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
 
 
waldek_r
[Usunięty]

Wysłany: 02-08-2007, 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
ID posta: 11531 Skopiuj do schowka
 
 
Piotr_Korbicz 
ExcelSpec


Posty: 533
Wysłany: 22-12-2007, 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 
ExcelSpec



Posty: 1060
Wysłany: 22-12-2007, 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
_________________
Andrzej,
Najpierw wyjaśnijmy wszystko a potem resztę
Lepiej mieć z grubsza rację niż dokładnie się mylić
Niczego nie dowodzi ten, kto dowodzi zbyt wiele - Nihil probat, qui nimium probat.
ID posta: 22987 Skopiuj do schowka
 
 
Lukasz 
Świeżak


Posty: 6
Wysłany: 30-04-2008, 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: 4680
Wysłany: 30-04-2008, 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
_________________
Trebbor@wp.pl
ID posta: 34543 Skopiuj do schowka
 
 
iskandir
Starszy Forumowicz



Posty: 28
Wysłany: 17-10-2010, 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 
ExcelSpec


Posty: 760
Wysłany: 21-10-2010, 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
 
 
chips 
Exceloholic


Posty: 249
Wysłany: 25-10-2010, 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 
ExcelSpec


Posty: 760
Wysłany: 25-10-2010, 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
 
 
bodek 


Wersja: Win Office 2019
Posty: 3188
Wysłany: 28-10-2010, 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/?p=217

Link poprawiony.
_________________
MAKROAPLIKACJE.PL - Automatyzacja Excela Dla Korporacji by Quasi
ID posta: 98930 Skopiuj do schowka
 
 
Marecki 
Excel Expert



Wersja: Win Office 2021
Posty: 8812
Wysłany: 26-03-2015, 10:21   

Pozwolę sobie dorzucić jeszcze rozwiązanie kolegi Furlol-a

Kod:
=HIPERŁĄCZE("#A"&(MAX(JEŻELI.BŁĄD(PODAJ.POZYCJĘ("żżżż";$A:$A);0);JEŻELI.BŁĄD(PODAJ.POZYCJĘ(99^20;$A:$A);0))+1);"Skocz")
_________________
Hardware - ta część komputera, którą można kopnąć kiedy software przestanie funkcjonować.

FB
ID posta: 257749 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.wip.pl

Archiwum

Strona uĹźywa plikĂłw cookies.

Kliknij tutaj, żeby dowiedzieć się jaki jest cel używania cookies oraz jak zmienić ustawienia cookie w przegl�darce.
Korzystając ze strony użytkownik wyraża zgodę na używanie plików cookies, zgodnie z bieżącymi ustawieniami przeglądarki.
SprawdĹş, w jaki sposĂłb przetwarzamy dane osobowe