Centrum skryptów - Systemy operacyjne

Jak oddzielić miesiąc od roku w ciągu daty 122007?

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 oddzielić miesiąc od roku w ciągu daty 122007?

Cześć, Skrypciarze! Mam kolumnę danych w programie Microsoft Excel, która ma format MRRRR (12008 = styczeń 2008) oraz MMRRRR (122007 = grudzień 2007). Muszę rozdzielić te wartości na miesiąc i rok, ale nie wiem, jak to zrobić. Jakieś sugestie?

-- JF

Cześć, DW. W końcu zaczyna się ocieplać, o ile 13°C można nazwać ociepleniem. Ale i tak jest lepiej niż wczoraj, a dziś przynajmniej świeci słońce. I nie pada. Wiatru też nie ma. Może tylko taki lekki, wiosenny wietrzyk.

Same powody do radości.

Przyznaję, niektórzy z Was mogą mieć już dość mojego narzekania na pogodę. W końcu czy tak trywialna rzecz jak pogoda ma jakieś znaczenie, jeśli spojrzymy na nasze życie z szerszej perspektywy? Cóż, jak zwykle gdy pada pytanie natury głęboko filozoficznej, z pomocą przychodzi mi Skrypciarz Dean Tsaltas. Oto, co Dean ma do powiedzenia na ten temat:

„Kiedy jest tak zimno, że prawie zmienia się stan fizyczny głównego składnika organizmu odpowiadającego za naszą świadomość, nie ma mowy o udanym dniu.”

Jeżeli to nie jest odpowiedź na Wasze pytanie, to ja nie wiem, co jest.

No dobra. Przyznaję. Ja też nie wiem, o co chodziło Deanowi, ale wydaje mi się, że mógł odnosić się do faktu, że nasze ciało składa się w większości z wody, która przecież zamarza w temperaturze 0°C. Wniosek z tego taki, że musimy trzymać się jak najdalej od takiej temperatury. Dla większości ludzi to naprawdę dobra rada. Na szczęście ja nie składam się w większości z wody. Przeważa u mnie tkanka tłuszczowa, co oznacza, że mogę się zacząć martwić dopiero, gdy temperatura spadnie kilka stopni poniżej zera.

Uwaga. OK., to nie jest do końca prawdą: tkanka tłuszczowa nie jest elementem przeważającym w moim organizmie. Proporcje są takie: 50% tłuszcz i 50% tatuaże, w tym tatuaż okrętu wojennego U.S.S. Missouri zdobiący mój tors.

No dobra, to też nie jest prawdą: nie mam żadnego tatuażu, a już na pewno nie tatuażu z wizerunkiem okrętu wojennego U.S.S. Missouri zdobiącego klatkę piersiową. Poza tym, jeżeli miałbym sobie robić tatuaż z okrętem, to wybrałbym brzuch. Tam jest miejsce na całą hiszpańską Wielką Armadę. Kiedy tak sobie o tym pomyślę, to byłby naprawdę imponujący tatuaż.

W każdym razie chodzi o to, że – wiecie co? Sam już nie wiem, o co chodzi. Muszę chyba znowu spytać Deana. Tymczasem przyjrzyjmy się skryptowi, który działa na arkuszu kalkulacyjnym programu Excel i rozdziela daty typu 122007 (grudzień 2007) na miesiąc (12) i rok (2007):

Set objExcel = CreateObject("Excel.Application")

objExcel.Visible = True



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

Set objWorksheet = objWorkbook.Worksheets(1)



i = 1



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

    strDate = objWorksheet.Cells(i,1)

    intLength = Len(strDate)

    intYear = Right(strDate, 4)

    intMonth = Left(strDate, intLength - 4)

    objWorksheet.Cells(i,2) = intMonth

    objWorksheet.Cells(i,3) = intYear

    i = i + 1

Loop

Zobaczmy, jak rozwiązać nasz dzisiejszy problem. Zanim się tym zajmiemy, chciałbym, abyśmy przyjrzeli się naszemu arkuszowi kalkulacyjnemu. Jak widzimy, jest to bardzo prosty arkusz, składający się wyłącznie z serii dat (w formacie MiesiącRok) w kolumnie A:

Musimy teraz rozdzielić miesiąc i rok i umieścić te dwie wartości w oddzielnych kolumnach. Innymi słowy, chcemy otrzymać arkusz kalkulacyjny wyglądający tak:

Jak to zrobimy? Wracając do sposobu rozwiązania dzisiejszego problemu, na początek tworzymy wystąpienie obiektu Excel.Application i ustawiamy wartość właściwości Visible jako True. To nam daje działające wystąpienie programu Excel, widoczne na ekranie. Po wykonaniu tej czynności stosujemy poniższe dwa wiersze kodu w celu otwarcia pliku C:\Scripts\Test.xls i połączenia się w pierwszym arkuszem w tym pliku:

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

Set objWorksheet = objWorkbook.Worksheets(1)

Możemy już zacząć rozdzielanie dat? Cierpliwości; zanim to zrobimy, musimy ustawić wartość zmiennej licznika o nazwie i jako 1:

i = 1

Zastosujemy tę zmienną licznika w celu śledzenia bieżącego wiersza w arkuszu kalkulacyjnym.

Możemy teraz zacząć rozdzielanie dat? Nie, do tego nam jeszcze daleko, musimy przecież – co ja gadam. Tak, możemy już zacząć rozdzielanie dat.

Aby rozdzielić te daty, zaczynamy od uruchomienia pętli Do Until, która najpierw sprawdzi wartość komórki w wierszu 1, kolumnie 1 (komórka i, 1):

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

Za pomocą tej pętli w sposób metodyczny sprawdzimy komórki w kolumnie A, wiersz po wierszu. Pętla będzie kontynuować działanie dopóki komórka ma jakąś wartość. Kiedy trafimy na pustą komórkę (czyli komórkę o wartości równej pustemu ciągowi), pętla kończy działanie. Dzięki temu mamy pewność, że pobieramy – i rozdzielamy – wszystkie wartości w kolumnie A w naszym arkuszu kalkulacyjnym.

Wewnątrz tej pętli zaczynamy od pobrania wartości komórki i, 1 i zachowujemy ją w zmiennej o nazwie strDate:

strDate = objWorksheet.Cells(i,1)

Co to oznacza? To oznacza, że przy pierwszym przejściu pętli, zmienna strDate będzie miała wartość 12007.

Świetlnie, ale w dalszym ciągu musimy oddzielić miesiąc od roku. W tym celu najpierw używamy funkcji Len skryptu VBScript w celu określenia liczby znaków w tej wartości:

intLength = Len(strDate)

Dlaczego? Zaraz to wyjaśnię. Przedtem jednak pokażę Wam prosty sposób identyfikowania roku w ciągu daty. Jest prosty, ponieważ rok to zawsze ostatnie cztery znaki w ciągu. W wartości 12007 rok to 2007. Skoro rok to zawsze cztery ostatnie znaki możemy zastosować funkcję Right w celu pobrania tych czterech znaków i zachowania ich w zmiennej o nazwie intYear:

intYear = Right(strDate, 4)

Mówiłem, że sposób jest prosty, nieprawdaż?

Pobieranie wartości miesiąca jest trochę bardziej skomplikowane. Dlaczego? Ponieważ nie wiemy na pewno, ile znaków znajduje się w wartości miesiąca. Miesiąc taki jak styczeń ma tylko jeden znak (1), a na przykład październik będzie miał dwa znaki (10). Brzmi beznadziejnie, prawda? Ale wcale tak nie jest:

intMonth = Left(strDate, intLength - 4)

Co tutaj robimy? Używamy funkcji Left w celu pobrania niektórych znaków z początku naszego ciągu daty. Ile znaków pobieramy? To zależy od długości ciągu. Na przykład wartość 12007 ma długość 5; to dlatego, że w ciągu znajduje się pięć znaków. Stwierdziliśmy już, że cztery ostatnie znaki w ciągu reprezentują rok. Dlatego też pobieramy wszystkie znaki poza ostatnimi czterema. Ile to będzie? Cóż, to będzie długość ciągu minus 4: intLength – 4. W przypadku wartości 12007 będzie to 5 minus 4 lub 1. W tym przypadku pobieramy po prostu 1 znak z początku ciągu. Jeśli nasza wartość to 102007, pobieramy dwa znaki. Dlaczego? Ponieważ długość ciągu (6 znaków) minus rok (4 znaki) daje nam 2. To proste.

Kiedy już mamy miesiąc zachowany w zmiennej intMonth, a rok zachowany w zmiennej intYear, możemy wykonać poniższe dwa wiersze kodu:

objWorksheet.Cells(i,2) = intMonth

objWorksheet.Cells(i,3) = intYear

W wierszu 1 ustawiamy wartość komórki B1 (wiersz i, kolumna 2) jako wartość zmiennej intMonth; w wierszu drugim ustawiamy wartość komórki C1 (wiersz i, kolumna 3) jako wartość zmiennej intYear. Po wykonaniu tej czynności zwiększamy wartość zmiennej licznika o 1 i powtarzamy proces dla następnego wiersza w arkuszu kalkulacyjnym. Ponieważ zmienna licznika i ma teraz wartość 2, oznacza to, że przy drugim przejściu pętli będziemy działać na wierszu 2. To wszystko, co musimy zrobić.

Ogólnie rzecz biorąc, to było bardzo proste, nieprawdaż?

Jak się okazuje, Dean miał rację: ludzkie ciało składa się głównie z wody, u osoby dorosłej jest to około 70%. W przypadku osoby ważącej 80 kg jest to około 56 kg.

 Do początku strony Do początku strony

Centrum skryptów - Systemy operacyjne