17. marts 2009 - 09:40Der 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..
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.
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.
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
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.
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 *****************************************************
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 :-)
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
Synes godt om
Ny brugerNybegynder
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.