wiatr2Na wzniesieniu stoi wieża, na szczycie której montujemy czujnik zbierający informację o prędkości i kierunku wiatru. Chcemy wiedzieć, czy opłaca się zamontować prawdziwe „śmigło” i produkować prąd. Program WIATROMIERZ umożliwia wczytanie danych z czujnika, pokazanie na wykresach tzw. „wietrzności” i wyliczenie mocy wyprodukowanej przez domniemaną turbinę. Niewiele ponad 100 wierszy kodu, a zysk może być ogromny, choć okazuje się, że bardzo trudno znaleźć górkę, na której wieje długo i stabilnie.

wiatr1

wiatr3

wiatr4

Dane w urządzeniu pomiarowym zgrupowane są w tabeli zawierającej czasy prędkości i kierunki mierzonych wiatrów: 

2009-02-06 12:12

5,4

0

0

NE

N

2009-02-06 12:22

6,8

0

0

NE

N

2009-02-06 12:32

9,3

0

0

NE

N

2009-02-06 12:42

8,7

0

0

NE

N

2009-02-06 12:52

7,5

0

0

NE

N

2009-02-06 13:02

6,9

0

0

NE

N

2009-02-06 13:12

7,2

0

0

NE

N

2009-02-06 13:22

6,8

0

0

NE

N

2009-02-06 13:32

7,2

0

0

NE

N

2009-02-06 13:42

6,9

0

0

NE

N

2009-02-06 13:52

5,3

0

0

NNE

N

2009-02-06 14:02

4,8

0

0

NE

N

2009-02-06 14:12

3,9

0

0

N

N

2009-02-06 14:22

4,4

0

0

N

N

2009-02-06 14:32

3,9

0

0

N

N

2009-02-06 14:42

3,8

0

0

N

N

2009-02-06 14:52

3,8

0

0

NNE

N

2009-02-06 15:02

3,3

0

0

N

N

2009-02-06 15:12

2,7

0

0

N

N

2009-02-06 15:22

2,6

0

0

N

N

2009-02-06 15:32

4,8

0

0

NNE

N

2009-02-06 15:42

5,1

0

0

N

N

2009-02-06 15:52

4,5

0

0

N

N

2009-02-06 16:02

4,7

0

0

N

N

2009-02-06 16:12

5,1

0

0

N

N

2009-02-06 16:22

5,9

0

0

N

N

2009-02-06 16:32

5,7

0

0

N

N

2009-02-06 16:42

5

0

0

N

N

2009-02-06 16:52

5,9

0

0

NNE

N

2009-02-06 17:02

5,9

0

0

NNE

N

2009-02-06 17:12

6,2

0

0

NNE

N

2009-02-06 17:22

5,9

0

0

NNE

N

2009-02-06 17:32

5,1

0

0

NNE

N

2009-02-06 17:42

6,6

0

0

NNE

N

Kod źródłowy programu poniżej, obliczeń w komórkach prawie żadnych.

mgr inż. Wacław Libront

Sub WstawDAT()
  'otwórz okienko
  ścieżka = Application.GetOpenFilename("pliki DAT (*.DAT), *.DAT", , "Znajdź plik wiatromierza i otwórz go")
  plikDAT = Dir(ścieżka) 'wydzielić sam plik
  p = InStr(plikDAT, ".")
  plik = Left(plikDAT, p - 1)
  
  'wczytaj
  Workbooks.OpenText Filename:= _
     ścieżka, Origin:=852, StartRow:=1, DataType:=xlDelimited, TextQualifier:= _
     xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, _
     Comma:=False, Space:=False, Other:=False, FieldInfo:=Array(Array(1, 1), _
     Array(2, 1)), TrailingMinusNumbers:=True
  
  'przeniesienie do głównego
  Sheets(plik).Select
  Sheets(plik).Move After:=Workbooks("wiatromierz.xls").Sheets(2)
  Columns("A:A").ColumnWidth = 17.43
  
  'data początku i końca
  dataOD = Cells(3, 1)
  wiersz = 2
  Do
    wiersz = wiersz + 1
  Loop Until Cells(wiersz, 1) = ""
  dataDO = Cells(wiersz - 1, 1)
  
  'wpisać dane wczytanego pliku
  Worksheets("obsługa").Select
  wiersz = 1
  Do
    wiersz = wiersz + 1
  Loop Until Cells(wiersz, 13) = ""
  Cells(wiersz, 13) = plik
  Cells(wiersz, 14) = dataOD
  Cells(wiersz, 15) = dataDO
End Sub



Function SzukajDatę(arkusz, data As Variant) As Variant
  wiersz = 0
  koniec = False
  Do
    wiersz = wiersz + 1
    d = Worksheets(arkusz).Cells(wiersz, 1)
    'a gdy przeleci i nie znajdzie
    If Worksheets(arkusz).Cells(wiersz, 1) = "" Then
      MsgBox "nie ma takiej daty rozpoczęcia"
      wiersz = 1
      Exit Do
    End If
  Loop Until d >= data 'ta lub pierwsza następna
  SzukajDatę = wiersz
End Function


' dane są w jednym pliku - cały rok
' na razie ręcznie można kopiować i wklejać

Sub WyliczMOC()
On Error GoTo błąd
  dataOD = Worksheets("obsługa").Range("E4")
  dataDO = Worksheets("obsługa").Range("E5")
  rokOD = Year(dataOD)
  rokDO = Year(dataDO)
  If rokOD <> rokDO Then
    MsgBox "na razie potrafię liczyć tylko w JEDNYM ROKU"
    Exit Sub 'żeby zrobiło błąd
  End If
  
  rok = Trim(Str(rokOD))
  'a teraz wyszukaj konkretny dzień
  wiersz = SzukajDatę(rok, dataOD)
  'tutaj jest dataOD
  'na wszelki wypadek pobieramy bo może być inna
  dataOD = Worksheets(rok).Cells(wiersz, 1)
  wierszOD = wiersz
  wiersz = SzukajDatę(rok, dataDO)
  'na wszelki wypadek pobieramy bo może być inna
  dataDO = Worksheets(rok).Cells(wiersz, 1)
  wierszDO = wiersz
  
  If wierszOD > wierszDO Then
    MsgBox "coś z datami jest nie tak"
    Exit Sub
  End If
  
  Worksheets("obsługa").Range("E4") = dataOD
  Worksheets("obsługa").Range("E5") = dataDO
    
  'i teraz wreszcie można liczyć
  CzyśćObliczenia
  'róża przepisana
  For w = 4 To 19
    Worksheets("obliczenia").Cells(w, 5) = Worksheets("obsługa").Cells(w, 3)
  Next w
  
  moc = 0
  For wiersz = wierszOD To wierszDO
    prędkość = Worksheets(rok).Cells(wiersz, 2)
    Worksheets("obsługa").Range("Q1") = prędkość
    data = Worksheets(rok).Cells(wiersz, 1)
    Worksheets("obsługa").Range("E6") = data
    
    'przepisać do obliczenia
    d = Worksheets(rok).Cells(wiersz, 1)
    v = Worksheets(rok).Cells(wiersz, 2)
    k = Worksheets(rok).Cells(wiersz, 5)
    Worksheets("obliczenia").Cells(wiersz - wierszOD + 1, 1) = d
    Worksheets("obliczenia").Cells(wiersz - wierszOD + 1, 2) = v
    Worksheets("obliczenia").Cells(wiersz - wierszOD + 1, 3) = k
    Worksheets("obsługa").Range("Q2") = Trim(k)
    
    Calculate
    
    'moc
    m = Worksheets("obsługa").Range("R1")
    moc = moc + m
    
    'kierunek
    wk = Worksheets("obsługa").Range("R2")
    Worksheets("obliczenia").Cells(wk + 3, 5) = k
    Worksheets("obliczenia").Cells(wk + 3, 6) = Worksheets("obliczenia").Cells(wk + 3, 6) + 1
    Worksheets("obliczenia").Cells(wk + 3, 7) = Worksheets("obliczenia").Cells(wk + 3, 7) + v
    
    
  Next wiersz
  
  Worksheets("obsługa").Range("E7") = moc
  Worksheets("obliczenia").Range("E22") = wiersz - 1
  
  Calculate
  'arkusz prędkość
  Sheets("prędkość").SeriesCollection(1).XValues = Worksheets("obliczenia").Range("E23").Text
  Sheets("prędkość").SeriesCollection(1).Values = Worksheets("obliczenia").Range("E24").Text
  
  Worksheets("obsługa").Select
Exit Sub
błąd:
  MsgBox "nie znaleziono arkusza " & Str(rokOD) & " - zmień datę"
  Worksheets("obsługa").Select
End Sub

Sub CzyśćObliczenia()
    Sheets("obliczenia").Select
    Columns("A:C").Select
    Selection.ClearContents
    Range("E4:G19").Select
    Selection.ClearContents
    Range("A1").Select
End Sub