Jak ustalić wartość ostatniej komórki w zakresie programu Excel?
Skrypciarze odpowiadają na Wasze pytania
Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy. |
Jak ustalić wartość ostatniej komórki w zakresie programu Excel?
Cześć, Skrypciarze! Jak ustalić wartość ostatniej komórki w przykładowym zakresie C1:C10?
-- MJdR
Cześć, MJdR. Nie wiem, jak dla Ciebie, ale ostatnimi czasy wszystkie sondaże, badania i ankiety przeprowadzane na ulicach, wydają się być niczym innym jak oszustwem, a osoby są chyba podstawiane. Tym bardziej konferencje prasowe, na których pracownicy firmy, tudzież innej instytucji podejrzanej, zadają ogólnikowe i oczywiste pytania. Kwestii spornych nie porusza się chyba pod żadnym pozorem.
My jednak tacy nie jesteśmy i niczego nie podajemy do publicznej wiadomości wybiórczo, zawsze rzetelnie, wychodzimy bowiem z założenia, że odrobina krytyki na łamach może tylko mobilizować. Oto więc kilka emaili od czytelników niezadowolonych z artykułów z serii „Cześć, Skrypciarze!”:
Cześć, Skrypciarze! Chciałem tylko powiedzieć, że czytuję wasze artykuły codziennie, są to bez wątpienia najlepsze artykuły na temat skryptów, jaki czytałem. Tak dalej!
-- PC
ODP: Dziękujemy, PC; doceniamy Twoją opinię.
Cześć, Skrypciarze! Piszecie te Wasze artykuły od trzech lat, a ciągle macie nowe pomysły i nie tracicie polotu. One są po prostu coraz lepsze! Jak utrzymujecie tak wysoki poziom dobrego humoru przez tak długi czas? Czy jest to trudne?
-- DT
ODP: Dziękujemy za wszelką krytykę pod naszym adresem. Nie jest to oczywiście łatwe, ale kochamy naszą pracę.
Cześć, Skrypciarze! Czy w powyższych wiadomościach nie dostrzegliście pewnego zbiegu okoliczności? To niesamowite! PC ma przecież takie same inicjały jak Skrypciarz Peter Costantini, a DT jak Skrypciarz Dean Tsaltas?
-- Redaktorka
Bardzo trafna uwaga! Jak widzisz, droga (poprawiająca nas i czepiącą się) Czytelniczko, jesteśmy niesamowici pod każdym względem. Zanim jednak odpowiemy na Twoje pytanie bardziej szczegółowo, zajmijmy się MJdR:
Const xlCellTypeLastCell = 11
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
Set objWorkbook = objExcel.Workbooks.Add()
Set objWorksheet = objWorkbook.Worksheets(1)
objWorksheet.Cells(1, 1) = 1
objWorksheet.Cells(2, 1) = 2
objWorksheet.Cells(3, 1) = ""
objWorksheet.Cells(4, 1) = 4
objWorksheet.Cells(5, 1) = ""
objWorksheet.Cells(6, 1) = 6
objWorksheet.Cells(7, 1) = 7
Set objRange = objExcel.Range("A1:A7")
objRange.Cells.SpecialCells(xlCellTypeLastCell).Activate
Wscript.Echo objExcel.ActiveCell.Value
Jakieś jeszcze pytania? (Oprócz tych od redakcji, to byłby nepotyzm).
Żadnych? Wytłumaczmy zatem jak działa nasz skrypt.
Zaczynamy od zdefiniowania stałej o nazwie xlCellTypeLastCell, której wartość ustawiamy na 11 – tej zmiennej będziemy używać, aby poinstruować skrypt, jaki zakres nas interesuje (to oczywiście ostatnia komórka zakresu). Po zdefiniowaniu stałej tworzymy wystąpienie obiektu Excel.Application i ustawiamy jego wartość Visible na True. To daje nam uruchomione i widoczne na ekranie wystąpienie programu Excel. Następnym naszym krokiem będzie użycie poniższych dwóch wierszy kodu i utworzenie nowego skoroszytu oraz połączenie się z pierwszym arkuszem w tym skoroszycie:
Set objWorkbook = objExcel.Workbooks.Add()
Set objWorksheet = objWorkbook.Worksheets(1)
Po tym następuje siedem linijek kodu, które po prostu nadają wartości komórkom od A1 do A7, nie musimy się zatem kłopotać tymi wierszami. Zauważyliście jednak na pewno, że komórkom A3 i A5 nadaliśmy wartość równą pustemu ciągowi. Dlaczego? Jak zapewne wiecie, program Excel można czasem „oszukać”, bo może on wywnioskować, że pusta komórka jest końcem zasięgu. Dlatego też specjalnie umieściliśmy takie komórki w naszym zasięgu, żeby pokazać, że skrypt działa (idealnie oczywiście) nawet jeżeli jedna lub dwie komórki są puste.
Następnie na naszej drodze napotykamy następujące wiersze:
Set objRange = objExcel.Range("A1:A7")
objRange.Cells.SpecialCells(xlCellTypeLastCell).Activate
W pierwszym z nich tworzymy obiekt Range, który obejmuje komórki od A1 do A7. Czym więc zajmuje się drugi wiersz? W sumie kilkoma rzeczami. Po pierwsze, wywołuje metodę SpecialCells, metodę, która należy do kolekcji Cells obiektu Range. Stworzono ją do zwracania kolekcji, hmmm… no właśnie specjalnych komórek – takich jak puste komórki, komórki o tym samym formatowaniu, i jak się Wam żywnie podoba (więcej informacji znajdziecie na stronie Excel Language Reference (j.ang.) w witrynie MSDN.) W naszym przypadku przekazujemy komórkom SpecialCells stałą xlCellTypeLastCell; to instruuje metodę, aby zwróciła kolekcję zawierającą pojedynczą komórkę: ostatnią komórkę zakresu.
To jedno działanie, napisałem jednak, że wiersz zajmuje się ponadto innymi rzeczami. Jedną z nich jest przywołanie metody Activate, która po zidentyfikowaniu ostatniej komórki zakresu, aktywuje ją.
Po co nam takie aktywowanie? W ten sposób przywołujemy echo wartości komórki. Robimy to za pomocą poniższego wiersza kodu:
Wscript.Echo objExcel.ActiveCell.Value
Używając właściwości ActiveCell jesteśmy w stanie pobrać wartość nawet, jeżeli nie znamy adresu ostatniej komórki zakresu (co w rzeczywistym skrypcie może przecież mieć miejsce).
Co zaś otrzymamy po przywołaniu echa wartości aktywnej komórki? Oczywiście wartość komórki A7, czyli ostatniej komórki zakresu:
7
Tylko tyle. Proszę o oklaski.
Jeszcze jedno, musimy przecież odpowiedzieć jeszcze na pytania Pani Redaktor. Oczywiście:
ZBIEŻNOŚĆ INICJAŁÓW JEST PRZYPADKOWA.
Dziękujemy za wszelkie słowa krytyki i doceniamy je.
Do początku strony |