Avatar billede macho Praktikant
17. marts 2009 - 09:40 Der er 8 kommentarer og
1 løsning

Led efter noget bestemt men kun på bestemte ugedage

Jeg har en kalender, hvor datoerne står i en række (C4:AG4). Herunder har jeg flere folk med hver sin række, hvor der ud for hver enkelt kan stå f.eks. "D" eller "N" eller feltet er tomt.

Det jeg skal bruge er en formel til at tælle antal "D" for hele måneden, men kun samtidig kun hvis datoen(C4:AG4) er en mandag, tirsdag, onsdag osv...

Altså tælle antal "D"-er for alle mandage, tirsdage osv..


?
Avatar billede ExcelKen Praktikant
17. marts 2009 - 20:04 #1
Hej macho

Jeg ville lave en function, som nedenfor

Når du har lagt koden ind i et modul, kan du benytte den som en helt almindelig formel a-la SUM:

i rækken ud for hvert navn indsætter du denne formel "=TælVagter("D";1) - hvis du vil tælle vagter, der er af typen "D" og på ugedag 1 (mandag).

Pas på, når du kopierer koden nedenfor, for denne side har lagt nogle BREAK ind i teksten!

Public Function TælVagter(VagtType As String, Ugedag As Integer) As Integer
    Dim x As Variant
    Dim i As Integer
    Dim Tæller As Integer
   
    Tæller = 0
    i = ActiveCell.Row
   
    'gennemgår alle celler i datorækken
    For Each x In Range("C4:AG4")
       
        'hvis ugedagen på den aktuelle dato er lig med det valgte i formlen
        If DatePart("w", x.Value, vbMonday, vbFirstFourDays) = Ugedag Then
       
            'tjekker om den valgte vagttype er lig med det valgte i formlen
            If Cells(i, x.Column).Value = VagtType Then
                Tæller = Tæller + 1
            End If
       
        End If
       
    Next x
   
    TælVagter = Tæller

End Function


Hilsen ExcelKen
Avatar billede macho Praktikant
17. marts 2009 - 20:49 #2
Hej ExcelKen,

tusind tak for dit input - hvor er det dog dejligt, at der findes sådan nogen som dig til at hjælpe :-)

Har netop prøvet det og det virker faktisk - dog med en enkelt lille "hage":

Hvis jeg i kalenderen ændrer f.eks. et "D" til noget andet, så opdateres feltet med formlen "=TælVagter("D";1)" ikke automatisk, men først hvis jeg klikker direkte i formellinjen og klikker "Enter".
Kan det gøres mere automatisk, idet jeg vil få formlen i ca. 350 celler og det vil være praktisk umuligt at skulle gå i formellinjen og lave den med "Enter" ved ændringer.

Takker meget for din tid... :-)
Avatar billede ExcelKen Praktikant
17. marts 2009 - 21:18 #3
hmmm... Det kan jeg godt se....

Vil det altid være den samme kolonne, som resultatet skal stå i?

Hvis det er sådan, så ville jeg lave en makro, som simpelthen indsætter den rette værdi, istedet for at have en formel. Det betyder, at der kun beregnes, når du ønsker det.

Hvilken kolonne skal resultatet stå i?
Avatar billede ExcelKen Praktikant
17. marts 2009 - 21:21 #4
UPS - jeg mener: Er der en bestemt kolonne hvor du f.eks. har mandag/dagvagt, mandag/aftenvagt osv. Er det til at forstå?
Avatar billede kabbak Professor
18. marts 2009 - 08:15 #5
for at få den brugerdefineret funktion, til at opdatere, skal man lige sætte en linje ind.

som er
Application.Volatile


Public Function TælVagter(VagtType As String, Ugedag As Integer) As Integer
    Dim x As Variant
    Dim i As Integer
    Dim Tæller As Integer
  Application.Volatile 'NY Linje
    Tæller = 0
    i = ActiveCell.Row
 
    'gennemgår alle celler i datorækken
    For Each x In Range("C4:AG4")
     
        'hvis ugedagen på den aktuelle dato er lig med det valgte i formlen
        If DatePart("w", x.Value, vbMonday, vbFirstFourDays) = Ugedag Then
     
            'tjekker om den valgte vagttype er lig med det valgte i formlen
            If Cells(i, x.Column).Value = VagtType Then
                Tæller = Tæller + 1
            End If
     
        End If
     
    Next x
 
    TælVagter = Tæller

End Function
Avatar billede macho Praktikant
18. marts 2009 - 10:36 #6
Tak til kabbak for Application.Volatile, lige den del virker optimalt :-)

Desværre virker selve funktionen ikke efter hensigten:

Følgende fejl opstår:

1. Hvis måneden har færre end 31 dage bliver formelresultatet: "#VÆRDI".
2. Formlen, =TælVagter("D";1), er nu lagt ind i flere celler ud for hver medarbejder i en række. Resultatet for alle formlerne bliver ens, f.eks. "2", uanset formlen står ud i hver sin række.

Opstillingen er som følger:

Kalenderen går fra C4:AG4, hvor AG4 så er den 31., hvis ellers der er 31 dage i måneden. Hvis ikke, så er feltet tomt.

En medarbejders vagter står så i rækker under kalenderen, f.eks. fra C12:AG12, og jeg sætter så formlen =TælVagter("D";1) ind i AJ12 ud for denne MA.

Noget bud på løsning af problemerne?
Avatar billede ExcelKen Praktikant
18. marts 2009 - 13:27 #7
Hej igen Macho,

Så går vi en anden vej.....Jeg forstår dit indlæg sådan, at du til højre for måneden laver en optælling af vagterne. Det vil sige at optællingerne altid står der?
Hvis de står fast, så er det bedre at lave en Sub, som laver optællingen, når du er færdig med at taste - altså ved et tryk på en knap.

Hvis du laver følgende indtastninger:
Fra kolonne AI til AV:
i række 4 skriver skiftevis D og N
i række 3 fletter du cellerne to og to og skriver man, tirs osv
i række 2 skriver parvis 1, 2, 3 osv for ugedagene

I dit modul indsætter du koden forneden.

Tilknyt makroen "BeregnVagter" til en knap  - og VUPTI, så er beregningen der :-)

Public Function TælVagter(VagtType As String, Ugedag As Integer, Række As Integer) As Integer
    Dim x As Variant
    Dim Tæller As Integer

 
    Tæller = 0
   
    'gennemgår alle celler i datorækken
    For Each x In Range("C4:AG4")
       
        If IsDate(x.Value) = False Then Exit For
       
        'hvis ugedagen på den aktuelle dato er lig med det valgte i formlen
        If Val(DatePart("w", x.Value, vbMonday, vbFirstFourDays)) = Ugedag Then
       
            'tjekker om den valgte vagttype er lig med det valgte i formlen
            If Cells(Række, x.Column).Value = VagtType Then
                Tæller = Tæller + 1
            End If
       
        End If
       
    Next x
   
    TælVagter = Tæller

End Function



Sub BeregnVagter()

    Dim Y As Variant
    Dim Medarbejdere As Integer

Application.ScreenUpdating = False


'tæller medarbejdere **************************
    Medarbejdere = 0
    For Each Y In Range("B5:B500")
        If Y.Value = "" Then Exit For
   
        Medarbejdere = Medarbejdere + 1
    Next Y
'tæller medarbejdere **************************


'tildeler hver celle en værdi for optællingen *****************************************************
    For Each Y In Range(Range("AI5:AV5"), Range("AI5:AV5").Offset(Medarbejdere - 1, 0))
        Y.Value = TælVagter(Cells(4, Y.Column).Value, Cells(2, Y.Column).Value, Y.Row)
    Next Y
'tildeler hver celle en værdi for optællingen *****************************************************

Application.ScreenUpdating = True

End Sub


Mange hilsner fra Excel Ken
Avatar billede macho Praktikant
18. marts 2009 - 14:14 #8
Hvor er det super... det er bare 112% i orden nu :-)

Efter at have rettet det her:

'tildeler hver celle en værdi for optællingen *****************************************************
    For Each Y In Range(Range("AI5:AV5"), Range("AI5:AV5").Offset(Medarbejdere - 1, 0))
        Y.Value = TælVagter(Cells(4, Y.Column).Value, Cells(2, Y.Column).Value, Y.Row)
    Next Y
'tildeler hver celle en værdi for optællingen *****************************************************

til dette:

'tildeler hver celle en værdi for optællingen *****************************************************
    For Each Y In Range(Range("AI5:AV25"), Range("AI5:AV25").Offset(Medarbejdere - 1, 0))
        Y.Value = TælVagter(Cells(4, Y.Column).Value, Cells(2, Y.Column).Value, Y.Row)
    Next Y
'tildeler hver celle en værdi for optællingen *****************************************************

for jeg alle medarbejdere med i optællingen, ellers var det kun i række 5, der blev talt vagter.

Endnu en gang tusind tak for hjælpen - du har sparet mig for RIGTIG meget manuel tælleri :-)
Avatar billede ExcelKen Praktikant
18. marts 2009 - 14:44 #9
Hej igen - tak for points,

Men jeg undrer mig over din rettelse...
Min kode er dynamisk, så uanset antallet af medarbejdere (under 500), så vil optællingen udvide sig til det rette antal. Det gør det i hvert fald her hos mig :)

Men det vigtigste er, at du har fundet løsningen.

Hilsen ExcelKen
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