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

Klassemodule probleem

Status
Niet open voor verdere reacties.

AD1957

Verenigingslid
Lid geworden
27 feb 2016
Berichten
2.154
Probeer de checkboxen in de userform groen of rood te kleuren afhankelijk van true of false.
Dit lukt prima.
Echter de Textboxen kleuren ook. Krijg het maar niet opgelost.
 

Bijlagen

Code:
Private Sub ButtonGroup_change()
Dim ctrl As Control

For Each ctrl In Frm_RapportVPH.Controls
    If TypeName(ctrl) = "CheckBox" Then
        If ctrl.Value = True Then
            ctrl.BackColor = vbGreen
        Else
            ctrl.BackColor = vbRed
        End If
    End If
Next ctrl

End Sub
 
@silvester-ponte, @snb
Beiden bedankt voor de oplossing.

@snb Het is de eerste keer dat ik met een klassemodule werk, wil me dit eigen maken.
Bedankt voor de link, met andere problemen heb ik daar al heel veel geleerd.:thumb:
 
@snb: lekker korte code weer :-) Ik vind wel dat je niet een klasse instantie moet maken voor iedere control op het formulier als je alleen CheckBox-en met een klasse verbindt. Ook ben ik geen voorstander van de constructie "Userform1.Show" dus gebruik makend van de klasse naam van de userform in plaats van een object variabele te gebruiken.
 
Ik vind wel dat je niet een klasse instantie moet maken voor iedere control op het formulier als je alleen CheckBox-en met een klasse verbindt.

Kun jij in code illustreren wat je hiermee bedoelt ?

Ook ben ik geen voorstander van de constructie "Userform1.Show" dus gebruik makend van de klasse naam van de userform in plaats van een object variabele te gebruiken.

Kun je aangeven wat in jouw ogen het voordeel/nadeel van beide methodes is ?
 
In plaats van dit:
Code:
Dim v_checks() As New C_check

Private Sub UserForm_Initialize()
   ReDim v_checks(Controls.Count)
   
   For Each it In Controls
     If TypeName(it) = "CheckBox" Then Set v_checks(it.TabIndex).m_check = it
  Next
End Sub
zou ik dit doen:
Code:
Dim cChecks As Collection

Private Sub UserForm_Initialize()
   Dim cCheck As C_check
   Set cChecks = New Collection
   For Each it In Controls
     If TypeName(it) = "CheckBox" Then
        Set cCheck = New C_check
        cCheck.m_check = it
        cChecks.Add cCheck
     End If
  Next
End Sub
zodat je alleen instanties van de klasse start voor iedere checkbox en niet voor alle controls.

Tweede vraag: Stel je hebt Userform1 met daarop TextBox1. En je gebruikt deze code:
Code:
Sub ShowForm()
    Userform1.Show
    MsgBox Userform1.Textbox1.Value
End Sub
Als de gebruiker de userform sluit met het kruisje krijg je geen foutmeldingen maar wel een leeg berichtvenster, ook al is er iets in textbox1 ingevuld. Ik weet dat je met het queryclose event kan voorkomen dat er op het kruisje geklikt wordt, maar ik heb liever ook dat er een fout optreedt zodat ik eraan herinnerd wordt dat ik nog wat werk te doen heb in mijn code.
 
Voor zover ik weet heeft een aantal meer instanties van een klasse geen invloed op geheugengebruik of de effektiviteit/efficiëntie van de code.
Ik zie daarom geen argumenten om van de simpelste code af te zien.

Ik kom nooit op het idee wat dan ook in een userform te doen met code die geen deel uitmaakt van het userform zelf.
Ik zie ook geen enkele reden om dat ooit te doen.
Een aparte obejctvariabele voor een object dat rechtstreeks in VBA is aan te roepen (zoals ook andere objecten als werkblad, werkboek) lijkt me dan ook redundant.
 
Toch nog een vraag.
De checkboxen in het originele bestand staan per 2st. in een frame.
Aangezien ik de klassemodule nog niet echt begrijp krijg ik de code niet goed.
Voor de checkboxen in de frames werkt het niet.
Dus toch weer om hulp vragen. ( zie userform1 in het bijgevoegde bestand)
 

Bijlagen

Eerst natuurlijk even de fundamentele vraag: waartoe die raamwerken (frames) ?

Een tweede punt: als je het userform wil starten met alle vinkvakken op 'true' dan kun je dat het best instellen in de ontwerpmodus bij de eigenschappen van de vinkvakken. Dat geldt natuurlijk ook voor de kleuren van de vakken bij de start.

In de code gebruik ik de tabindex eigenschap van het vinkvak.
Zo gauw vinkvakken in raamwerken komen te staan heeft ieder raamwerk zij eigen tabindex volgorde.
Dan klopt het niet meer.
Dat los je op door geen 'for each' lus te gebruiken maar een integer als teller te nemen en die te gebruiken om het vinkvak aan de array toe te wijzen.

Als de code in de codemodule van het userform staat (en daar hoort ie) is het gebruik vam Me. overbodig.
 

Bijlagen

Laatst bewerkt:
Goedeavond SNB,
Eerst natuurlijk even de fundamentele vraag: waartoe die raamwerken (frames) ?
Ik probeer een andere TS te helpen. De layouts van +/- 8 forms zijn nu eenmaal zo opgesteld.
De frames zouden ook gewoon weg kunnen en in plaats hiervan labels gebruiken. Dat is echter aan andere TS.
Vinkvakken en kleur op true via de eigenschappen is duidelijk.

Verder hartelijk dank voor de oplossing en de goede/duidelijke uitleg.:thumb:
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan