Centrum Skryptów - Microsoft office

Jak zaznaczyć pierwsze wystąpienie liczby 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 zaznaczyć pierwsze wystąpienie liczny w arkuszu kalkulacyjnym programu Excel?

Cześć Skrypciarze! Pytanie

Cześć Skrypciarze! Próbuję określić – i zaznaczyć – pierwsze wystąpienie liczby w arkuszu kalkulacyjnym programu Excel. Nie mogę jednak znaleźć sposobu, żeby to zrobić. Czy możecie mi pomóc?

-- BH

Cześć Skrypciarze! Pytanie

Cześć, BH. Zanim zajmę się odpowiadaniem na dzisiejsze pytanie, chcę coś ogłosić: Skrypciarze się poddają. Pokonaliście nas bezdyskusyjnie.

Od poniedziałku rano czuliśmy się w miarę pewnie w związku z Zimową Olimpiadą Skrypciarską 2008 (j.ang.). Myśleliśmy, że dzięki przemyślanemu pomysłowi rozpoczęcia Olimpiady w piątek (względnie spokojny dzień w Centrum Skryptów), jak również naszemu doświadczeniu w testowaniu i ocenianiu w ostatnich dwóch olimpiadach, damy sobie radę ze wszystkimi nadesłanymi skryptami. I przez pierwsze kilka dni rzeczywiście tak było. Ale potem przyszły kolejne dni i zostaliśmy dosłownie zalani.

Już nie wydaje nam się, że damy radę. Wygraliście.

Innymi słowy, jeżeli przesłaliście nam kilka skryptów i zastanawiacie się, kiedy opublikujemy punktację, mogę powiedzieć tylko jedno: Kiedyś na pewno. Obecnie próbujemy zakończyć konkurencje 1, 2, 3 oraz 4 - ponieważ konkurencje 1 i 2 zostały oficjalnie zamknięte, a termin dla konkurencji 3 i 4 przypada na piątek. Próbujemy także być na bieżąco z konkurencją Nagłej Śmierci i widzimy, jak się sprawy mają każdego dnia (jeszcze jeden pomysł, który na papierze wydawał się idealny…). Jeżeli przesłaliście nam już rozwiązania z kategorii 9 i 10, będziecie musieli poczekać trochę dłużej na ich ocenę. Nasze sugestie? Możecie codziennie brać udział w konkurencji Nagłej Śmierci (j.ang.), żeby mieć się czym zająć podczas oczekiwania.

Co prawda przysporzy to nam jeszcze więcej pracy, ale nic nie szkodzi. Bawcie się dobrze. Chwile oczekiwania można poświęcić także na zapoznanie się ze skryptem identyfikującym pierwsze wystąpienie liczby w arkuszu kalkulacyjnym programu Microsoft Excel:

Set objDictionary = CreateObject("Scripting.Dictionary")



Set objExcel = CreateObject("Excel.Application")

Set objWorkbook = objExcel.Workbooks.Open("C:\Scripts\Test.xls")



objExcel.Visible = True



Set objWorksheet = objWorkbook.Worksheets(1)



i = 1



Do Until objExcel.Cells(i, 1) = ""

    intValue = objExcel.Cells(i, 1)



    If Not objDictionary.Exists(intValue) Then

        objDictionary.Add intValue, intValue 

        objExcel.Cells(i, 2) = 1

    End If



    i = i + 1

Loop

BH twierdzi, że rozwiązanie „powinno być proste”. I ma rację: rozwiązanie jest proste. Jak widzicie, zaczynamy od utworzenia wystąpienia obiektu Scripting.Dictionary; wykorzystamy obiekt Dictionary w celu śledzenia liczb, które już znaleźliśmy w arkuszu. Po utworzeniu obiektu Dictionary tworzymy wystąpienie obiektu Excel.Application i używamy metody Open oraz następującego wiersza kodu w celu otwarcia arkusza kalkulacyjnego C:\Scritps\Test.xls:

Set objWorkbook = objExcel.Workbooks.Open("C:\Scripts\Test.xls")

Po otwarciu arkusza ustawiamy wartość właściwości Visible na True; dzięki temu plik programu Excel będzie widoczny na ekranie i będziemy widzieć, co się w nim dzieje. Oczywiście nasz następny krok i tak nie będzie widoczny na ekranie; a to dlatego, że używamy poniższego wiersza kodu w celu połączenia się z pierwszym arkuszem w pliku Test.xls:

Set objWorksheet = objWorkbook.Worksheets(1)

Mówicie, że to nudne? Zaraz zrobi się ciekawie; wystarczy ustawić wartość zmiennej licznika o nazwie i na 1 i możemy zacząć działać.

Co mam na myśli, mówiąc: działać? Jak się okazuje, BH ma arkusz wyglądający podobnie do poniższego:

BH chce przejść przez wszystkie liczby w kolumnie A w celu znalezienia pierwszego wystąpienia każdej liczby. Przykładowo liczba 5 pojawia się w komórce A1. To pierwsza liczba 4 pojawiającą się w kolumnie A, co oznacza, że wartość komórki B1 powinna wynosić 1, wskazując na pierwsze wystąpienie:

Po zakończeniu wszystkich czynności arkusz powinien wyglądać następująco, przy czym pierwsze wystąpienie każdej liczby jest wskazane w kolumnie B:

Jak to zrobić? Cóż, na początek uruchamiamy pętlę Do Until, która będzie działać, dopóki nie napotka pustej komórki w kolumnie A:

Do Until objExcel.Cells(i, 1) = ""
Uwaga: W tym skrypcie zakładamy, że nie ma pustych wierszy w arkuszu.

Wewnątrz pętli używamy poniższego wiersza kodu w celu pobrania wartości komórki A1 (czyli komórki w wierszu 1, kolumnie 1, gdzie zmienna licznika reprezentuje numer wiersza):

intValue = objExcel.Cells(i, 1)

Przy pierwszym przejściu pętli zmienna intValue będzie miała wartość 5. Czy to jest pierwsze wystąpienie liczby 5 w arkuszu kalkulacyjnym? Prawdę mówiąc nie mam pojęcia. Ale wiecie, jak to mówią: w razie wątpliwości należy sprawdzić obiekt Dictionary:

If Not objDictionary.Exists(intValue) Then

    objDictionary.Add intValue, intValue 

    objExcel.Cells(i, 2) = 1

End If

Używamy tutaj metody Exists w celu określenia, czy ta wartość (5) nie istnieje w obiekcie Dictionary. Powiedzmy, że metoda Exists przekazuje nam wartość True, co oznacza, że prawdą jest, że wartość 5 nie występuje w obiekcie Dictionary. To może z kolei oznaczać tylko jedno: To jest pierwsze pojawienie się wartości 5 w naszym arkuszu kalkulacyjnym. Mając to na uwadze, wykonujemy dwa proste zadania:

  • Używamy metody Add w celu dodania tej wartości do obiektu Dictionary (używając wartości 5 jako zarówno elementu Dictionary, jak i klucza Dictionary).
  • Ustawiamy wartość komórki B1 (wiersz i, kolumna B) jako 1.

W tym momencie zwiększamy wartość zmiennej i o 1, wracamy na początek pętli i powtarzamy proces dla wiersza 2, kolumny 1. Załóżmy, że ta komórka także ma wartość 5; co wtedy? Cóż, w takim przypadku wartość 5 znajduje się w obiekcie Dictionary. Dlatego też po prostu wracamy na początek pętli i próbujemy jeszcze raz z następną komórką w kolumnie A.

Itd., itp.

Czy to aby na pewno zadziała? Dajcie spokój: takie pytania ranią nasze uczucia!

Czyli tak, ten skrypt zadziała.

 Do początku strony Do początku strony

Centrum Skryptów - Microsoft office