If Kwestie

Status
Niet open voor verdere reacties.

masala09

Gebruiker
Lid geworden
6 aug 2012
Berichten
886
Mensen even een simpel iets, maar waar ik nu al een paar dagen hoofdpijn van heb.

Het betreft een simpele If Then Else en heb ik onderstaand verkort een voorbeeld van gegeven.

Code:
With .Cells(1, 2)
    If .value < 6 Then
        If .Value = 3 And Sheets("Test").Cells(1, 3).Value = 1 Then
            MsgBox Tekst A
        ElseIf .Value = 5 Then
            MsgBox Tekst B
        Else
            If .Value <>2 Or .Value <> 4 Then 'WERKT NIET GOED.
            MsgBox Tekst C
        End If
        
        .Value = .Value + 1

        If .Value = 3 Then
            With Sheets("Test").Cells(1, 4)
                If .Value = vbNullString Then
                    .Value = Now
                    MsgBox Tekst D
                End If
            End With
        End If

        If .Value = 5 Then
            With Sheets("Test").Cells(1, 5)
                If .Value = vbNullString Then
                    .Value = Now
                    MsgBox Tekst E
                End If
            End With
        End If
    End If
End With

Korte uitleg van werking
Betreffende cel heeft standaard als waarde 0.
Zodra er een verkeerde keuze wordt gemaakt dan volgt melding C en wordt de waarde met 1 verhoogd. Zodra de waarde 2 is dan volgt melding D. Zodra de waarde 4 is dan volgt melding E.

Melding A en B zijn vervolgmeldingen indien de waarde reeds 3 is en niet voldoet aan de extra voorwaarde of indien de waarde reeds 5 is.

Wat ik tot nu toe telkens heb is dat zodra de waarde 2 is Melding C volgt en de waarde met 1 wordt opgehoogd. Hierdoor wordt de waarde 3 en volgt meteen melding D. Ik wil dus dat in deze Melding C wordt overgeslagen en meteen Melding D volgt.

In het geval met waarde 4 dient Melding C ook overgeslagen te worden, maar in plaats van Melding D, dient dan direct Melding E te volgen.

Is het een beetjes duidelijk. Het stukje code waar ik mee steggel is aangevuld met: Werkt niet goed

Alvast bedankt
 
Laatst bewerkt:
Mensen laat maar. Ik had een verkeerde denkwijze en had daardoor telkens een verkeerde vergelijking geplaatst.

De code is nu

Code:
With .Cells(1, 2)
    If [COLOR="#0000FF"].Value <> 5 [/COLOR]Then
        If .Value = 3 And DateDiff("n", Sheets("Test").Cells(1,3), Now) <= 2 Then [COLOR="#800080"][/COLOR][U][/U][I][COLOR="#008000"]'Vergelijking aangepast[/COLOR][/I]            
            MsgBox Tekst A
        Else
            If .Value <=1 Or .Value = 3 Then
            MsgBox Tekst C
        End If
        
        .Value = .Value + 1

        If .Value = 3 Then
            With Sheets("Test").Cells(1, 3)
                If .Value = vbNullString Then
                    .Value = Now
                    MsgBox Tekst D
                End If
            End With
        End If

        If .Value = 5 Then
            With Sheets("Test").Cells(1, 4)
                If .Value = vbNullString Then
                    .Value = Now
                    MsgBox Tekst E
                End If
            End With
        End If

[COLOR="#0000FF"]    Else 'Indien waarde in .Cells(1, 2) = 5
        MsgBox Tekst B[/COLOR]    
    End If

End With

Stom dat ik dit niet eerder inzag.

Echter heb ik nog wel een ander klein puntje.

Het gedeelte van de code
Code:
        If .Value = 3 Then
            With Sheets("Test").Cells(1, 3)
                If .Value = vbNullString Then
                    .Value = Now
                    MsgBox Tekst D
                End If
            End With
        End If

        If .Value = 5 Then
            With Sheets("Test").Cells(1, 4)
                If .Value = vbNullString Then
                    .Value = Now
                    MsgBox Tekst E
                End If
            End With
        End If
    End If
End With

Kan dit worden samengevoegd zodat dit stukje korter wordt?
 
Laatst bewerkt:
Weet je zeker dat bij .value 3 cells(1,4) gebruikt moet worden? Ik vraag dit omdat bij .value 5 cells (1,5) wordt gebruikt. En D en E zijn respectievelijk ook 4 en 5.
 
Even gekeken. Deze code was even uit het handje geschreven en inderdaad hier staat een klein foutje in welke jij onder andere noemde.

Ik heb de code aangepast door de eerste If routine te wijzigen en ook de vergelijking mee te nemen die in de originele code van mijn bestand staat. Misschien dat het nu wel duidelijk is. Zie Post 2.

Tevens is in de eerste If routine .Value < 6 veranderd in . Value <> 5 en de ElseIf welke in de tweede If routine stond, verschoven naar onderaan de eerste If routine en hier Else geworden. Ter herkenning heb ik de tekst blauw gekleurd. Het zal voor de werking niet uitmaken, maar ik vind het qua opzet wel duidelijker.

De gebruikte adressering .Cells is niet overeenkomend met de originele code en heeft ook niets met de teksten te maken. Tekst A tot en met Tekst E heb ik voor het gemak zo genoemd.
 
Laatst bewerkt:
Code:
With .Cells(1, 2)
  If .Value = 3 And DateDiff("n", Sheets("Test").Cells(1,3), Now) <= 2 Then msgbox "tekstA"           
  If .Value <=1 Or .Value = 3 Then MsgBox "Tekst C"
  If .Value = 2 and Sheets("Test").Cells(1, 3) = "" Then  Sheets("Test").Cells(1, 3) = now
  If .Value = 5 and Sheets("Test").Cells(1, 4) = "" Then  Sheets("Test").Cells(1, 4) = now        
  if .value <> 5 then .Value = .Value + 1
End With
 
Code:
If .Value = 3 Then
    With Sheets("Test").Cells(1, 3 )
        If .Value = vbNullString Then
            .Value = Now
            .NumberFormat = "dd-mm-yyyy hh:mm:ss"
                                        
            MsgBox D
        End If
    End With
End If

If .Value = 5 Then
    With Sheets("Test").Cells(1, 4)
        If .Value = vbNullString Then
            .Value = Now
            .NumberFormat = "dd-mm-yyyy hh:mm:ss"
                                        
            MsgBox E
        End If
    End With
End If

Omgezet naar onderstaande, maar voor mijn gevoel kan ik beter de bovenste aanhouden. Dit mede vanwege de Select en ook omdat dit niet werkt vanaf een ander blad. Sheets("Test") en diens cellen kunnen dan niet worden geselecteerd wat zou inhouden dat ik dan weer met With Sheets("Test") moet gaan werken en de code alleen maar weer langer wordt.

Code:
                            If .Value = 3 Or .Value = 5 Then
                                If .Value = 3 Then
                                    MsgBox D
                                    Sheets("Test").Cells(1, 3).Select 'Mislukt vanaf ander blad
                                ElseIf .Value = 5 Then
                                    Sheets("Test").Cells(1, 4).Select 'Mislukt vanaf ander blad
                                    MsgBox E
                                End If
                                
                                With Selection
                                    If .Value = vbNullString Then
                                        .Value = Now
                                        .NumberFormat = "dd-mm-yyyy hh:mm:ss"
                                    End If
                                End With
                                
                            End If
                        End If

SNB ook jij bedankt voor je inbreng, maar die code werkt niet goed. De optelling blijf ook plaatsvinden als het niet de bedoeling is en ook volgen er msgboxen achter elkaar wat niet de bedoeling is. Het is juist of de ene msgbox of de andere, maar geen 2 achter elkaar.
 
Laatst bewerkt:
En zo?
Code:
    Dim cel As Long
    Select Case .Value
        Case 3: cel = 3
        Case 5: cel = 4
    End Select

    If cel > 0 Then
        With Sheets("Test").Cells(1, cel)
            If .Value = vbNullString Then
                .Value = Now
                .NumberFormat = "dd-mm-yyyy hh:mm:ss"
            End If
       End With
    End If
 
Edmoor, Formidable. Code in mijn bestand omgezet naar juiste objecten en het werkt.

Zo had ik het nog niet bedacht. Het gebruik van een variabele. Echter snap ik even 1 ding nu niet. Ik gebruikte bij Case altijd Case Is = 3. Jij gebruikt gewoon Case 3. Ik wist niet dat dit ook kon. Wat is het verschil hierin. Daarbij de naam Cel.... wekt dit geen verwarring op? Ik bedoel er wordt toch ook Cell gebruikt in macro.

In ieder geval jouw code verder aangevuld met de msgboxen waarna onderstaand volgt.

Code:
Dim Cel As Long
    Select Case .Value
        Case Is = 3
            Cel = 3
            MsgBox D
        Case Is = 5
            Cel = 4
            MsgBox E
    End Select

    If Cel > 0 Then
        With Sheets("Test").Cells(1, Cel)
            If .Value = vbNullString Then
                .Value = Now
                .NumberFormat = "dd-mm-yyyy hh:mm:ss"
            End If
       End With
    End If
 
Laatst bewerkt:
Die Is = 3 wordt er door de VBE van gemaakt, die had ik er niet in gezet. Cel is de NL benaming van Cell, dus goed en op die plek wordt ook een cel bedoeld, toch? ;)
 
Jij hebt de code dus even uit het handje getikt begrijp ik uit jouw verhaal. Wel in deze kan ik je zeggen dat het wel gewoon werkt als je de Is = weg laat bij het schrijven van een code.

Over het gebruik van Cel. Ja klopt. Het grappige is als ik verder naar mijn vraag kijk, dan gebruik ik en Cel (De Nederlandse benaming) en Cell (De Amerikaanse benaming).

Maar dit was mijn bedoeling. Ik vond het namelijk onnodig om 2 keer hetzelfde te schrijven. Ik wist alleen even niet zo goed hoe en ik wilde ook de code niet te lang maken. Er zijn momenten dat het niet anders kan, maar daar was deze er niet 1 van.
 
Cel is een variabele en Cell is een verwijzing. In dit geval lijkt het verwarrend maar is het wel exact de bedoeling. Het is om die reden ook verstandig om geen correct Engels woorden als variabele te gebruiken. En dat stukje was inderdaad even uit de losse pols.
 
Laatst bewerkt:
Dat is mooi. Echter toch heb er nog wat bij gedaan. Cel = 0. Omdat de Variabele > 0 wordt bij 3 of 5 en omdat deze niet wordt gereset, blijft Cel > 0 en zal de If vergelijking telkens waar zijn en de vervolgcode vanaf nu telkens worden aangesproken. Op zicht geen probleem, maar in verband met de rest van de code en het niet wissen van het formulier ontstonden er dus een paar kleine problemen.

Niet wissen van het formulier betekent dat de variabelen na het toewijzen van een waarde, de waarde behouden tenzij je de waarde weer op 0 zet. Ik laat nu de reset in With aan het einde van de If uitvoeren. Volgens mij is dit de juiste manier. Anders hoor ik het wel.


Code:
If Cel > 0 Then
        With Sheets("Test").Cells(1, Cel)
            If .Value = vbNullString Then
                .Value = Now
                .NumberFormat = "dd-mm-yyyy hh:mm:ss"
                Cel = 0 'Reset van Variabele: Cel
            End If
       End With
    End If

Bedankt.
 
Laatst bewerkt:
Mijn stukje was ook een voorbeeld en die heb je prima in je eigen situatie verwerkt. Daar ging het om :)
 
O ja Ja. Een beetje van mijzelf en een beetje van M.*.G.*.I.E. (Reclame is niet toegestaan hihi).

Bedankt Edmoor.

Slotje volgt.
 
Nee, dat mag 'ie niet ;)
 
Hoi Edmoor,

Een maat van mij heeft het nog iets anders ingedeeld. Aan de ene kant vind ik het duidelijk, maar aan de andere kant vind ik het rommelig en niet echt leesbaar omdat de If en Select Case door elkaar heen lopen. Echter hij is van mening dat de Select Case niet overal nodig was daar je dit korter kan houden via If omdat er slechts 1 vergelijking plaatsvind en er bij True slechts een msgbox moet worden weergegeven. Daarnaast werkt het volgens hem iets sneller??

Ook heeft hij de .Value telling naar boven geplaatst.

Graag jouw mening.

Alvast bedankt.

Code:
                With .Cells(1, 2)
                    If .Value <> 5 Then
                        If .Value = 3 And DateDiff("n", Sheets("Test").Cells(1, 3), Now) <= 2 Then
                                MsgBox A
                        Else
                            .Value = .Value + 1
                            
                            Select Case .Value
                            Case Is <= 2, 4
                                MsgBox B
                            Case Is = 3, 5
                                Dim Cel As Long
                            
                                If .Value = 3 Then Cel = 3
                                If .Value = 5 Then Cel = 4

                                If Cel > 0 Then
                                    With Sheets("Test").Cells(1, Cel)
                                        If .Value = vbNullString Then
                                            .Value = Now
                                            .NumberFormat = "dd-mm-yyyy hh:mm:ss"
                                        End If

                                    End With
                                    
                                    If .Value = 3 Then MsgBox D
                                    If .Value = 5 Then MsgBox E
                                End If
                            End Select
                        End If
                    Else
                        MsgBox C
                    End If
                End With
 
Laatst bewerkt:
Er zijn meerdere manieren voor en je kan het beste gebruiken wat je zelf het makkelijkst lezen vind. Mijn voorkeur gaat uiteraard uit naar mijn manier. Er wordt in de methode van je maat meerdere keren dezelfde controle gedaan en dat is uit oogpunt van onderhoud niet echt handig.

Daarnaast zou ik zelf nooit een Dim opdracht midden in de code gebruiken. De compiler vind het geen probleem maar ik zet zelf leesbaarheid op nummer 1, juist vanwege de kwaliteit van de huidige compilers en dat geldt voor meerdere talen.
 
Laatst bewerkt:
Die controle vind 2 keer plaats op 3 en op 5. De ene is voor het waarde aan de variabele geven en de ander is er voor om te bepalen welke tekst er moet worden weergegeven. Over dit laatste viel ik ook omdat dit tijdens de eerste keer al kan worden geregeld. Echter hij is van mening dat je hiermee voorkomt dat bij het geforceerd afsluiten van het bestand de cellen definitief zijn ingevuld en dat er een gat in de "beveiliging" zou zijn gevuld. Immers zodra je in ons / jouw gemaakte code de msgbox vooraf laat weergeven, is het mogelijk het bestand geforceerd te sluiten waardoor de waarden niet ingevuld worden en er meer kansen zijn.

Leg ik het een beetje goed uit?
 
Als er angst bestaat voor foute informatie is er sowieso iets niet goed. Daarnaast kan je een controle inbouwen in de Workbook_Close sectie.
 
Werkt de Workbook Close ook bij geforceerd afsluiten dan?? Ik heb het over bij het gebruik van Ctrl Alt Del of de uitschakelaar.

Overigens als ik verder kijk vind er ook helemaal geen opslag plaats. Deze zou dan moeten plaatsvinden voor het weergeven van de MsgBox...
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan