Kategorie szkoleń | Egzaminy | Kontakt
  • 1
  • 0
  • 1


Chciałabym obliczyć koszt wszystkich utworów przy założeniu, że:

-za pierwsze 20 utworów o czasie do 6 minut 100 zł

-za kolejne(od 21-100) o czasie do 6 minut  4 zł za utwór

-za utwory o czasie powyżej 6 minut - 1 zł za każdą rozpoczynającą się minutę jednak nie mniej niż 100 zł

 

Załączniki

  • xlsx

    xls-czas.xlsx ( 11K )
Sonia_Zgórzak
  • Zapytał
  • @ Sonia_Zgórzak | 15.01.2021
    • 0
    • 0
    • 0
Zaloguj się aby zadać pytanie
Pokrewne

Odpowiedź (1)

  • 0

Formułami zapewne też da się to zrobić, ale w XXI wieku mamy do tego lepsze narzędzia :) Załączam dwie moje propozycje:

1) VBA

Option Explicit

Sub koszty()
Dim licz_6m As Long, licz_do As Long, licz_do2 As Long
Dim dlugosc As Long, suma As Long, koszt As Long, i As Long
Dim m As Long, ost As Long, arr, arr_out(), a

'inicjuję wartości początkowe
licz_6m = 0
licz_do = 20
licz_do2 = 100
dlugosc = 6
suma = 0
koszt = 0
i = 0

With ThisWorkbook.Worksheets("VBA")
   'uzupełniam nagłówek nowych kolumn
   .Range("D1:F1").Value2 = Array("minuty", "koszt", "suma")
   'określam ostatni wiersz danych
   ost = .Cells(.Rows.Count, 1).End(xlUp).Row
   'ustawiam wielkość tabeli wyjściowej
   ReDim arr_out(ost - 2, 2)
   
   'przepisuję czasy trwania do zmiennej
   arr = Range("C2:C" & ost).Value
   
   'uruchamiam pętlę dla każdego czasu trwania
   For Each a In arr
      
      'przeliczam długość utworu w minutach
      m = a * 24 * 60
      'zeruję koszt
      koszt = 0
      
      'sprawdzam długość utworu i obliczam jego koszt
      If m <= dlugosc Then
         'dla utworów do 6 min obliczam koszt według kolejności wystąpienia
         'warunki kosztów wg kolejności (licz_do2, licz_do) trzeba ustawić wmalejąco
         Select Case licz_6m
            Case 0:
               koszt = 100
            Case Is >= licz_do2:
               'tu musisz ustawić koszt dla krótkiego utworu powyżej setnego
               koszt = 4
            Case Is >= licz_do:
               koszt = 4
            Case Else:
               koszt = 0
         End Select
      
         'zwiększam licznik krótkich
         licz_6m = licz_6m + 1
      Else
         'obliczam koszt długiego utworu
         koszt = Application.Max(100, m)
      End If
      
      'zwiększam sumę bieżącą
      suma = suma + koszt
      
      'uzupełniam tablicę wyjściową
      arr_out(i, 0) = m
      arr_out(i, 1) = koszt
      arr_out(i, 2) = suma
      i = i + 1
   Next
   
   'przepisuję wyliczenia do arkusza
   .Range("D2").Resize(ost - 1, 3).Value2 = arr_out
End With

MsgBox "Gotowe, koszt całkowity to " & arr_out(ost - 2, 2) & " zł."

End Sub

2) Power Query

let
    Źródło = Excel.CurrentWorkbook(){[Name="Tabela1"]}[Content],
    #"Zmieniono typ" = Table.TransformColumnTypes(Źródło,{{"czas trwania", type time}}),
    #"Dodano kolumnę minuty" = Table.AddColumn(#"Zmieniono typ", "minuty", each if [czas trwania] <= #time(0,6,0) then 1 else Number.RoundDown(Number.From([czas trwania])*24*60)),
    lista = List.Buffer(#"Dodano kolumnę minuty"[minuty]),
    koszt = List.Buffer(List.Generate(() => [i = -1, l = lista{0}, do6 = 0, suma = 0],
        each [i] < List.Count(lista),
        each [i = [i] + 1,
            l = lista{i},
            do6 = [do6] + (if l = 1 then 1 else 0),
            pow6 = if l > 1 then List.Max({l, 100}) else 0,
            suma = if l > 1 then pow6 else (if do6 = 1 then 100 else if do6 > 20 then 4 else 0)],
        each [suma])),
    suma = List.Buffer(List.Generate(() => [i = 0, suma = 0], each [i] < List.Count(koszt), each [i = [i] + 1, suma = [suma] + koszt{i}], each [suma])),
    #"Dodano kolumnę koszt" = Table.AddColumn(#"Dodano kolumnę minuty", "koszt", each koszt{[lp]}),
    #"Dodano kolumnę suma" = Table.AddColumn(#"Dodano kolumnę koszt", "suma", each suma{[lp]})
in
    #"Dodano kolumnę suma"

 

Załączniki

  • xlsm

    xls-czas.xlsm ( 31K )
Mirosław_Janiak
  • Odpowiedział
  • @ Mirosław_Janiak | 12.02.2021
    • 1
    • 7
    • 1