Vraag over interne subverwijzing

Status
Niet open voor verdere reacties.

masala09

Gebruiker
Lid geworden
6 aug 2012
Berichten
886
Even een voorbeeldje.

Code:
Sub Voorbeeld() 'Deze sub staat in module 1

If ThisWorkbook.Worksheets("Blad1").Range("A1") > 0 Then
Goto volgende
else: exit sub
end if

Volgende:

userform1.show

Vervolg1:

(enzovoort)

Vervolg2:

(enzovoort)

End Sub

Er staan 3 ( ik weet niet hoe dit heet), routines in die naar een deel van de sub kunnen verwijzen. Namelijk: Volgende, Vervolg1 en Vervolg2.

Het is de bedoeling dat ik vanuit het userform1 terug kan gaan naar of Vervolg1 of naar Vervolg2. Binnen de sub weet ik het wel, maar is dit ook wel mogelijk vanuit een andere sub? Ik heb zitten zoeken, maar wellicht is dat omdat ik de naam van die verwijzing niet weet.

Ik heb vanuit userform1 zitten denken aan bijvoorbeeld: GoTo module1.voorbeeld.vervolg2

Maar nee hoor. Het werkt niet. Ik kan wel de sub aanroepen maar het stukje: vervolg2, lukt mij niet.
 
Laatst bewerkt:
Dat zou ik toch met een Select Case oplossen en niet met Jumplabels omdat GoTo in programmeerland een erg vies woord is.

Als je tegen een programmeur Go To Hell!!! zegt, zal hij dat Hell geen enkel probleem vinden maar je wel aanspreken op dat Go To :p
 
Je kunt beter de afhandelingscode van het userform vertakt laten uitvoeren (zoals edmoor al zei met 'select case').

en wordt deze code:

Code:
Sub Voorbeeld()
    If ThisWorkbook.sheets("Blad1").Range("A1") > 0 Then userform1.show
End Sub
 
Laatst bewerkt:
Of deze, om bij Select Case te blijven:

Code:
Sub Voorbeeld() 'Deze sub staat in module 1
    
    Select Case ThisWorkbook.Worksheets("Blad1").Range("A1")
        Case 1
            userform1.show
        Case 2
            'Code voor vervolg 2
        Case 3
            'Code voor vervolg 3
        Case Else
            Exit Sub
    End Select

End Sub
 
Laatst bewerkt:
Jumplabels, oke zo heten zij dus...... Maar eh, heel ***lig, maar wat is er dan mis met het giftige woord: GoTo Werkt dat niet goed dan?

Snb. Zo kort...... hallo. Ik dacht dat die if weer gevolgd moest worden door Else en End If. Wat ik wel snap is dat als de If zoals jij hem neerzet, bij onwaar gewoon door gaat.

Ik leer en leer en leer en leer.... elke dag weer meer en meer en meer
 
Edmoor, leuk en goed om te weten, maar zo groot is mijn project niet. Het is nog vrij duidelijk. Overigens ben ik nog niet helemaal doorgewinterd met het gebruik van select case.

Ik snap die code niet helemaal. Ik loop al meteen vanaf het begin spaak. Ik bedoel, ik heb het idee dat ik iets mis. Ik krijg geen keuze of heb geen invoer om de case te bepalen. Wat er bij Case1, Case2 en Case3 etc komt te staan dat spreekt voor zich.

Echter als ik nu de code wil gaan aanpassen naar select case dan ben ik bang dat ik heel wat moet omgooien en mijn gedachte hoe ik het wilde opzetten, moet herzien. Tevens omdat Select Case voor mij nog niet helemaal duidelijk is, ben ik bang dat ik zelf verdwaal. Als het mij duidelijk is dan zal het ongetwijfeld wel duidelijker en simpeler zijn. Tevens zal ik het dan ongetwijfeld ook gaan gebruiken. Wel ga ik hiermee zeer zeker aan de slag om mee te oefenen, maar mijn lering uit het verleden is dat je nooit meerdere structuren tegelijk moet leren. Het beste is stap voor stap omdat je enkel dan de zaken door elkaar heen kan gaan verwarren.
 
Het is inderdaad het beste om 1 structuur te gebruiken, maar daarbij moet je zeker niet kiezen voor het gebruik van Goto, ook niet in een klein projectje. Beter ten halve gekeerd dan ten hele gedwaald.
Voor een uitleg van de Select Case kun je hier kijken:
http://www.picbasic.nl/frameload.htm?http://www.picbasic.nl/beginners6.htm

Klik daar bovenin op Select Case - Beslissingen nemen.
 
Hmmm in dit project ben ik dan ten hele gedwaald. Hihi. Wordt veel aanpassen als ik de select case hierin wil gaan toepassen.

De GoTo heb ik bij knoppen al merendeel omgezet naar sheets"blad?".select ipv Goto thisworkbook. worksheet...... De GoTo heb ik over het algemeen gebruikt in dezelfde subroutines. Vandaar dat die duidelijkheid er nog wel is.

Ik ga in elk geval wel kijken naar jouw link.

Maar om even terug te komen op mijn vraag. Is het wel mogelijk om vanuit een userform te springen naar een jumplabel in een sub in een module.

Overigens ik heb nog eens zitten puzzelen met het enabled= false maken van een shape via:
Code:
shapes(1).ControlFormat.enabled = false

maar ik snap niet waarom dit niet werkt. In feite zou die moeten werken, maar op de 1 of andere manier kan hij de shape niet uitschakelen. De beveiliging die op het blad standaard staat, wordt met bewerken uitgeschakeld, maar de code doet zijn werk niet.
 
Wat ik bedoel voor de afsluitknop van het userform :

Code:
Private Sub knop_einde()
   select case m
   case 1
      ' doe dit
   case 2
     'doe dat
   End Select
End Sub
 
Je kunt nooit vanuit een userform of waarvandaan dan ook naar een jumplabel springen.
Objecten zoals een userform kunnen allen routines aanroepen.
Aan het begin van zo'n routine bepaal je dan wat er moet gebeuren.
En als dat ergens van afhankelijk is dan graag met het Select Case statement ;-)

Ook als het Event routines zijn.
 
Snb. Dan moet je toch een variabele maken? Immers de Select Case moet ergens door gestuurd worden. Hier gebruik ik tot nu toe nog de IF ELSE voor i.c.m. een checkbox waarde die ik verberg in een formulier.

Het punt is dat ik nu in Module 3 een Afsluitmodule gemaakt heb.

Code:
Sub Afsluiten()

Routinecontrole_1:
    
    'Deze routine dient om het inloggen te controleren om te bepalen of het bestand moet worden opgeslagen
    
    If frm_006.CheckBox1.Value = True Then
        ThisWorkbook.Save
        GoTo Routinecontrole_2
    Else
        GoTo Routinecontrole_3
    End If

Routinecontrole_2:

    'Deze routine dient om het bestand te controleren op een nog niet verwerkte factuur
    
    If ThisWorkbook.Worksheets("Factuur maken").Range("C12") > 0 Then
        Frm_008.Show
        Exit Sub
    Else
        GoTo Routinecontrole_3
    End If

Routinecontrole_3:
    
    'Deze routine dient om te controleren of alle werkbladen in het bestand beveiligd zijn
    
    If frm_006.lb_Bladbescherming.Caption = "Status Bladbescherming UIT" Then

        Dim wsSheet As Worksheet
        On Error Resume Next
        For Each wsSheet In Worksheets
            wsSheet.Protect "1235"
        Next wsSheet
        On Error GoTo 0
        GoTo Afsluiten
    Else
        GoTo Afsluiten
    End If

Afsluiten:

    'Deze routine zet de standaard instellingen voor excel 2007 terug en sluit het bestand volledig af
    
    With ActiveWindow
        .DisplayHeadings = True
        .DisplayWorkbookTabs = True
    End With
        
    With Application
        .DisplayStatusBar = True
        .DisplayFormulaBar = True
        .ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"",True)"
        .OnKey "%{F8}"
        .OnKey "%{F11}"
        .DisplayAlerts = False
    End With

    Application.Quit

End Sub

Wat ik nu wil bereiken is dat zodra er nog een niet verwerkte factuur wordt gezien, Formulier 8 zichtbaar wordt. Dat lukt. Je ziet dat ik dan ook Exit Sub gebruik. Zodra ik dan in Formulier 8 mijn bewerking klaar heb dan moet Sub Afsluiten afgemaakt worden vanaf: Routinecontrole_3.
 
In mijn voorbeeld in #4 kijkt de Select Case naar de waarde van Cel A1 in Blad1.
Volgens je eigen If dus.
 
Laatst bewerkt:
Edmoor heeft dus het antwoord al gegeven. Vandaar dat ik niet verder kwam. Moet ik toch iets anders bedenken en zal ik een deel van de macro moeten kopieren en plakken en in een extra sub plaatsen. Zonde. Meer type werk en een nog meer sub's.
 
Je laatste regel in #12 geeft precies aan waarom je geen Goto moet gebruiken.
 
Of heel de macro opknippen in meerdere sub's en dan vervolgens Callen.
 
Je laatste regel in #12 geeft precies aan waarom je geen Goto moet gebruiken.

Huh? Het werkt toch? Of ben ik zonder dat ik het weet blind geworden?

Aanvulling. O Nee niet het jumpen.
 
Laatst bewerkt:
Het zal wel werken inderdaad maar zelf zou ik het om eerder genoemde redenen helemaal overschijven.
De structuur die je nu gebruikt is dezelfde als welke nodig was in Qbasic ergens vorige eeuw en dat is niet voor niks verdwenen.
Als dit project nog verder uitgebreid moet gaan worden raak je op een gegeven moment het overzicht echt kwijt.

Goed bedoelde kritiek overigens.
 
Heb de macro als volgt aangepast:

Code:
Sub Bestand_Afsluiten()

Routinecontrole_1:
    
    'Deze routine dient om het inloggen te controleren om te bepalen of het bestand moet worden opgeslagen
    
    If frm_006.CheckBox1.Value = True Then
        ThisWorkbook.Save
        Call Routinecontrole_2
    Else
        Call Routinecontrole_3
    End If

End Sub

Sub Routinecontrole_2()

    'Deze routine dient om het bestand te controleren op een nog niet verwerkte factuur
    
    If ThisWorkbook.Worksheets("Factuur maken").Range("C12") > 0 Then
        Frm_008.Show
        Exit Sub
    Else
        Call Routinecontrole_3
    End If

End Sub

Sub Routinecontrole_3()
    
    'Deze routine dient om te controleren of alle werkbladen in het bestand beveiligd zijn
    
    If frm_006.lb_Bladbescherming.Caption = "Status Bladbescherming UIT" Then

        Dim wsSheet As Worksheet
        On Error Resume Next
        For Each wsSheet In Worksheets
            wsSheet.Protect "1235"
        Next wsSheet
        On Error GoTo 0
        Call Afsluiten
    Else
        Call Afsluiten
    End If

End Sub

Sub Afsluiten()

    'Deze routine zet de standaard instellingen voor excel 2007 terug en sluit het bestand volledig af
    
    With ActiveWindow
        .DisplayHeadings = True
        .DisplayWorkbookTabs = True
    End With
        
    With Application
        .DisplayStatusBar = True
        .DisplayFormulaBar = True
        .ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"",True)"
        .OnKey "%{F8}"
        .OnKey "%{F11}"
        .DisplayAlerts = False
    End With

    Application.Quit

End Sub

Vanuit Formulier 8 gebruik ik dan Call Routinecontrole_3
 
Het zal wel werken inderdaad maar zelf zou ik het om eerder genoemde redenen helemaal overschijven.
De structuur die je nu gebruikt is dezelfde als welke nodig was in Qbasic ergens vorige eeuw en dat is niet voor niks verdwenen.
Als dit project nog verder uitgebreid moet gaan worden raak je op een gegeven moment het overzicht echt kwijt.

Goed bedoelde kritiek overigens.

Geen valse gevoelens. Weer een leermomentje :D

Ik ga hem eens proberen om te toveren in een Select Case. Mag je vervolgens zelf controleren haha, maar een kleine hulp. Ik neem aan dat ik wel van iedere sub een Select Case moet maken.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan