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

Voorkomen dat userform wordt afgesloten met het kruisje

Status
Niet open voor verdere reacties.

gGerretje

Gebruiker
Lid geworden
12 mrt 2008
Berichten
476
Beste helpers,

In mijn bestand zit een userform waar codes moeten worden ingevoerd (met een barcode-scanner).
Als ze gescand zijn voer ik een controle uit (ze moeten allemaal met een bepaalde cijfercombinatie beginnen). Foute codes moeten dan opnieuw worden gescand.
Vervolgens kan de gebruiker kiezen voor bevestigen (als alles goed is ingevuld) of annuleren (de velden worden dan gewist en het formulier wordt afgesloten).

Echter: de gebruiker kan alle controles gewoon omzeilen door op het kruisje te klikken.
Dan blijven de foute codes van het formulier (ten onrechte) gekoppeld aan de cellen op het werkblad.
Dat wil ik voorkomen.

Is daar een simpele oplossing voor?
Alvast bedankt voor jullie hulp

Met vriendelijke groeten
Ger
 
Dat kan:
Code:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    Cancel = True
End Sub
 
Code:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    M_controlemacro
    Cancel = True
End Sub
 
Hallo Ed,

Had ik al eens gezegd dat je geweldig bent.
En snel ook.
Bij deze: het mag best wel eens gezegd worden.

@SNB: geldt ook voor jou hoor.

Ik had amper de tijd om de plantjes water te geven of jullie oplossingen zijn er al.

Geweldig bedankt.
Groetjes,
Ger
 
Ik zet in de Queryclose gebeurtenis meestal dezelfde code die uitgevoerd wordt als op de knop 'vervolg' wordt gedrukt.
 
Hallo Ed en SNB,

Ik dacht dat ik er al was met jullie tips dus ik beschouwde de vraag al als opgelost.
Er is echter een probleempje.

Als ik die Cancel = true toevoeg kom ik daarna ook niet meer met mijn bevestigen- of annuleren-knop uit mijn userform.

Code:
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    Cancel = True
End Sub

Private Sub cmd_Annuleren2_Click()
    txt_BronPallet1van2.Value = ""
    txt_BronPallet2van2.Value = ""
    txt_DoelPallet1van2.Value = ""
    txt_DoelPallet2van2.Value = ""
    KleurenInstellen
    CodeVeldenLeegmaken
    Unload Me
End Sub

Private Sub UserForm_Activate()
    KleurenInstellen
End Sub

Sub KleurenInstellen()
    txt_BronPallet1van2.BackColor = RGB(255, 255, 255)
    txt_BronPallet1van2.ForeColor = RGB(102, 102, 153)
    'etc.
End Sub

Private Sub cmd_Bevestigen2_Click()
'KleurenInstellen
    If Left(txt_BronPallet1van2.Value, 12) <> "000871073940" Then
        txt_BronPallet1van2.BackColor = RGB(255, 0, 0)
        txt_BronPallet1van2.ForeColor = RGB(255, 255, 255)
        txt_BronPallet1van2.SetFocus
        txt_BronPallet1van2.SelStart = 0
        txt_BronPallet1van2.SelLength = Len(txt_BronPallet1van2)
        GoTo NietAfsluiten
    End If
    If Left(txt_BronPallet2van2.Value, 12) <> "000871073940" Then
        'etc net als bij de vorige
    End If
    If Left(txt_DoelPallet1van2.Value, 12) <> "000871073940" Then
        'etc net als bij de vorige
    End If
    If Left(txt_DoelPallet2van2.Value, 12) <> "000871073940" Then
         'etc net als bij de vorige
    End If

    Unload Me
    'frm_ScanForm2.Hide
NietAfsluiten:
End Sub

De suggestie van SNB leek mij wel mooi, maar ook dan krijg ik mijn formulier niet meer afgesloten.

Moet ik die Cancel - True misschien eerst ergens terug veranderen in Cancel = False ??
 
Je moet dus in de Sub UserForm_QueryClose controleren of je Cancel op True of op False wilt zetten.
Vandaar het voorbeeld van snb.
 
Bekijk bijlage test_v3.9.zip
Bijgaand het voorbeelbestandje.
Ik hoop dat ik genoeg heb weggehaald om het te kunnen uploaden (qua grootte) en niet teveel (zodat het nog werkt)

@ Ed: ik had heb dus op True gezet (zie mijn eerdere code), maar toen kon ik ook niet meer met de andere knoppen uit het formulier.

Ik heb nu die Cancel = True vervangen door die coderegel uit de link van SNB. Dus:

Code:
If CloseMode <> 1 Then Cancel = 1
en die blijkt wel te werken.
Nu werkt het kruisje niet meer en met de andere knoppen kan ik het formulier nu wel afsluiten.

Maar wat zegt deze coderegel nu eigenlijk in gewone woorden?
 
Met Alleen Cancel = True vertel je Excel dat de actie het formulier te sluiten niet mag worden uitgevoerd.
Vandaar mijn opmerking in #5, in die link staat het antwoord op je laatste vraag.

Cancel = 1 is overigens hetzelfde als Cancel = True.
 
O, sorry Ed, jij had die link geplaatst.

Dat van die 1 = true was me wel duidelijk.

Maar in feite zet je nu die Cancel op 1 ALS closemode niet op 1 staat.
En ongelijk aan 1 betekent volgens die link dat het afsluiten dan via de code wordt geregeld. Toch?

Waarom werkte het afsluiten dan niet toen ik alleen Cancel = true in mijn code had staan?
Ik probeer nu gewoon even te begrijpen wat ik aan het doen ben.
 
CloseMode kan je niet zetten, dat is een Read Only attribuut. Die kan je dus alleen opvragen in de sub UserForm_QueryClose. Als deze 1 is betekent het dat het sluiten van het formulier werd geïnitieerd vanuit een VBA routine en in dit geval is dat dan toegestaan. In elk ander geval, dus als CloseMode 0, 2 of 3 is, wordt Cancel NIET op True of 1 gezet.
 
Geïnitieerd vanuit een VBA-routine ...
Dan wordt de afsluitregel Unload Me dus op een of andere manier in de code herkend om die constante te bepalen?

En als ik nergens een code zou opnemen om het formulier af te sluiten, krijgt die constante dan een andere waarde?
 
Het is geen constante. De opdracht Unload roept de QueryClose routine aan en geeft de CloseMode parameter de waarde 1. Als je op het kruisje klikt wordt ook de QueryClose routine aangeroepen door de systeemfunctie die door de klik op het kruisje wordt geactiveerd en die geeft CloseMode de waarde 0.

In de link staat uitgelegd wat CloseMode 2 en 3 betekenen.
 
Het is me duidelijk Ed.

Je hebt me weer geweldig geholpen.
Dank ook aan de anderen voor jullie bijdrage.

Met vriendelijke groeten,
Ger
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan