Centrum skryptów - Microsoft Office

Jak oznaczyć kolorem każdy pojedynczy wiersz w arkuszu kalkulacyjnym programu Excel?

Udostępnij na: Facebook

Skrypciarze odpowiadają na Wasze pytania

Cześć Skrypciarze!

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 oznaczyć kolorem każdy pojedynczy wiersz w arkuszu kalkulacyjnym programu Excel?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Chcę, aby po utworzeniu nowego arkusza kalkulacyjnego jego poszczególne wiersze miały różne kolory. Jak to zrobić?

-- TM

Cześć Skrypciarze! Odpowiedź

Cześć, TM. Zanim piszący te słowa Skrypciarz przejdzie do rzeczy i odpowie na pytanie dotyczące skryptu, chciałby się trochę pożalić. Ciężko mu na sercu po tym weekendzie i musi to z siebie wyrzucić. Otóż piszący te słowa Skrypciarz pojechał w weekend na mający miejsce na drugim końcu kraju ślub (i wesele). Wszystko byłoby z tym w porządku, gdyby nie fakt, że tak naprawdę zrobił kilkaset kilometrów w jedną stronę, nie zdążył na ślub (tylko jemu mogła się w takiej podróży przytrafić awaria), a kiedy dotarł na wesele, zrobiło mu się jakoś dziwnie i poczuł, że coś z nim jest nie tak. Przywitał się więc z rodziną, złożył życzenia młodej parze, zjadł obiad, nawet nie poczekał na tort, wsiadł do samochodu i odjechał. Trochę to bez sensu, ale wydawało mu się wtedy że bardziej bez sensu byłoby, gdyby został, nigdy wcześniej nie czuł się bardziej nie na miejscu. Chodzi o to, że do tej pory nie potrafi sobie wytłumaczyć swoich odczuć ani swojego zachowania i czuje się z tym dość niepewnie. Więc jeżeli komuś z was przydarzyło się coś podobnego, napiszcie o tym, będzie to dla piszącego te słowa Skrypciarza wielkim pocieszeniem i dowodem na to, że jeszcze nie zwariował.

Naprawdę wiele wysiłku kosztowało piszącego te słowa Skrypciarza, żeby tak po prostu przyjść do pracy i napisać skrypt, który oznaczy kolorem poszczególne wiersze w arkuszu kalkulacyjnym programu Excel. Mając jednak mając na uwadze ogólnie panujące przekonanie, że praca może być lekarstwem na wszelkie duchowe bolączki, wziął się w garść i napisał następujący skrypt:

Set objExcel = CreateObject("Excel.Application")

objExcel.Visible = True



Set objWorkbook = objExcel.Workbooks.Add()

Set objWorksheet = objWorkbook.Worksheets(1)



For i = 1 to 5

    If i Mod 2 = 0 Then

        Set objRange = objExcel.ActiveCell.EntireRow

        objRange.Cells.Interior.ColorIndex = 37

    Else

        Set objRange = objExcel.ActiveCell.EntireRow

        objRange.Cells.Interior.ColorIndex = 36

    End If

        

    objWorksheet.Cells(i,1) = i



    intNewRow = objExcel.ActiveCell.Row + 1

    strNewCell = "A" &  intNewRow

    objExcel.Range(strNewCell).Activate



Next

No dobrze, jak ten skrypt działa? Zaczynamy od utworzenia wystąpienia obiektu Excel.Application i nadania właściwości Visible wartości True; dzięki temu otrzymamy działające wystąpienie programu Excel widoczne na ekranie. Następnie stosujemy metodę Add w celu dodania nowego skoroszytu, a potem używamy poniższego wiersza kodu do połączenia się z pierwszym arkuszem w skoroszycie:

Set objWorksheet = objWorkbook.Worksheets(1)

To było całkiem proste, nieprawdaż? W naszym przykładowym arkuszu kalkulacyjnym umieścimy dane w pierwszych pięciu wierszach; dlatego też uruchamiamy małą pętlę For Next, która przejdzie przez zakres od 1 do 5:

For i = 1 to 5

Wewnątrz tej pętli najpierw wykonujemy poniższy wiersz kodu:

If i Mod 2 = 0 Then

Do czego nam on służy? Cóż, dzięki funkcji Mod otrzymujemy resztę z dzielenia. Dzielimy zmienną licznika i przez 2 i sprawdzamy, czy otrzymamy resztę 0. Dlaczego to robimy? Chwila…. Ach tak, po to, żeby śledzić naprzemienne wiersze. Wiersze oznaczone liczbą nieparzystą (1, 3, 5, 7, etc.) nie będą miały reszty 0; a to dlatego, że 2 nie dzieli się bez reszty przez liczby nieparzyste. Dla porównania, wiersze parzyste będą miały resztę 0. Parzysty-nieparzysty, parzysty-nieparzysty, parzysty-nieparzysty: prosty sposób śledzenia naprzemiennych wierszy.

Co robimy, jeżeli reszta z dzielenia to 0? W takim przypadku zastosujemy poniższy wiersz kodu:

Set objRange = objExcel.ActiveCell.EntireRow

objRange.Cells.Interior.ColorIndex = 37

Jak widzimy, robimy tutaj dwie rzeczy. Po pierwsze, tworzymy obiekt Range, który obejmuje wszystkie komórki w wierszu 1. Skąd mamy wiedzieć, że ten obiekt Range obejmuje wszystkie komórki znajdujące się w wierszu 1? Za pomocą tego wiersza kodu odwołujemy się do właściwości EntireRow dla wiersza zawierającego komórkę aktywną ActiveCell (tę komórkę, w której aktualnie znajduje się kursor). Domyślnie, za każdym razem, gdy programistycznie tworzymy nowy arkusz kalkulacyjny, kursor zostaje automatycznie umieszczony w komórce A1. A ponieważ komórka A1 znajduje się w wierszu 1, musi to oznaczać, że zaznaczamy wszystkie komórki w wierszu 1.

W drugim wierszu kodu ustawiamy kolor tła (Interior.ColorIndex) komórek z wiersza 1 na jasnożółty. Skąd wiedzieliśmy, że wartość 37 da nam kolor jasnożółty? Oczywiście, że nie znamy wartości wszystkich kolorów na pamięć, więcej informacji na temat kolorów i wartości znajduje się w tym artykule rubryki Office Space (j.ang.).

A teraz – co robimy, jeżeli reszta z dzielenia nie jest równa 0? No cóż, w takim przypadku zostawiamy wiersz bez koloru. Albo nie, żeby wyrazić nasz dzisiejszy nastrój – pokolorujmy go na jasnoniebieski, używając następującego wiersza kodu:

Set objRange = objExcel.ActiveCell.EntireRow

objRange.Cells.Interior.ColorIndex = 36

Po nadaniu wierszowi odpowiedniego odcieniu przypisujemy wartość i do komórki A w bieżącym wierszu:

objWorksheet.Cells(i,1) = i

To nic wielkiego; robimy to tylko po to, by się upewnić, że nasz arkusz kalkulacyjny zawiera jakieś dane. Następnie uruchamiamy poniższy wiersz kodu:

intNewRow = objExcel.ActiveCell.Row + 1

strNewCell = "A" &  intNewRow

objExcel.Range(strNewCell).Activate

Dlaczego właśnie ten wiersz kodu? Cóż, programistyczne dodanie danych do nowego wiersza nie spowoduje zmiany aktywnej komórki; jeśli nie zmienimy jej w inny sposób, to komórka A1 pozostanie aktywna już na zawsze. Ale to nie byłoby zbyt dobre. Gdyby tak było, musielibyśmy w kółko zmieniać kolor tła wiersza 1. Dlatego też robimy coś innego:

Po pierwsze, przypisujemy wartość Row aktywnej komórki plus 1 do zmiennej o nazwie intNewRow. Dlaczego „plus 1”? No cóż, załóżmy, że komórka aktywna znajduje się aktualnie w wierszu pierwszym; oznacza to, że musimy przenieść komórkę aktywną do wiersza 2. A skoro 1+1 daje nam 2, sami rozumiecie…

Następnie łączymy nowy numer wiersza z literą A, przypisując tę wartość do zmiennej o nazwie strNewCell:

strNewCell = "A" &  intNewRow

Nie ma potrzeby mówić, ze pierwsze przejście pętli da zmienną strNewCell równą A2. Oznacza to, że teraz możemy wywołać metodę Activate i uczynić komórkę strNewCell (A2) komórką aktywną:

objExcel.Range(strNewCell).Activate

Kontynuujemy teraz działanie pętli i powtarzamy cały proces dla następnego wiersza w skoroszycie.

Kiedy już wszystko zostanie zrobione, otrzymamy skoroszyt wyglądający następująco:

I to już koniec naszej pracy.

 Do początku strony Do początku strony

Centrum skryptów - Microsoft Office