Centrum skryptów - Microsoft Office

Jak ustalić wartość ostatniej komórki w zakresie programu Excel?

Udostępnij na: Facebook

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 Do początku strony

Centrum skryptów - Microsoft Office