Avatar billede Winnick Praktikant
05. juli 2012 - 09:59 Der er 19 kommentarer

fordeling af km

jeg får nogle kørselslister ind hver måned, hvor jeg har et total km og liste over hvornår folk bliver samlet og sat af.
Jeg har brug for at lave en template hvor jeg kan kopiere disse data ind - og så laver excel automatisk fordelingen af km.

eks:
           
navn          man  tir  ons ...
person a
person b
person c
afsætning a
afsætning b  - km - km - km ...
person d
person e
person f
afsætning c
afsætning d -  km - km - km ...

hvad jeg har gjort indtil videre - og som er den del jeg håber på at kunne eliminere - er at manuelt give hver linie et nummer og linien med total km et bogstav - og så bede Excel teste på det

altså:
nr  navn        man  tir  ons ...
1 person a
1 person b
1 person c
  afsætning a
t1 afsætning b  - km - km - km ...
2 person d
2 person e
2 person f
  afsætning c
t2 afsætning d - km - km - km ...

så har jeg en kode som tester på at hvis der er et tal i feltet (1) så skal den søge efter t+ det tal (t1) og hente total km og så dividere det med optællingen af 1'taller i kolonnen.Hvis der er et bogstav, så skal den summere km i en total. Den kan jeg så trække ned og så lave den beregningen.

Koden:
=HVIS(ER.TAL(A10);LOPSLAG(SAMMENKÆDNING("t";A10);$A$10:L$126;12;0)/TÆL.HVIS(A:A;A10);SUM(F10:J10))

Det virker fint - og den springer også afsætningerne over i beregningen - da de jo ikke skal tælles med.

men kan det gøres smartere? - eller er der en måde hvorpå jeg kan få lavet denne nummerering og T1, t2 etc. ud for totalen - mere automatisk, så jeg slipper for det manuelle arbejde? (som er ret omfattende når vi når ud på t25 og over)

Giver det mening?

På forhånd tak :-)
Avatar billede supertekst Ekspert
05. juli 2012 - 21:15 #1
Måske kunne VBA gøre processen mere automatisk - men det kræver nok lidt mere indsigt i formål m.v.
Avatar billede Winnick Praktikant
08. juli 2012 - 22:21 #2
Jeg forstår ikke dit spørgsmål, hvad har du brug for at oplysninger? :-)
Avatar billede supertekst Ekspert
08. juli 2012 - 22:53 #3
Til dit spørgsmål: "Giver det mening?" - nej
Avatar billede Winnick Praktikant
09. juli 2012 - 09:11 #4
hhmm - ok, hvordan får jeg så lettest gjort et excel ark tilgængelig for dig, så du kan se præcist hvad jeg sidder med?
Avatar billede supertekst Ekspert
09. juli 2012 - 09:26 #5
Du er velkommen til at sende det - @-adresse under min profil.
Avatar billede Winnick Praktikant
09. juli 2012 - 09:35 #6
vi prøver med dropbox

https://dl.dropbox.com/u/90443028/Eksempel.xls

jeg har en rutepris i toppen.
Og så regner jeg ud hvor mange km der er på ruten
og kommer derfra frem til hvad km prisen er.
Så skal jeg fordele km ud på hver person - og så regne ud hvad deres totalpris er.

hvide felter er afhentning - grå er afsætning.
Når den sidste person er sat af, er der en km pr dag som så regnes sammen til en uge-total.

Jeg håber det giver mere mening nu
Avatar billede supertekst Ekspert
09. juli 2012 - 10:04 #7
Beklager - kommer ikke videre med ovennævnte..
Avatar billede Winnick Praktikant
09. juli 2012 - 13:37 #8
det vil sige at det stadig ikke står klar hvad det er jeg har brug for?
eller at du ikke har en løsning på mit problem? :-)
Avatar billede supertekst Ekspert
09. juli 2012 - 13:52 #9
Jeg kan ikke se systematikken i dit regeark..
Avatar billede Winnick Praktikant
09. juli 2012 - 14:27 #10
ok, jeg sletter alt fra arket som ikke har med den beregning jeg skal have lavet, og prøver at forklare i flere detaljer. Så må du melde ud hvor langt du kan følge og hvor jeg smider kæden af :-)

Så hvis du henter den på ny

https://dl.dropbox.com/u/90443028/Eksempel.xls

Kolonnen "sektions nr" har jeg sat ind for at kunne lave min formel. Den laver jeg manuelt hver gang jeg indsætter nye data i templaten.

Navn = personen der bliver kørts navn (nu erstattet med bogstaver)
kolonnerne M, T, O,T, F - er ugens dage.

De hvide rækker er folk der bliver samlet op, de grå rækker er hvor folk bliver sat af.

så hvis du ser i starten der bliver a-i samlet op en efter en, derefter bliver a,b,c,d,h sat af en efter en, j bliver samlet op og j,i,g bliver sat af en efter en - herefter bliver der noteret hvor mange km denne grupper har kørt hver dag. (de rækker jeg har noteret med t i "sektion nr"

dvs at a-i har samlet kørt 52,7 km pr dag.

de rækker som har fået sektion nr 2, bliver kun kørt fredag og kører 51,8 km samlet den dag. (regnet sammen i rækken markeret t2)

de rækker som har fået sektion nr 3 bliver kørt man-tors og kører et forskelligt antal km hver dag. (regnet sammen i t3)

Det samme med sektions nr 4 osv

I kolonnen KM har jeg delt km ud på hver enkelt passager inden for et sektionsnr. Så totalen for T1 bliver delt ud på alle 1'erne, T2 på alle 2'erne osv.

Så jeg har enten brug for at kunne lave kolonnen "sektion nr"  automatisk - eller også en måde at lave det på, hvor den kan undværes totalt - den tager nemlig en evighed at lave manuelt.
Avatar billede supertekst Ekspert
09. juli 2012 - 15:30 #11
Ja - det hjalp gevaldigt - tak for det..
Avatar billede supertekst Ekspert
09. juli 2012 - 15:42 #12
Hvis du skulle forenkle det mest muligt, hvordan skulle din registrering så se ud?
Avatar billede Winnick Praktikant
09. juli 2012 - 15:55 #13
jeg indtaster følgende værdier manuelt:

Rutepris
regulering
sektion nr

KM og Pris Pr uge er formel felter

De resterende kolonner copy/paster jeg fra de excel ark jeg får ind - som ser ud som det du så først.

optimalt set så skulle templaten så automatisk give mig følgende oplysninger:

total antal km kørt
pris pr km
hvor mange km har hver person kørt
omkostning for hver person

hvis det besvarer dit spørgsmål
Avatar billede Winnick Praktikant
10. juli 2012 - 10:37 #14
og her vil jeg som sagt gerne slippe for at skulle lave fodarbejdet med med at indtaste sektion nr
Avatar billede supertekst Ekspert
10. juli 2012 - 11:39 #15
Har udarbejdet en løsning med VBA og stort set uden formler - dog p.t. med 1 sektionsnr pr. sektion (ved start - men kan nok elimineres).

Fordeling af km tager < 1 sek.

Send en mail - returnere jeg arket i neutral tilstand og med resultat.
Avatar billede Winnick Praktikant
11. juli 2012 - 10:10 #16
Andre der har nogle forslag?
Avatar billede Winnick Praktikant
24. juli 2012 - 13:13 #17
mange tak for hjælpen, Supertekst :-) smider du et svar, så smider jeg nogle point
Avatar billede supertekst Ekspert
24. juli 2012 - 13:29 #18
OBS: Afstår fra points ..

Const opsamlingFarve = -4142        'xlColorIndexNone
Const aflæsningFarve = 15

Const ruteNrKolonne = "C"
Const mandagKolonne = "G"
Const mandagKolonneNum = 7
Const totalKmKolonne = "G"
Const prisPrKmKolonne = "H"

Const kmKolonne = "M"
Const prisPrUgekolonne = "N"

Const startRæk = 10
Dim sidsteRække As Long

Dim ræk As Long
Dim totalKm As Double, sektionsNr As Integer, antalOpsamlinger As Integer, rutenr As Integer
Public Sub beregnFordelingAfKm()
    nulstilTotalKm
   
    beregnTotalKm
   
    fordelKm
End Sub
Private Sub nulstilTotalKm()
    Range(totalKmKolonne & "2:" & totalKmKolonne & "4").Select
    Selection.ClearContents
   
    Range(kmKolonne & CStr(startRæk) & ":" & prisPrUgekolonne & "65000").Select
    Selection.ClearContents
End Sub
Private Sub beregnTotalKm()
Rem find overgangen mellem sektioner og optæl denne række
    totalKm = 0
    sektionsNr = 1                                  'første sektionsnr
    Range("B" & startRæk) = sektionsNr
   
    rutenr = Range("A" & startRæk)                  'første rutenr
   
    For ræk = startRæk To 65000
Rem stopper når kolonne C & D er tom
        If Trim(Range("C" & ræk)) = "" And Trim(Range("D" & ræk)) = "" Then
            totalKm = totalKm + optælUgensKm(ræk - 1)
            sidsteRække = ræk - 1
            Exit Sub
        Else
Rem Undersøg om totalRække - grå samt talværdier i kolonnerne G-K
            If testOmTotalRække(ræk) = True Then
                If Range("C" & CStr(ræk + 1)) <> "" Then
                    sektionsNr = sektionsNr + 1
                    Range("B" & ræk + 1) = sektionsNr
                   
                    totalKm = totalKm + optælUgensKm(ræk)
                    rutenr = Range("A" & ræk + 1)
                End If
            End If
        End If
    Next ræk
End Sub
Private Function optælUgensKm(række As Long)
Dim ugeTotal As Double, ugeDag As Integer, ruteNrRække As Integer
    ugeTotal = 0
   
    For ugeDag = 1 To 5
        ugeTotal = ugeTotal + Range(mandagKolonne & række).Offset(0, ugeDag - 1)
    Next ugeDag

Rem Indsæt i KM-kolonne for rækken
    Range(kmKolonne & række) = ugeTotal
   
Rem opdater i TotalKm iflg. rutenr
    ruteNrRække = findRuteNrRække(rutenr)
    If ruteNrRække > 0 Then
        Range(totalKmKolonne & CStr(ruteNrRække)) = Range(totalKmKolonne & CStr(ruteNrRække)) + ugeTotal
        optælUgensKm = ugeTotal
    Else
        MsgBox "Rutenr.: " & CStr(rutenr) & " er ikke fundet - afbryd kørsel"
        Stop
    End If
End Function
Private Sub fordelKm()
Dim fraRæk As Integer, tilRæk As Integer, ugeTotal As Double
   
    antalOpsamlinger = 0
    fraRæk = startRæk
    rutenr = Range("A" & startRæk)
   
    For ræk = startRæk To sidsteRække
        If Range(kmKolonne & ræk) = "" Then
            If Range("C" & ræk).Interior.ColorIndex = opsamlingFarve Then
                antalOpsamlinger = antalOpsamlinger + 1
            End If
        Else
            tilRæk = ræk
            ugeTotal = Range(kmKolonne & ræk)
           
            fordelPåPersonerOpsamlinger fraRæk, tilRæk, antalOpsamlinger, ugeTotal
            antalOpsamlinger = 0
            fraRæk = ræk + 1
            rutenr = Range("A" & CStr(ræk + 1))
        End If
    Next ræk
End Sub
Private Sub fordelPåPersonerOpsamlinger(fraRæk, tilRæk, antalOpsamlinger, ugeTotal)
Dim ræk As Long, prOpsamlingKm As Double, prisPrUge As Double, ruteNrRække As Integer
Dim kol As Integer, dagAntalKm As Double, personAntalKm As Double
    ruteNrRække = findRuteNrRække(rutenr)
    prOpsamlingKm = ugeTotal / antalOpsamlinger
    prisPrUge = Range(prisPrKmKolonne & ruteNrRække) * prOpsamlingKm
    Range(kmKolonne & tilRæk).Offset(0, 1) = Range(kmKolonne & tilRæk) * Range(prisPrKmKolonne & ruteNrRække)

    For ræk = fraRæk To tilRæk
        If Range("C" & ræk).Interior.ColorIndex = opsamlingFarve Then
            personAntalKm = 0
            For kol = mandagKolonneNum To mandagKolonneNum + 4        'Mandag - Fredag
                If Cells(ræk, kol) <> "" Then
                    antalpersonerdag = beregnAntalPersonerDag(fraRæk, tilRæk, kol)
                    dagAntalKm = Cells(tilRæk, kol)
                    personAntalKm = personAntalKm + (dagAntalKm / antalpersonerdag)
                   
                End If
            Next kol
            Range(kmKolonne & ræk) = personAntalKm
            Range(kmKolonne & ræk).Offset(0, 1) = personAntalKm * Range(prisPrKmKolonne & ruteNrRække)
        End If
    Next ræk
End Sub
Private Function beregnAntalPersonerDag(fraRæk, tilRæk, kol)
Dim ræk As Integer, antal As Integer
    antal = 0
    For ræk = fraRæk To tilRæk
        If Cells(ræk, kol).Interior.ColorIndex = opsamlingFarve And _
            Cells(ræk, kol) <> "" Then
                antal = antal + 1
        End If
    Next ræk
   
    beregnAntalPersonerDag = antal
End Function
Private Function testOmTotalRække(rækkeNr)
Dim cc
Rem er rækken grå - hvis ja er der numerisk data
    If Range("C" & rækkeNr).Interior.ColorIndex = aflæsningFarve Then
        For Each cc In Range("G" & CStr(rækkeNr) & ":K" & CStr(rækkeNr)).Cells
            If IsNumeric(cc.Value) = True And cc.Value <> "" Then
                testOmTotalRække = True
                Exit Function
            End If
        Next
    Else
        testOmTotalRække = False
    End If
End Function
Private Function findRuteNrRække(rutenr)
Dim ræk As Integer
    For ræk = 2 To 4
        If Range(ruteNrKolonne & ræk) = rutenr Then
            findRuteNrRække = ræk
            Exit Function
        End If
    Next ræk
    findRuteNrRække = 0
End Function
Avatar billede supertekst Ekspert
24. juli 2012 - 13:31 #19
og selv tak..
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester