mle05

Moja przygoda z mleczarniami rozpoczęła się w 1997 roku. Początkowo program wspomagał rejestrowanie skupu mleka i naliczanie wypłat, a po wejściu Polski do UE został rozszerzony o system kwot mlecznych. 50 arkuszy z mnóstwem formuł, 20 formatek z oknami dialogowymi, ponad 7000 wierszy kodu i 30000 znaków. Być może teraz moi uczniowie zrozumieli, dlaczego przez tyle lat „katowałem” ich zadaniami związanymi z mleczarnią.

Jak oblicza się wypłatę dla rolnika? Mogę zdradzić sekrety, ale tylko w ogólnym zarysie. Mleczarnia skupuje od rolnika mleko i bada je na zawartość tłuszczu oraz obecność bakterii i komórek somatycznych. Na tej podstawie wyliczana jest tzw. klasa mleka - najlepiej gdyby zawsze była to klasa E, czyli ekstra. Współczynniki są tajne, wzory skomplikowane, ale bierze się pod uwagę trzy ostatnie miesiące i wylicza za pomocą średnich geometrycznych i średnich ważonych. Do wyliczenia wypłaty dla rolnika wystarczają trzy parametry: litry mleka, tłuszcz i klasa oraz szereg bonusów opisanych szczegółowo w dodatkowych parametrach. Teraz wystarczy wydrukować faktury, przelewy, szereg zestawień, itp.

{gallery}stories/2016/cyfroweprojekty_plan/mleczarnia{/gallery}

Przykładowe formuły stosowane w tabelach – w rzeczywistości rozdzielone są na mniejsze w osobnych komórkach:

Wyliczenie klasy mleka

=JEŻELI(JEŻELI(EQ13<>"";WYSZUKAJ.POZIOMO(EQ13;wspk;2;PRAWDA);"")<jeŻeli(eo13<>"";WYSZUKAJ.POZIOMO EO13;wspk;2;PRAWDA);"");JEŻELI(CZY.LICZBA(JEŻELI(CZY.LICZBA(EL13);WYSZUKAJ.POZIOMO(JEŻELI(SUMA(ED12:EG12)>0;ŚREDNIA.GEOMETRYCZNA(ED12:EG12)*1000;"")/1000;wspB;2;PRAWDA);""));WYSZUKAJ.POZIOMO(JEŻELI(SUMA(EI13:EK13)>0;ŚREDNIA.GEOMETRYCZNA(EI13:EK13)*1000;"")/1000;wspS;2;PRAWDA);"");EO13)

Wyliczenie wypłatay

=litr1*(WYSZUKAJ.POZIOMO(procent1;wspt;2;PRAWDA)*procent1+JEŻELI(CZY.PUSTA(klasa1);;WYSZUKAJ.POZIOMO(klasa1;wspk;2;))+podstawa)+litr2*(WYSZUKAJ.POZIOMO(procent2;wspt;2;PRAWDA)*procent2+JEŻELI(CZY.PUSTA(klasa2);;WYSZUKAJ.POZIOMO(klasa2;wspk;2;))+podstawa)+JEŻELI(LUB(JEŻELI(CZY.PUSTA(klasa1);;WYSZUKAJ.POZIOMO(klasa1;wspk;2;))>bez_premii;JEŻELI(CZY.PUSTA(klasa2);;WYSZUKAJ.POZIOMO(klasa2;wspk;2;))>bez_premii);litry*(WYSZUKAJ.POZIOMO(litry;wspl;2;PRAWDA)-podstawa);)+(należność1+należność2+premia+DY13)*VAT+JEŻELI(CZY.PUSTA(DW13);;dodatkowy*litry)+JEŻELI(CZY.PUSTA(DU13);;zbiornik*litry)+ JEŻELI(CZY.PUSTA(DS13);;atestacja*litry)+potrącenia+ dopłata*litry

Co to są (a właściwie były do 2015 roku) kwoty mleczne? Unia Europejska, broniąc się przed nadpodażą mleka narzuciła wszystkim krajom ograniczenia w produkcji mleka. Każdy litr wyprodukowany ponad indywidualną dla każdego rolnika kwotę mleczną skutkował nałożeniem na niego kary finansowej. W związku z tym należało przygotować program do sprostania unijnej machinie urzędniczej i wymianie danych z Agencją Restrukturyzacji i Modernizacji Rolnictwa.

mgr inż. Wacław Libront

Fragment kodu źródłowego: (tworzenie unijnego formularza P8F3) i całość dla zainteresowanych

'wypełnianie i drukowanie formularza P8f3_____________________________________________P8f3
'dane pobierane z arkusza kwotowanie
Sub FormularzP8f3()
On Error GoTo błąd
  kolumna = KtóraKolumna()
  Worksheets("personalne").Select
  Sort_nr 'posortowanie według numerów

For wojew = 4 To 19
nWoj = Trim(Worksheets("Parametry").Cells(wojew, 12))
If nWoj <> "" Then
If nWoj = "12" Then nWoj = ""

  'wyczyść obszar roboczy
  Worksheets("P8f3").Select
  Range(Cells(11, 2), Cells(1010, 13)).Select
  Selection.ClearContents
  Rows("11:1010").RowHeight = 12.75 'na wszelki wypadek od razu powrót
  Cells(1, 1).Select
  Worksheets("P8f3").Range("C3") = Worksheets("Parametry").Range("E49") & "  " & Worksheets("Parametry").Range("E50")
  Worksheets("P8f3").Range("C4") = Worksheets("Parametry").Range("E51")
  Worksheets("P8f3").Range("D6") = Worksheets("Parametry").Range("E64")
  Worksheets("P8f3").Range("F6") = Worksheets("kwotowanie").Cells(1, kolumna + 1)
  'przelatujemy po wszystkich i wybieramy tych z IKM
  w8 = 10 'ile wierszy wypełnionych w P8f3
  
  For w = 4 To 1003
    ' sprawdzamy IRZT z miesiąca, bo jeśli był kiedykolwiek to go m wpisanego w miesiącu
    irzt = Worksheets("kwotowanie").Cells(w, kolumna + 7)
    If irzt > 0 Then
         'sprawdzamy województwo
    If nWoj = "0" Or Left(Worksheets("personalne").Cells(w, 17), 2) = nWoj Then
      IKMdos = Worksheets("kwotowanie").Cells(w, kolumna + 8) 'IKM do skupienia
      sumaKGkor = FsumaKGkor(kolumna, w)
      IIRwyk = FIIRwyk(kolumna, w)
      ' trzeba znaleźć ostatniego dobrego IKM i u od tego odjąć
      'szukamy ostatniego ikm
      ikm = 0
      For k = 10 To kolumna Step 10
        a = Worksheets("kwotowanie").Cells(w, k + 8)
        If a > 0 Then ikm = a
      Next k
      ponad = 0
      sumaKGkorWYK = FsumaKGkorWYK(kolumna, w)
      ponad = -(ikm - sumaKGkorWYK)
    'powinno pokazywać nie tych co przekroczyli w tym miesiącu
    'ale tych co zapłacili do tej pory cokolwiek agencji kol-6 plus poprzednie miesiące
    'dlatego sprawdzamy sumę zaliczek
    sumaZAL = FsumaZAL(kolumna, w)
    If sumaZAL > 0 Then
      w8 = w8 + 1
      Worksheets("P8f3").Cells(w8, 2) = Worksheets("personalne").Cells(w, 3) 'nazwisko i imię
      Worksheets("P8f3").Cells(w8, 3) = Worksheets("kwotowanie").Cells(w, 6) 'nip rozsz
      Worksheets("P8f3").Cells(w8, 4) = IKMdos 'IKM do skupienia
      Worksheets("P8f3").Cells(w8, 5) = irzt 'IRZT z ostatniego miesiąca
      If ponad > 0 Then
        Worksheets("P8f3").Cells(w8, 6) = ponad
      Else
        Worksheets("P8f3").Cells(w8, 6) = 0 'ponad kwotę
      End If
      Worksheets("P8f3").Cells(w8, 7) = 0 'bez zaliczki od VIII.2010 sumaZAL
      
      'liczymy zaliczkę tylko w tym miesiącu
      sumaKGzal = Worksheets("kwotowanie").Cells(w, kolumna + 5)
      sumaKGzalpop = Worksheets("kwotowanie").Cells(w, kolumna - 10 + 5)
      KGzal = FKGzal(kolumna, w)
      Worksheets("P8f3").Cells(w8, 8) = -KGzal
      Worksheets("P8f3").Cells(w8, 11) = sumaKGzal
      Worksheets("P8f3").Cells(w8, 12) = sumaKGzalpop
      If kolumna = 10 Then
        sumaZALpop = 0
      Else
        sumaZALpop = FsumaZAL(kolumna - 10, w)
      End If
      zalMies = sumaZAL - sumaZALpop
      Worksheets("P8f3").Cells(w8, 9) = 0 'bez zaliczki od VIII.2010 zalMies

    End If 'sprawdzenie ponad
    End If 'woj
    End If 'ikm
  Next w
  Calculate 'żeby wyliczyło sumy

  'drukowanie
  Rows("11:1010").RowHeight = 12.75 'na początku
  'zertować wiersze bez wartości
  adresLG = LTrim(Str(w8 + 1))
  adresPD = LTrim(Str(1010))
  obszar = adresLG & ":" & adresPD
  Rows(obszar).RowHeight = 0
  'obszar do druku
  adresLG = "A1"
  adresPD = "I" & LTrim(Str(1015))
  obszar = adresLG & ":" & adresPD
  Range(obszar).Select
  ActiveSheet.PageSetup.PrintArea = Selection.Address
  ActiveSheet.PrintPreview
  Range("A1").Select
End If 'czy jest województwo w personalne
Next wojew 'kolejne województwa

Exit Sub
błąd:
    MsgBox "Wystąpił błąd w procedurze FormularzP8f3-Mkwotowanie"
End Sub 'FormularzP8f3