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

Functie tot op bepaalde diepte hervatten

Status
Niet open voor verdere reacties.

Joost.van.Steeg

Gebruiker
Lid geworden
9 okt 2006
Berichten
138
Ik vroeg mij af op welke wijze ik mijn sub moet verlaten zonder dat ik alles afsluit.

De huidige structuur is als volgt:

Code:
Private Sub UserForm_Activate() 
Voorbeeld
End Sub

Private Sub Voorbeeld()
ControleerData
End Sub

Private Sub ControleerData()
If Data = "" Then
    msgbox("U heeft niets ingevoerd")
    exit sub
End If
End Sub

Dit heeft tot gevolg dat ik na "Exit Sub" weer verder ga bij Voorbeeld.
Als ik "End" gebruik, dan sluit hij mijn UserForm ook af.
Ik zou willen dat de userform nog wel open blijft staan na de melding, zodat de gebruiker de data alsnog kan invoeren.
 
Wat denk ik wel een oplossing kan zijn is:
Code:
Public Sub Bool as Boolean

Private Sub UserForm_Activate() 
Voorbeeld
End Sub

Private Sub Voorbeeld()
ControleerData
   If Bool = False Then
      exit sub
   End if
End Sub

Private Sub ControleerData()
If Data = "" Then
    msgbox("U heeft niets ingevoerd")
    Bool = False
    exit sub
End If
End Sub

Maar dat lijkt me toch wel omslachtig
 
Volgens mij werkt dit ook:

Code:
Private Sub UserForm_Activate()
    If Data = "" Then MsgBox ("U heeft niets ingevoerd")
End Sub

Al de rest deleten.

Wigi
 
Ja, opzich werkt dat wel :-), maar....
Dit is een vereenvoudigde vorm van de code.
Binnen de code wordt weer gebruik gemaakt van variabelen, ik zal proberen dit in het voorbeeld te verwerken:



Code:
Public VeldNaam1 as String
Public VeldNaam2 as String

Private Sub UserForm_Activate() 
VeldNaam1 = "txtBox1"
VeldNaam2 = "txtBox2"
    Verwerken

VeldNaam1 = "txtBox3"
VeldNaam2 = "txtBox4"
  ControleerData
End Sub

Private Sub ControleerData()
   If controls(VeldNaam1).value = "" and controls(VeldNaam2).value = ""
       Then 
          msgbox("Niets ingevuld")
   End if
   Else

Verwerken
End Sub

Private Sub Verwerken()
   If controls(VeldNaam1).value = > 0 Then
      Cells(A1).value = controls(VeldNaam1).value
      Cells(A2).value = controls(VeldNaam1).value
  End if

End Sub

Ik begrijp dat het in dit geval nog steeds wel korter kan worden geformuleerd, maar dat lukt dus bij mijn huidige code niet. Ik heb het nu dus op de tweede manier opgelost. Werkt ook wel prima, maar het zou mooier zijn als je zoiets kon doen als:

Exit Sub Voorbeeld

Waarbij Voorbeeld een "level" hoger ligt dan de sub waarin je je bevindt, maar dat kan dus kennelijk niet (?).
 
Even off-topic: schrijf jij je code niet in de VBA editor? Jij hebt geen hoofdletters, je gebruikt een aantal eigenschappen verkeerd,...
 
On-topic: verder dan dit kom ik niet, waarschijnlijk omdat ik de vraag niet helemaal begrijp.

Code:
Dim VeldNaam1 As String, VeldNaam2 As String

Private Sub UserForm_Activate()
    VeldNaam1 = "txtBox1"
    VeldNaam2 = "txtBox2"
    Verwerken
    
    VeldNaam1 = "txtBox3"
    VeldNaam2 = "txtBox4"
    ControleerData
End Sub

Private Sub Verwerken()
   If Controls(VeldNaam1).Value >= 0 Then
      Range("A1").Value = Controls(VeldNaam1).Value
      Range("A2").Value = Controls(VeldNaam1).Value
  End If
End Sub

Private Sub ControleerData()
    If Controls(VeldNaam1).Value = "" And Controls(VeldNaam2).Value = "" Then MsgBox "Niets ingevuld"
    Verwerken
End Sub

Wigi
 
Ja, sorry,
In dit geval type ik het gewoon in het berichtenvenster.
Zal het volgende keer om verwarring te voorkomen in de VBA Editor typen.

Vr gr. Joost.
 
Code:
Private Sub ControleerData()
    If Controls(VeldNaam1).Value = "" And Controls(VeldNaam2).Value = "" Then MsgBox "Niets ingevuld"
    Verwerken
End Sub

In dit geval begint hij dus weer opnieuw in de functie verwerken.
Graag zou ik willen dat je in dit geval stopt met het uitvoeren van de code, zowel in de sub controleerData als in de Sub verwerken, zodat je weer terugkomt op de Userform, zodat je alsnog het invoerveld van data kan voorzien.
 
Delete Verwerken in ControleerData()

Of mis ik hier iets in de vraag?
 
Goed, ik hoop dat het hier duidelijker van wordt :-)
Dit is de huidige code en werkt nu dus met het zetten van de variabele Bool (Boolean).
Als er nu in de tweede functie een fout wordt gevonden omdat een veld niet volledig is ingevuld, hervat deze de code in het eerste gedeelte, en stopt dan weer omdat Bool = False.

Het gaat mij er dus om dat de code verder niet wordt uitgevoerd in het eerste gedeelte, maar dat de gebruiker eerst zijn fout hersteld.

Code:
'Multipage 3 [1-9] Stucadoren BLK

    If chkStucBLK.Value = True Then
        Bool = False
        DoelSheet = "StucBLk"
    
    'Voor invoer van de data de sheet van beveiliging afhalen
        Worksheets(DoelSheet).Unprotect

            'Eerste reeks
            
                    'De BesturingselementNamen toekennen aan de publieke variabelen
                    cboStelVHPnr = "cboStucBLK1"
                    tbxAantVHPnr = "tbxStucBLK1"
                    tbxStelVHPPrijsnr = "tbxStucBLKPrijs1"
                            
                    cboStelVHPMMnr = "cboStucBLKMM1"
                    tbxAantVHPMMnr = "tbxStucBLKMM1"
                    tbxStelVHPMMPrijsnr = "tbxStucBLKMMPrijs1"
                    
                        FoutRij = 1
                        Verwerken
                        
                 If Bool = True Then
                 GoTo Beeindigen
                 End If
                        
            'Tweede reeks
            
                    'De BesturingselementNamen toekennen aan de publieke variabelen
                    cboStelVHPnr = "cboStucBLK2"
                    tbxAantVHPnr = "tbxStucBLK2"
                    tbxStelVHPPrijsnr = "tbxStucBLKPrijs2"
                            
                    cboStelVHPMMnr = "cboStucBLKMM2"
                    tbxAantVHPMMnr = "tbxStucBLKMM2"
                    tbxStelVHPMMPrijsnr = "tbxStucBLKMMPrijs2"
                                        
                        FoutRij = 2
                        Verwerken
                        
                 If Bool = True Then
                 GoTo Beeindigen
                 End If
End sub

'-----------------------------------------------------------------------------
'Daadwerkelijk plaatsen
'-----------------------------------------------------------------------------

'SHEETS INVOEREN ipv "Productie invoer"


    Private Sub Verwerken()
    
    'Invoer van de types controleren
    
    If (Controls(cboStelVHPnr).Value = "" And Controls(tbxAantVHPnr).Value = "" And Controls(tbxStelVHPPrijsnr).Value = "") And (Controls(cboStelVHPMMnr).Value = "" And Controls(tbxAantVHPMMnr).Value = "" And Controls(tbxStelVHPMMPrijsnr).Value = "") Then
        Exit Sub
    
            'Indien een van de velden uit de eerste reeks wel een waarde bevat, dan
    ElseIf (Controls(cboStelVHPnr).Value <> "" Or Controls(tbxAantVHPnr).Value <> "") Then
      
        'waarden controleren


            If Controls(cboStelVHPnr).Value = "" Then
                msgGeenType
                Controls(cboStelVHPnr).SetFocus
                Bool = True
                Exit Sub
            ElseIf IsNumeric(Controls(tbxAantVHPnr).Value) = False Then
                msgGeenAantalType
                Controls(tbxAantVHPnr).SetFocus
                Bool = True
                Exit Sub
            End If
        
        'Waarden aan publieke variabelen toekennen
            TypeOnthouden = Controls(cboStelVHPnr).Value
            TypeAantalOnthouden = Controls(tbxAantVHPnr).Value
            TypePrijsOnthouden = Controls(tbxStelVHPPrijsnr).Value
    End If
     
    'Invoer van de EWZH controleren
    
        'Indien een van de velden uit de tweede reeks wel een waarde bevat, dan
    If (Controls(cboStelVHPMMnr).Value <> "" Or Controls(tbxAantVHPMMnr).Value <> "" Or Controls(tbxStelVHPMMPrijsnr).Value <> "") Then
        
        'waarden controleren
            If Controls(cboStelVHPMMnr).Value = "" Then
                msgGeenEWZH
                Controls(cboStelVHPMMnr).SetFocus
                Bool = True
                Exit Sub
            ElseIf IsNumeric(Controls(tbxAantVHPMMnr).Value) = False Then
                msgGeenAantalEWZH
                Controls(tbxAantVHPMMnr).SetFocus
                Bool = True
                Exit Sub
            End If
        
        'Waarden aan publieke variabelen toekennen
            EWZHOnthouden = Controls(cboStelVHPMMnr).Value
            EWZHAantalOnthouden = Controls(tbxAantVHPMMnr).Value
            EWZHPrijsOnthouden = Controls(tbxStelVHPMMPrijsnr).Value
    
    End If

                        'SUB Productie optellen
                            ProductieTotalen
                        'Naar sub gaan om de velden in te voeren
                            DataToevoegen
    
    'Alle velden weer leeg maken zodat na een foutmelding niet alles weer opnieuw wordt uitgevoerd.
        Controls(cboStelVHPnr).Value = ""
        Controls(tbxAantVHPnr).Value = ""
        Controls(tbxStelVHPPrijsnr).Value = ""
        Controls(cboStelVHPMMnr).Value = ""
        Controls(tbxAantVHPMMnr).Value = ""
        Controls(tbxStelVHPMMPrijsnr).Value = ""
End Sub
 
Joost, hoeveel keer ge ja nog een langere code posten? :confused:

Ik zal zien wat ik nog kan doen.
 
Sorry... vergeten te vermelden:

Code:
Beeindigen:
Exit sub
End Sub

Dit staat dan nog in het eerste gedeelte vermeld.
 
Is de vraag nu opgelost of niet? want je hebt dat al aangeduid blijkbaar.
 
Nee, de vraag is nog niet opgelost, maar ik heb het nu via een andere weg voor elkaar gekregen. Dus door het werken met Bool. Natuurlijk ben ik nog steeds wel benieuwd of het mogelijk is om via een Exit of End of Goto een functie terug te brengen naar 2 levels hoger, zonder de gehele functie te stoppen.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan