• 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.

Fout in VBA code na stop via gegevensvalidatie

Status
Niet open voor verdere reacties.

samabert

Gebruiker
Lid geworden
27 mrt 2010
Berichten
301
Hallo forumleden,

Enige tijd terug ben ik uitstekend geholpen met een VBA code die zorgt dat als er ( X ) in een cel staat je deze alleen maar kan aanpassen naar 1 of 2. Tot zover alles ok.

De cellen worden ook gecontroleerd via gegevensvalidatie op een maximum input van R (recup).
In AG6 staat hoeveel recup (aantal 6) er mag genomen worden en in AH6 het al ingevulde aantal.
De situatie is als iemand bijvoorbeeld in X6 en of Y6 een V of S intikt de code zijn werk doet en de input niet accepteert.
Zolang in cel AH6 nog niet het maximum van R (aantal 6) is bereikt, geeft dit geen probleem met de VBA code en wordt hier ook de input van R niet aanvaard.

Probleem: Als het maximum van R (aantal 6) in AH6 is bereikt en iemand in X6 of Y6 een R wilt invullen, krijg je een stop om te melden dat je aan het maximum van R zit. Bij het aanvaarden van deze stop krijg je een fout in de VBA code:

Methode Undo van object-Application is mislukt.
Op de lijn .Undo

Zelf dacht ik aan gegevensvalidatie via VBA code, maar dit lukt mij niet. Ik hoop dat mijn uitleg duidelijk is.

Graag jullie hulp en alvast bedankt.

Mvg
Marc
 

Bijlagen

  • Test.xlsm
    316,5 KB · Weergaven: 49
Werkt hier prima, zonder foutmelding dus.
Ik zie in Debug mode dat de .Undo zonder probleem wordt uitgevoerd.
Een oorzaak kan ik dus niet aangeven.
 
Laatst bewerkt:
De oorzaak is dat je de cel leeg maakt met de validatie.

Code:
 If [COLOR="#0000FF"]Not [/COLOR]Intersect(Target, Range("B6:AF19")) Is Nothing [COLOR="#0000FF"]And Target <> "" Then[/COLOR]

onderaan
Code:
end if
 
Laatst bewerkt:
@edmoor,

Indien ik in X6 of Y6 een R typ krijg ik de fout na klikken op annuleren of sluiten van de gegevens validatie messagebox.
Doe nu hetzelfde in X7 of Y7 en je krijgt geen fout omdat er nu geen messagebox tevoorschijn komt wegens nog niet aan het maximum van R gekomen te zijn.

Bedankt voor je hulp.
 
@HSV,

Ik heb de code aangepast en meermaals getest, maar krijg nog altijd dezelfde fout.
Blijkbaar krijg ik die fout ook als je in dezelfde range in andere cellen, met een waarde in, een R typt en je zit aan het maximum van R. Alleen als je in lege cellen een R typt is er geen probleem als je op annuleren klikt in de messagebox.

Bedankt voor je reactie. Ik heb de code aangepast in het nieuwe voorbeeld.
 

Bijlagen

  • Test1.xlsm
    318,2 KB · Weergaven: 38
Schrijf hier eens wat ik in je laatst geplaatste bestand moet invullen en in welke cel zodat ik de foutmelding verkrijg.
Ik heb het vooralsnog nog niet voor elkaar gekregen.
 
HSV,

Als voorbeeld nemen we rij 6.
In cel X6 en Y6 staan X.
Cellen met X mogen alleen gewijzigd worden naar 1 of 2, dit werkt.

Vul nu eens in cel X6 of Y6 een V in, dan neemt hij deze V niet aan. Kleine letters worden automatisch hoofdletters.
Vul vervolgens in cel X6 of Y6 een R in, je krijgt dan een messagebox dat je aan het maximum van de R (recup) zit. AH6 is te nog nemen R en AG6 is het ingestelde maximum te nemen R.
Als je in dit bericht op annuleren of sluiten klikt krijg je de fout melding.

Extra info: Juist ontdekt als je in rij 6 ook op een cel met een waarde, voorbeeld 1 of iets anders en je wil deze wijzigen naar R je ook deze fout kan genereren.
Wat wil zeggen als je in een rij nog niet aan 6 Recup zit is er geen probleeem, alleen als je de messagebox krijgt en stop moet aanvaarden komt de fout.

Is mijn uitleg te begrijpen, anders hoor ik het graag.

Alvast bedankt.
Marc
 

Bijlagen

  • Fout.JPG
    Fout.JPG
    78,5 KB · Weergaven: 71
Het is allemaal wel te verklaren.
Als je een R invult en je drukt op annuleren van de validatie zet deze weer een X in de cel.
Dat gebeurt niet met target, dus .Undo kan niet uitgevoerd worden.

Als je een V zet in de cel waar een X staat, wordt 'oud' een X door .undo.
En hier onder staat dat als het een X is, het oud moet worden; laat 'oud' nu net een X zijn.
Code:
If oud = "X" And nieuw <> 1 And nieuw <> 2 And .Sum(Rng) <> 12 Then
               Target.Value = oud
             Else
               Target.Value = UCase(nieuw)
            End If

De gehele code moet op de schop, maar dan moet je aangeven wat het wel moet worden.
 
Harry,

Heel erg bedankt om dit uit te zoeken. Ik vreesde ook al dat het in die richting ging gaan.
Ik ben al een hele tijd aan dit bestand bezig (ook omdat ik het heel graag doe) en het oorspronkelijke is toch al een jaar in gebruik. Toch wou ik een en ander nog verbeteren met o.a. dit als gevolg.

Daarom apprecieer ik het enorm dat je nog verder wil helpen.
Ik ga zo vlug mogelijk proberen een duidelijke uitleg te geven hoe ik het graag zou willen hebben.

Bedankt. :thumb:
Marc
 
HSV,

In het werkboek zitten 12 aparte werkbladen voor de maanden. Via een eigen login per gebruiker mag deze aangeven wanneer hij verlof of reup of iets anders wil. Wanneer deze het werkboek sluit wordt er een kopie gemaakt naar een ander werkboek om later, bij eventuele problemen, na te gaan wie wat heeft gevraagd of gewijzigd. Dit gedeelte werk helemaal. Het gaat over de range B1:AF19 voor maanden met 31 dagen.

Nu is het zo dat wij per shift altijd minsten 2 personen moeten hebben, zowel voor de dag (1), namiddag (2) als de nacht (3). De nachten worden bij de start van het nieuwe jaar al volledig vastgelegd voor het ganse jaar.

In het weekend of op feestdagen is het sowieso altijd met 2 personen. Om te voorkomen dat op een bepaalde dag er teveel verlof, recup (dat beperkt is to max 6 vrij te nemen) of iets anders behalve 1 of 2 is ingevuld en dus geen mensen beschikbaar zullen zijn, worden er bij 5 lege cellen, voor die dag (X) ingevuld, om aan te tonen dat hier moet gestopt worden met invullen. Die vijfde (X) is om een speling te hebben bij het opmaken van de planning.
Bij deze vakken met (X) mag je wel nog vrij kunnen wijzigen naar 1 of 2, de rest moet geblokkeerd worden.
In de weekends neem je zowel voor zaterdag als zondag dezelfde shift, ook als je R zet is dit voor beide dagen hetzelfde.

Het werkboek dat nu in gebruik is en volledig werkt, kon men de rode (X) toch nog wijzigen naar iets anders dan 1 of 2 en dat gaf soms problemen. Daarom via jullie hulp een aanpassing gemaakt naar het blokkeren van deze cellen en enkel via een command button de mogelijkheid om de (X) aan te passen. Dit werkt op zich, maar met het gekende probleem van de beperking van recup via data validatie.

In het nieuwe voorbeeld kan je zien hoe het zoal wordt ingevuld.

De werking: Als je nu in cel Q9 en R9 een V typt zie je hoe het werkt. Daar er in cel Q14 en R14 iemand een voorkeur aangeeft dat hij shift (1) wil werken zullen er maar 4 (X) tevoorschijn komen. Indien dit niet was ingevuld kwamen er 5 (X) tevoorschijn.

Ik heb zelf eens aan het zoeken geweest of datavalidatie niet kan via VBA code, maar ik ben daar volledig op vastgelopen.
De code voor de command button staat op blad1.

I hoop dat het duidelijk is en dat het niet teveel informatie is.
Toch nog eens vermelden dat ik dankbaar ben voor de hulp die jullie hier bieden.

Mvg.
Marc
 

Bijlagen

  • Test_FD.xlsm
    316,9 KB · Weergaven: 34
Kan je hiermee uit de voeten?

Code:
 [COLOR=#0000ff]If nieuw <> "X" Then [/COLOR].Undo   'op dit punt krijg je de fout
 
Harry,

Magic!
Het probleem dat je op een X klikt terwijl je al aan het maximum van de R (recup) zit en dan de fout code kreeg is volledig opgelost.
Als je de command button gebruikt kan je X ook veranderen. Top!

Maar, je krijgt nog altijd de fout op ( . Undo ) als je in de andere cellen dan de met X gemarkeerd een R wilt plaatsen en je ook aan het maximum zit van R (recup).
In de het nieuwe voorbeeld, als je in cel U6 een R typt krijg je de messagebox en na annuleren of sluiten klikken krijg je de fout terug op de nieuwe regel die je mij gaf op .Undo.

Denk je dat je hiervoor ook nog een oplossing kan vinden?

Nogmaals bedankt om dit gedeelte opgelost te hebben :thumb:
Marc
 

Bijlagen

  • Test_FD_2.xlsm
    319,1 KB · Weergaven: 33
En zo?
Code:
If nieuw <> "X" And cells(target.row,34) <> 6 Then .Undo
 
Harry,

Super, bedankt voor de aanpassing. :thumb:
Weer een stukje verder opgelost, indien je in andere cellen een R wilt plaatsen wanneer je al aan de limiet zit werkt het volledig zonder fouten.

Toch nog en probleem gevonden, ik probeer het zo goed mogelijk te verwoorden:

Zolang je aan 4 ( R ) zit werkt alles perfect. Zowel in de andere cellen als in de cellen met X. Dus hier kan je X niet wijzigen in iets anders dan alleen 1 of 2.
Maar eens je ( 5 ) ( R ) hebt op de teller en je gaat dan op een cel met X staan kan je de 6° R invullen, daarna kan je de je andere X terug wijzigen in iets anders zoals V, C, S. Maar je kan wel niet nog een R invullen, want dan werkt de data validatie.
Verder kan je dan ook de cellen met X waarvan in dezelfde rij het maximum R (6) is bereikt ook wijzigen naar V, S, P, Z.
Er komt op dat moment geen VBA code fout, alles blijft werken.

In het nieuwe voorbeeld testen:

Cel X6 en vul een R in, je kan niets wijzigen, dus ok
Voeg in rij 6 ergens anders dan in X een extra R in, teller van R staat nu op 5. Ga nu op X6 staan en vul een R in, dit kan eenmalig door de validatie.
Maar vanaf nu kan je in heel het werkblad op X waarvan in dezelfde rij 6 keer R is bereikt, de cel met X wijzigen in V, S, P, Z.


Zou je hier ook nog eens kunnen naar kijken?

Alvast enorm bedankt.
Marc
 

Bijlagen

  • Test_FD_3.xlsm
    320,6 KB · Weergaven: 32
Test het zo maar eens Marc.

Geen validatie meer.
 

Bijlagen

  • Test_FD_3.xlsb
    52,8 KB · Weergaven: 39
Harry,

Bedankt om het verder uit te zoeken en een nieuw voorbeeld te posten.
Ga het straks testen en hou je op de hoogte.

M.vg.
Marc
 
Harry,

Het problem uit post 14, is opgelost. Met die datavalidatie te verwijderen en jouw code werkt dit zoals het moet. :thumb:

Maar, nu werkt het automatisch opvullen met ( X ), indien er in een bepaalde kolom nog 5 resterende lege cellen over zijn niet meer. Dit werkte in de vorige versie (Test_FD_3.xlsm) nog wel.
Is het ook mogelijk om het stukje code dat als knop 14 (Blad1) gebruikt wordt dat we kunnen de ( X ) wijzigen in alle waarden, terug in te voegen in jouw laatste nieuwe code? Ik heb wat zitten proberen, maar het lukt niet helemaal bij mij.

Code:
If Sheet1.CommandButton14.BackColor = vbGreen Then

Ik hoop dat je nog zin hebt om dit laatste ook te bekijken?

Nogmaals bedankt.

Mvg.
Marc
 
Hallo Marc,

Ik heb werkelijk geen idee wat het doet in je programma, maar het staat er weer tussen.
 

Bijlagen

  • Test_FD_3 2.xlsb
    55,1 KB · Weergaven: 36
Hallo Harry,

Super!!! :thumb:
Alles werkt zoals het moet.

De ( X ) komen terug bij de 5 laatste lege cellen in een kolom.
De knop dient om de mogelijkheid te hebben ( X ) te wijzigen naar iets anders. Via een andere login en beveiligd blad kan de knop gebruikt worden.

Mag ik je nogmaals enorm bedanken voor je inspanning, geduld en het delen van jouw enorme kennis.

Mvg.
Marc
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan