Centrum Skrypciarzy - Microsoft Office

Jak posortować dane w wierszu w arkuszu 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 posortować dane w wierszu w arkuszu programu Excel?

Cześć Skrypciarze! Pytanie

Cześć, Skrypciarze! Jak posortować dane w wierszu w arkuszu programu Excel?

-- RF

Cześć Skrypciarze! Odpowiedź

Cześć, RF. To ciężkie pytanie, ale jako mieszkaniec stanu Waszyngton, Skrypciarz piszący te słowa chętnie na nie odpowie... w roku 2013.

Jeśli zastanawiasz się, o co chodzi, władze stanu Waszyngton postanowiły w obawie, że uczniowie nie potrafią czytać, pisać ani liczyć, iż od roku 2008 aby ukończyć szkołę średnią należy zdać test WASL. Jak się okazało, duży procent uczniów oblał matematyczną część testu (niektórzy oblali też części dotyczące pisania i czytania, ale matma była o wiele większym problemem). Cóż, szkoda, ale po to zaprojektowano ten test – aby odnaleźć uczniów, którzy nie spełniają minimalnych wymagań. Poza tym nie taki diabeł straszny, jak go malują – uczniowie mogą powtarzać test wielokrotnie, dopóki go nie zdadzą. W zasadzie to Skrypciarz piszący te słowa nie jest szczególnym miłośnikiem ustandaryzowanych testów, ale zasady to zasady. Tak dla jasności, warto też dodać, że Syn Skrypciarza podszedł do testu WASL i zdał wszystkie trzy części.

Jak w tej sytuacji postąpił stan Waszyngton? W jedyny możliwy sposób: ogłaszając amnestię dla uczniów, którzy nie zdali matematycznej części testu. Wystarczyć miało, aby zdali części dotyczące pisania i czytania. Pewnego dnia wielu uczniów oblało WASL, a następnego dowiedzieli się, że w magiczny sposób większość z nich jednak go zdała. System działa! Oczywiście, w teorii, rocznik podchodzący do testu w 2013 będzie musiał zdać część matematyczną. Jeśli im się nie uda, nie ukończą szkoły średniej. I tym razem mówimy serio.

Chyba że, oczywiście, okaże się, że jednak nie.

Na szczęście Skrypciarze nie mają tyle cierpliwości, aby czekać do roku 2013:

Const xlAscending = 1

Const xlNo = 2

Const xlSortRows = 2



Set objExcel = CreateObject(“Excel.Application”)

objExcel.Visible = True

Set objWorkbook = objExcel.Workbooks.Add

Set objWorksheet = objWorkbook.Worksheets(1)



objWorksheet.Cells(1, 1) = “C”

objWorksheet.Cells(1, 2) = “D”

objWorksheet.Cells(1, 3) = “B”

objWorksheet.Cells(1, 4) = “A”



Set objRange = objExcel.ActiveCell.EntireRow

objRange.Sort objRange, xlAscending, , , , , , xlNo, , , xlSortRows

Jak właściwie działa ten skrypt? Nie chcemy straszyć mieszkańców stanu Waszyngton, ale zaczniemy od czegoś, co wygląda jak matematyka. Ale nie bójcie się, ten kod nie zawiera prawdziwej arytmetyki. Zamiast tego po prostu przydzielimy wartości trzem różnym stałym:

  • xlAscending, której użyjemy do posortowania danych rosnąco (A do Z). Czy możemy je posortować malejąco (Z do A) jeśli chcemy? Oczywiście, że możemy; używamy wtedy po prostu stałej xlDescending i przydzielamy jej wartość 2.
  • xlNo, której użyjemy, aby określić, że nasze dane nie zawierają wiersza nagłówków. (Co powinno być oczywiste, jako że sortujemy wiersz, a nie kolumnę.)
  • xlSortRows, która mówi skryptowi, aby sortował komórki według wiersza, nie zaś według kolumny.

Po zdefiniowaniu stałej tworzymy wystąpienie obiektu Excel.Application i ustawiamy wartość własności Visible na True; to da nam widoczne na ekranie wystąpienie programu Excel. Użyjemy wtedy poniższych dwóch wierszy kodu, aby utworzyć nowy skoroszyt i utworzyć powiązanie dla pierwszego arkusza w tym skoroszycie:

Set objWorkbook = objExcel.Workbooks.Add

Set objWorksheet = objWorkbook.Worksheets(1)

Dla Skrypciarzy sortowanie danych to żadna zabawa, jeśli nie ma się żadnych danych do posortowania. Dlatego nasz kolejny fragment kodu po prostu umieści wartości C, D, B i A w komórkach od A1 do D1 (czyli w pierwszych czterech komórkach w pierwszym wierszu naszego arkusza):

objWorksheet.Cells(1, 1) = “C”

objWorksheet.Cells(1, 2) = “D”

objWorksheet.Cells(1, 3) = “B”

objWorksheet.Cells(1, 4) = “A”

Uwaga. Mimo że piszący te słowa Skrypciarz chodził do szkoły w stanie Waszyngton, wciąż był w stanie stwierdzić, że ten kod rzeczywiście umieścił dane w pierwszych czterech komórkach arkusza. I udało mu się to w dużej mierze samodzielnie, jedynie z niewielką pomocą.

A teraz najlepsza część. Zanim posortujemy dane, musimy utworzyć zakres zawierający wszystkie dane, które chcemy posortować. Ponieważ chcemy posortować dane w wierszu 1, użyjemy tej linii kodu, aby zmienić wiersz 1 w zakres:

Set objRange = objExcel.ActiveCell.EntireRow

Jak widzicie, nie jest to szczególnie trudne. Domyślnie ActiveCell to pierwsza komórka w arkuszu (chyba, że sami określimy inną komórkę jako ActiveCell). Odwołując się zarówno do ActiveCell, jak i do metody EntireRow możemy łatwo wybrać wszystkie komórki w wierszu 1.

Dobre pytanie: co zrobić, jeśli mamy wiele wierszy wymagających posortowania? W takim wypadku musimy posortować każdy wiersz indywidualnie, co oznacza, że trzeba utworzyć inny zakres dla każdego wiersza danych. Jak to zrobić? Cóż, jednym ze sposobów jest zmiana ActiveCell za każdym razem, gdy zaczynacie nowy wiersz. Oto prosty sposób:

intNewRow = objExcel.ActiveCell.Row + 1

strNewCell = “A” & intNewRow

objExcel.Range(strNewCell).Activate

Dodajemy tutaj 1 do wiersza aktualnego ActiveCell; jeśli jesteśmy obecnie w wierszu 1, sprawi to, że wartość intRow będzie równa 2. Następnie dołączamy literę A z przodu numeru wiersza; to sprawia, że strNewCell równa się A2. Dlaczego A2? Cóż, A2 jest komórką w wierszu 2. Wskazując komórkę w wierszu 2, możemy użyć metody Activate aby przenieść aktywną komórkę do następnego wiersza.

Jasne, są inne sposoby na zrobienie tego. Jeśli macie lepszy pomysł, to jak najbardziej z niego skorzystajcie. W innym wypadku ta taktyka powinna wystarczyć.

Na czym skończyliśmy? A, tak: sortowanie wiersza danych. Po utworzeniu zakresu zawierającego interesujący nas wiersz, możemy posortować te dane przy użyciu następującego polecenia:

objRange.Sort objRange, xlAscending, , , , , , xlNo, , , xlSortRows

To niewątpliwie dziwnie wyglądający fragment kodu, z przecinkami i pustymi parametrami.

To dlatego, że Excel oferuje wiele opcji sortowania (w tym możliwość sortowania najpierw według jednej kolumny danych, a potem według innej), które nas nie interesują. Jednak ze względu na to, że używane przez nas parametry metody Sort muszą pojawić się w określonej kolejności, nie możemy po prostu ich opuścić. Gdybyśmy to zrobili, zmieniłoby to kolejność i spowodowało całą masę problemów. Aby upewnić się, że wszystko zadziała dokładnie tak, jak powinno, musimy umieścić w poleceniu puste miejsca dla każdej opcji, którą chcemy zignorować. I właśnie to zrobiliśmy powyżej.

Uwaga. Więcej informacji o tych innych opcjach i dodatkowe przykłady sortowania danych w Excelu znaleźć można w naszym artykule Office Space (j.ang.) dotyczącym, cóż, sortowania danych w Excelu.

Teraz warto zauważyć, że określiliśmy zakres danych, który ma być sortowany (objRange) i użyliśmy trzech stałych, aby ustalić, że: 1) chcemy posortować dane rosnąco, 2) nie chcemy użyć wiersza nagłówków oraz 3) chcemy posortować dane według wierszy, a nie kolumn. Czy nasze dane rzeczywiście zostaną posortowane po uruchomieniu skryptu? Sami spróbujcie i sprawdźcie.

Mamy nadzieję, że odpowiedź Cię satysfakcjonuje, RF. Jeśli zaś chodzi o stan Waszyngton, cóż, Homer Simpson chyba określił to najlepiej: jeśli coś ciężko jest zrobić, nie warto robić tego wcale. To ważna lekcja dla nas wszystkich, nie tylko dla licealistów.

 Do początku strony Do początku strony

Centrum Skrypciarzy - Microsoft Office