• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

lange select case verkleinen.

Status
Niet open voor verdere reacties.

glda19

Gebruiker
Lid geworden
14 jan 2008
Berichten
901
Hi
Ik heb een zeer lange select.
Dit komt omdat het systeem van het werk veel mogelijke codes voor afwezigheid op het werk gebruik
Voor als afwezigheid bv kredietdag kredietdag voormiddag krediet namiddag
Enz en dan voor als we in een andere werkplaats moeten werken bv zending voor een ganse dag zending voormiddag zending namiddag.

Ik dacht de select case te verkleinen door na te gaan of er voormiddag of namiddag in de naam van de gekozen afwezigheid voorkomt.
En via de gekozen afwezigheid ode deze op te zoeken op het database zodat op het database de nieuwe waarde per code komt te staan.

Maar er is één probleem er zijn enkele afwezigheidscodes die een maximum hebben.
Bv per jaar hebben we 13 krediet dagen die we per dag of halve dag mogen opnemen.
Dus wil ik na of er niet meer kredietdagen gekozen zijn dan het maximum toegelaten dagen.
Maar hoe las ik het op voor bv zending. Dit heeft geen maximum

Ik dacht ik maar een case met voormiddag of namiddag.´

Of zou ik de keuzelijst op het lint kunnen aanpassen als er een afwezigheidscode met een maximum is opgebruikt deze uit de lijst verdwijnt
 
Laatst bewerkt:
werken met geneste select cases ???
Code:
     Select Case i
          Case Is < 0
               MsgBox i                                         ' ... doe hier eerst iets voor alle gevallen kleiner dan 0
               Select Case i         ' en daarna specifieker voor ieder geval                                '
                    Case Is < -10
                    Case -10 To 0
               End Select

          Case 0 To 10
               MsgBox i                                         ' ... doe hier iets voor alle gevallen 0-10
               Select Case i
                    Case 0
                    Case 1, 4, 6, 8
                    Case Else
               End Select

          Case "a", "b", "c", "d", "e"

     End Select
 
Laatst bewerkt:
Wist niet dat je meerdere voor waarde kunt zetten bij een case ga het zo oplossen
 
ik vind het zo snel niet terug, maar ik dacht dat je tot 7 niveaus diep mocht gaan met nested select case.
Dat is dus al een hele serieuze boomstructuur.
Maar of dat er overzichtelijker op wordt ?
In mijn voorbeeld, 1e niveau deed je select case op i, maar het 2e niveau kan je op een andere voorwaarde doen.
Dus doe je misschien 1e niveau, voormiddag, namiddag of de hele dag en het 2e niveau de reden of omgekeerd.
 
Laatst bewerkt:
Het probleem is eigenlijk dat ik bij bepaalde keuze moet controleren of ze geen dagen afwezigheid te veel hebben genomen.
Dus kan ik beter een case als volgt maken kredietdag , kredietdag voormiddag, kredietdag namiddag
@ cow18
Wat doet die case is?
 
Het zou handig zijn als je je code hier plaatste, dan weten we waar je het eigenlijk over hebt.
Denk ook eens aan een If, ElseIf structuur. Daarin kan je gebruik maken van de Like Operator:
Code:
    If waarde Like "kredietdag*" Then
 
@jkpieterse, die vraag om de code stel je beter niet, 't is spaghetti.

Mogelijkheid, maar best is vooraf een beslissingboom te maken
Code:
     Waarom = "kredietdag"

     Select Case Waarom
          Case "kredietdag", "kredietdag voormiddag", "krediet namiddag"
               dagen = 123 - Range("A10").Value
               MsgBox "het aantal gebruikte kredietdagen is nog : " & dagen
               Select Case Sgn(dagen)                           'wat is het teken van dagen ? (pos, nul, neg)
                    Case -1: MsgBox "je hebt er al te veel gebruikt"
                    Case 0: MsgBox "je hebt er geen meer"
                    Case 1: MsgBox "'t is goed"
               End Select

          Case "zending voor een ganse dag", "zending voormiddag", "zending namiddag"



     End Select
nog een opmerking, bovenaan iedere module waar je van die stringvergelijkingen ( if string1=string2, select Case, ...) doet, zet je best als allereerste regel "Option compare Text"
probeer bovenstaande code anders eerst een keer met Waarom = "KrEdIeTdAg" en daarna met die "option compare text".
Dat ene regeltje maakt dat die ene module hoofdletterongevoelig reageert.
 
Laatst bewerkt:
Sorry voor de zeer late reactie.
Maar komt de zware problemen op het werk.
Mij hoofd stond niet naar programmeren en nu eigenlijk nog niet.

Hoe zou ik dit kunnen vereenvoudigen
Is de eerste keuze die ze kunnen maken. Ander op zelfde manier

Als ik de namen van de andere case achter de eerste zet dan zit ik in het probleem
Code:
Select Case StrAfwezigheidsCodeKeuze
       
    Case "Kredietdag"           'Kredietdag (KD)
          
        Set KleurcodeAdres = ActiveSheet.Range("T14")
        DblAantalPerAfwezigheidsCode = ActiveSheet.Application.WorksheetFunction.Sum(Range("z5:z6").Value)
        StrSoortSymboolDagdeel = "Rechthoek"
        IntAantalCellenInBereik = RngAfwezigheidsbreik.Cells.Count ' Telt het aantal cellen in het geselecteerde bereik
        
        ' Nakijken of je geen dagen te veel hebt geselecteerd.
        DblTeveelDagenAfwezigheid = TellenAantalAfwezigheidscodes(DblAantalPerAfwezigheidsCode, IntAantalCellenInBereik, StrAfwezigheidsCodeKeuze)
        If DblTeveelDagenAfwezigheid < 0 Then Exit Sub
        
        ' Tekenen van de juiste vorm
        ' Nieuwe aantal Afwezigheidscode wegschrijven op het datablad op de overeenkomstige rij
        Call TekenenSymboolVerlof(RngAfwezigheidsbreik, StrSoortSymboolDagdeel, StrAfwezigheidsCodeKeuze, KleurcodeAdres)
        Worksheets("Datablad").Range("c24").Value = DblAantalafwezigheidsCodeGenomen + IntAantalCellenInBereik
          
    Case "Kredietdag voormiddag"    'Kredietdag voormiddag (KD VM)
        
        Set KleurcodeAdres = ActiveSheet.Range("T14")
        DblAantalPerAfwezigheidsCode = ActiveSheet.Application.WorksheetFunction.Sum(Range("z5:z6").Value)
        StrSoortSymboolDagdeel = "Driehoek VM"
        IntAantalCellenInBereik = RngAfwezigheidsbreik.Cells.Count ' Telt het aantal cellen in het geselecteerde bereik
        
        ' Nakijken of je geen dagen te veel hebt geselecteerd.
         DblTeveelDagenAfwezigheid = TellenAantalAfwezigheidscodes(DblAantalPerAfwezigheidsCode, IntAantalCellenInBereik, StrAfwezigheidsCodeKeuze)
        If DblTeveelDagenAfwezigheid < 0 Then Exit Sub
    
        ' Tekenen van de juiste vorm
        ' Nieuwe aantal Afwezigheidscode wegschrijven op het datablad op de overeenkomstige rij
        
        Call TekenenSymboolVerlof(RngAfwezigheidsbreik, StrSoortSymboolDagdeel, StrAfwezigheidsCodeKeuze, KleurcodeAdres)
        Worksheets("Datablad").Range("c25").Value = DblAantalafwezigheidsCodeGenomen + IntAantalCellenInBereik / 2
       
    Case "Kredietdag namiddag"    'Kredietdag namiddag (KD NM)
        
        Set KleurcodeAdres = ActiveSheet.Range("T14")
        DblAantalPerAfwezigheidsCode = ActiveSheet.Application.WorksheetFunction.Sum(Range("z5:z6").Value)
        StrSoortSymboolDagdeel = "Driehoek NM"
        IntAantalCellenInBereik = RngAfwezigheidsbreik.Cells.Count ' Telt het aantal cellen in het geselecteerde bereik
        
        ' Nakijken of je geen dagen te veel hebt geselecteerd.
        DblTeveelDagenAfwezigheid = TellenAantalAfwezigheidscodes(DblAantalPerAfwezigheidsCode, IntAantalCellenInBereik, StrAfwezigheidsCodeKeuze)
        If DblTeveelDagenAfwezigheid < 0 Then Exit Sub
        
        ' Tekenen van de juiste vorm
        ' Nieuwe aantal Afwezigheidscode wegschrijven op het datablad op de overeenkomstige rij Call TekenenSymboolVerlof(RngAfwezigheidsbreik, StrSoortSymboolDagdeel, StrAfwezigheidsCodeKeuze, KleurcodeAdres)
        Call TekenenSymboolVerlof(RngAfwezigheidsbreik, StrSoortSymboolDagdeel, StrAfwezigheidsCodeKeuze, KleurcodeAdres)
        Worksheets("Datablad").Range("c26").Value = DblAantalafwezigheidsCodeGenomen + IntAantalCellenInBereik / 2
 
Laatst bewerkt:
Ik zie het een en ander aan herhalende statements, moet het niet dit zijn:
Code:
    Dim doelCel As Range
    
    Set KleurcodeAdres = ActiveSheet.Range("T14")
    DblAantalPerAfwezigheidsCode = ActiveSheet.Application.WorksheetFunction.Sum(Range("z5:z6").Value)
    IntAantalCellenInBereik = RngAfwezigheidsbreik.Cells.Count    ' Telt het aantal cellen in het geselecteerde bereik
    ' Nakijken of je geen dagen te veel hebt geselecteerd.
    DblTeveelDagenAfwezigheid = TellenAantalAfwezigheidscodes(DblAantalPerAfwezigheidsCode, IntAantalCellenInBereik, StrAfwezigheidsCodeKeuze)
    If DblTeveelDagenAfwezigheid < 0 Then Exit Sub
    
    Select Case StrAfwezigheidsCodeKeuze

    Case "Kredietdag"           'Kredietdag (KD)

        StrSoortSymboolDagdeel = "Rechthoek"

        Set doelCel = Worksheets("Datablad").Range("c24")

    Case "Kredietdag voormiddag"    'Kredietdag voormiddag (KD VM)

        StrSoortSymboolDagdeel = "Driehoek VM"
        Set doelCel = Worksheets("Datablad").Range("c25")

    Case "Kredietdag namiddag"    'Kredietdag namiddag (KD NM)

        StrSoortSymboolDagdeel = "Driehoek NM"
        Set doelCel = Worksheets("Datablad").Range("c26")

    End Select
    
        ' Tekenen van de juiste vorm
        ' Nieuwe aantal Afwezigheidscode wegschrijven op het datablad op de overeenkomstige rij
        Call TekenenSymboolVerlof(RngAfwezigheidsbreik, StrSoortSymboolDagdeel, StrAfwezigheidsCodeKeuze, KleurcodeAdres)
        doelCel.Value = DblAantalafwezigheidsCodeGenomen + IntAantalCellenInBereik
 
Laatst bewerkt:
A ja, dan moet dat statement wel tussen de Case statements blijven.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan