Avatar billede quark-8382 Nybegynder
07. oktober 2009 - 22:01 Der er 10 kommentarer og
1 løsning

ugedags mønster, gange dage i måneden, du fra 2 lister

Hej

Jeg har et regneark, http://www.famfrausing.dk/Kopi.xls

Hvor jeg skal have udregnet antal dage ud fra et ugedags-mønster.
I fane"Feb" vælger jeg et ugedage i B4 og skal så have udregnet antal dage på en måned i C4 ud fra data i fane"Ugedags-mønster".
Måneden er defineret i celle A1 i fane"Feb"

I fanen"ugedags-mønster" har jeg en liste over ugedage og antal dage på måned, delt op i mandage, Tirsdage, osv..
Dem vil jeg gerne have lavet en udregning ud fra.

Håber at det er til at forstå, ellers spørg løs.
Avatar billede jkrons Professor
08. oktober 2009 - 15:14 #1
Jeg er ikke helt klar over, hvad det er, du ønsker beregnet. Er det det samlede antal dage i måneden eller det samlede antal af hver ugedag, eller...

Og hvad skal ugedagsmønsteret bruges til?
Avatar billede quark-8382 Nybegynder
08. oktober 2009 - 16:04 #2
Hej

Ugedagsmønsteret skal bruges til, udregning af transport priser på måndes basis, det vil sige at en jeg har en kørsel som kun kører, mandag, tirsdag, onsdag og fredage (MaTiOnFr) denne tur koster f.eks. 500, kr. Men hvis en måned(oktober)starter en torsdag og slutter lørdag, så vil der være 17 dage hvor turen køre og en vognmand som skal have 8500,- kr. for turene.

Så vil jeg gerne ud fra "Ugemønster"  i B5 gerne have en formel som kan regne antal dage i en påglædende måned, der vil tilsidst komme 12 måneds ark, hvor der vil være angivet måned i A1.

Så det er det samlede antal dage i måneden, der skal stå i C5, ud fra det valgte ugedages mønster i B5.

Svært at forklare på skrift ;-)
Håber at det lykkes.
Avatar billede jkrons Professor
08. oktober 2009 - 16:29 #3
Måske er det bare mig, men er antallet af dage ikke det samme uanset ugedagsmønsteret?
Avatar billede tjacob Juniormester
08. oktober 2009 - 17:00 #4
Jeg tror jeg har forstået dig, men for lige at gøre det helt klart:

Hvis nu f.eks. ugedagsmønster hedder MaTiOnLø og måneden hedder Januar, så ønsker du tallet:

4 (antal mandage i januar) +
4 (antal tirsdage i januar) +
4 (antal onsdage i januar) +
5 (antal lørdage i januar) = 17

Er dette korrekt?
Avatar billede tjacob Juniormester
08. oktober 2009 - 19:21 #5
Med udgangspunkt i at #4 er korrekt:

Jeg tror at for at kunne trække ugedagene ud af dit ugedagsmønster (som er en tekststreng), så er man nødt til at bruge VBA, altså kode i Visual Basic.
Så når vi alligevel skal ind i VBA har jeg valgt at lave en brugerdefineret funktion, der løser opgaven uden opslag.

Funktionen tager to parametre: måned og ugedagsmønster:
måned: skal være det fulde danske navn for en måned (som i A1 på den første fane)
ugedagsmønster: skal være en tekststreng på et lige antal tegn, og bestå af Ma, Ti, On osv.
funktionen regner altid med det aktuelle år.

Hvis du ikke kender VBA er funktionen sikkert sort snak for dig, men den virker som den skal.
Her er funktionen:

Public Function FindAntalDage(ByVal sMåned As String, ByVal sMønster As String) As Long

    Dim i As Long, j As Long, lM As Long, lY As Long, sTmp As String
    Dim LastDay As Long, Dage As Long, UgeDag As Long, pDato As Long
    For i = 1 To 12
        If Choose(i, "januar", "februar", "marts", "april", "maj", "juni", "juli", _
                "august", "september", "oktober", "november", "december") = LCase(sMåned) Then
            lM = i
            Exit For
        End If
    Next i
    lY = Year(Now())
    LastDay = Day(DateSerial(lY, lM + 1, 0))
    For i = 1 To Len(sMønster) Step 2
        sTmp = LCase(Mid(sMønster, i, 2))
        For j = 1 To 7
            If Choose(j, "ma", "ti", "on", "to", "fr", "lø", "sø") = sTmp Then
                UgeDag = j
                Exit For
            End If
        Next j
        For j = 1 To LastDay
            pDato = DateSerial(lY, lM, j)
            If UgeDag = Weekday(pDato, vbMonday) Then Dage = Dage + 1
        Next j
    Next i
    FindAntalDage = Dage

End Function


Du bruger funktionen således:
1) Kopier funktionen og indsæt den i et tomt modul i Visual Basic (sig til hvis du skal have hjælp til dette)
2) Hvis vi tager udgangspunkt i fanen "Feb": I feltet C4 skriver du: =FindAntalDage(($A$1;B4)
$A$1 = måneden (det er vigtigt med dollartegnene for at kunne fylde ud nedad)
B4 = ugedagsmønstret i denne række.
3) 'Træk' C4 nedad for at fylde de andre celler.
Avatar billede quark-8382 Nybegynder
08. oktober 2009 - 20:58 #6
Hej

Udgangspunkt i #4 er korrekt.

Men, de data fra fanen "Ugedags-mønster" (som kommer fra kalenderen) bliver ikke brugt, så hvis vi ændrer ugedags mønster en dag ( F.eks. Kristi Himmelfartsdag=Sø og Nytårsaftensdag=Lø ) i kalenderen virker det ikke.

Er der en måde hvor jeg kan få lavet udregningen på disse data.
Avatar billede tjacob Juniormester
09. oktober 2009 - 10:19 #7
Ja, jeg havde lige overset, at der var "skæve" dage på denne måde. Nu giver BEHKNQ lige pludselig mening.

Jeg har lavet funktionen om, så den slår op i de blå felter i arket Kalender, så nu ser den sådan ud:


Public Function FindAntalDage(ByVal sMåned As String, ByVal sMønster As String) As Long

    Dim i As Long, j As Long, lM As Long, sTmp As String
    Dim Dage As Long, lRow As Long, lCol As Long
    For i = 1 To 12
        If Choose(i, "januar", "februar", "marts", "april", "maj", "juni", "juli", _
                "august", "september", "oktober", "november", "december") = LCase(sMåned) Then
            lM = i
            Exit For
        End If
    Next i
    lRow = 34
    lCol = ((lM - 1) * 3) + 2
    If lM > 6 Then
        lRow = 74
        lCol = ((lM - 7) * 3) + 2
    End If
    For i = 1 To Len(sMønster) Step 2
        sTmp = LCase(Mid(sMønster, i, 2))
        For j = lRow To (lRow + 6)
            If LCase(Sheets("Kalender").Cells(j, lCol - 1)) = sTmp Then
                Dage = Dage + Sheets("Kalender").Cells(j, lCol)
            End If
        Next j
    Next i
    FindAntalDage = Dage
   
End Function
Avatar billede quark-8382 Nybegynder
09. oktober 2009 - 13:32 #8
Hej

Så virker det, godt gået. :-)
Det er også bedre at den regner på de blå felter Kalenderen.

Hvis du kommer med et svar, så er der point ;-)

Hvis du vil sætte en kommentar på, hvor funktionen referer til A1(måneden) da den evt. skal flyttes og lidt om hvordan funktionen ellers virker. (dette er bestemt ikke en nødventighed for at få point) :-)

Super arbejde.
Avatar billede tjacob Juniormester
09. oktober 2009 - 14:15 #9
Jeg ved ikke hvordan man kan få indsat hjælp og tips til selve funktionen (i regnearket).
Jeg har også selv savnet denne mulighed med brugerdefinerede funktioner.

Men, funktionen bruges sådan:
Den kan indsættes overalt ved i en celle at skrive: =FindAntalDage(X;Y)  hvor:
X = er en reference til den celle der indeholder navnet på måneden. Referencen skal skrives med $-tegn. ELLER måneden som litteral, dvs f.eks. "januar".

Y = er en reference til den celle der indeholder navnet på ugedagsmønsteret. ELLER ugedagsmønsteret  som litteral, dvs f.eks. "MaTiOn".

Funktionen virker sådan:
For i = 1 To 12
    If Choose(i, "januar", "februar", "marts", "april", "maj", "juni", "juli", _
            "august", "september", "oktober", "november", "december") = LCase(sMåned) Then
        lM = i
        Exit For
    End If
Next i

Ovenstående kode omregner den tekststreng der er inputtet som måned om til et tal 1-12.

lRow = 34
lCol = ((lM - 1) * 3) + 2
If lM > 6 Then
    lRow = 74
    lCol = ((lM - 7) * 3) + 2
End If

Ovenstående kode finder startrækken for ugedagene (de blå felter) i arket Kalender alt efter hvilken måned det er. lRow = 34 (jan-jun) eller 74 (jul-dec).
Kolonnenummeret (med tallene) findes også i de blå felter ud fra måneden.
Januar+Juli: lCol = 2 (B)  Februar+August: lCol = 5 (E) osv

For i = 1 To Len(sMønster) Step 2
    sTmp = LCase(Mid(sMønster, i, 2))
    For j = lRow To (lRow + 6)
        If LCase(Sheets("Kalender").Cells(j, lCol - 1)) = sTmp Then
            Dage = Dage + Sheets("Kalender").Cells(j, lCol)
        End If
    Next j
Next i

Ovenstående loops er hele kernen i funktionen:

For i = 1 To Len(sMønster) Step 2
    sTmp = LCase(Mid(sMønster, i, 2))

Der steppes igennem tekststrengen (ugedagsmønsteret) for hver 2 karakterer (Step 2)
og i variablen sTmp gemmes en ugedag ("ma","ti","on" osv)

For j = lRow To (lRow + 6)
    If LCase(Sheets("Kalender").Cells(j, lCol - 1)) = sTmp Then
        Dage = Dage + Sheets("Kalender").Cells(j, lCol)
    End If
Next j

For hver ugedag (sTmp) løbes de 7 celler i arket Kalender der indeholder ugedagene:
If LCase(Sheets("Kalender").Cells(j, lCol - 1)) = sTmp Then

betyder: Hvis cellen(række j=feks.34 til 40,kolonne lCol-1) er lig sTmp, så:
Dage = Dage + Sheets("Kalender").Cells(j, lCol)

skal tælleren Dage forøges med det antal der står i cellen(række j=feks.34 til 40,kolonne lCol)

-Håber det giver mening. Det er svært at forklare.........
Avatar billede quark-8382 Nybegynder
09. oktober 2009 - 15:08 #10
Hej tjacob

Rigtig mange tak for hjælpen.

Og nu har jeg da en ide og hvad der sker i funktionen, så også rigtig mange tak der ;-)
Avatar billede quark-8382 Nybegynder
20. oktober 2009 - 23:28 #11
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
Kategori
Vi har et stort udvalg af Excel kurser. Find lige det kursus der passer dig lige her.

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