ID tematu: 1832
|
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
|
|
|
|
|
|
|
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
|
|
|
|
|
|
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
|
|
|
|
|
|
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
|
|
|
|
|
|
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
|
|
|
|
|
|
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
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
|
|
|
|
|
|
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
|
|
|
|
|
|
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
|
|
|
|
|
|
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
|
|
|
|
|
|
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
|
|
|
|
|
|
bodek
Wersja: Win Office 2019
Posty: 3188
|
|
| ID posta:
98930
|
|
|
|
|
|
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
|
|
|
|
|
|
|
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
|
|
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
|