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

userform - vereenvoudiging code properties Forecolor en Locked

Status
Niet open voor verdere reacties.

bartverhulst

Gebruiker
Lid geworden
11 aug 2011
Berichten
16
Hallo,
Mijn userform werkt zoals gewenst maar ik zou willen weten of ik de code wat zou kunnen vereenvoudigen. Ik heb in mijn form zo'n 140 bijschriftveldjes en daarnaast een 160tal comboboxen, listboxen en tekstveldjes. Ik heb elk veldje een specifieke naam gegeven. Bij het openen van mijn userform en bij selectie van een nummer worden al de velden opgevuld met wat er in de speadsheet aanwezig is voor dart nummer en zet ik al de veldjes (niet de bijschriftveldjes) op 'locked' met een specifieke 'Forecolor' :
Code:
id_bijkinfo.ForeColor = RGB(139, 69, 0)
id_bijkinfo.Locked = False
Bij het klikken op de knop 'Update' veranderen ze van kleur en worden ze toegankelijk met de code :
Code:
id_bijkinfo.ForeColor = RGB(0, 0, 0)
id_bijkinfo.Locked = True
Door op deze manier te werken heb ik dus heel veel van deze lijnen in mijn code staan. Bij het toevoegen van een veldje moet ik dit dus ook steeds voorzien

Mijn vraag is nu of er hiervoor een eenvoudigere manier bestaat om hetzelfde resultaat te bereiken.

Alvast bedankt voor de hulp
Bart
 
Laatst bewerkt:
Code:
Dim CT As Control
    For Each CT In Controls
        If TypeOf CT Is msforms.TextBox Or TypeOf CT Is msforms.ListBox Or TypeOf CT Is msforms.ComboBox Then
            CT.ForeColor = RGB(139, 69, 0)
            CT.Locked = True
        End If
     Next

Met bovenstaande code worden alle textboxen, comboboxen en listboxen voorzien van de betreffende kleur en worden zo bovendien geblokkeerd.
Deze code kan je aanpassen voor de knop Update.

Het maakt dus niet uit hoeveel textboxen, listboxen en comboboxen in de userform staan.
De overige besturingselementen (bijv.: knoppen en labels) worden ongemoeid gelaten.

Met vriendelijke groet,


Roncancio
 
Werkt perfect bedankt

Ik heb nog een gelijkaardige vraag voor de opvulling van de form met de gegevens uit de workbook. Bij het selecteren van een waarde in een zone worden alle gegevens afgebeeld die op dezelfde rij staan als de desbetreffende waarde (=nr conventie). Dit gebeurd op basis van volgende code :

Code:
Private Sub id_nrconventie_Change()

'define workplace where convention data are available
Set a = Worksheets("Conventions").Range("A4: EE2000")

'Retrieve info from table based on convention ID
Dim NRconvention As Integer
NRconvention = id_nrconventie
For n = 1 To 200
    If a.Cells(n, 1) = NRconvention Then
        id_tak = a.Cells(n, 3)
        id_pc = a.Cells(n, 4)
        If a.Cells(n, 5) = "X" Then
            id_risicoauto = True
            Else: id_risicoauto = False
        End If
.
.
End Sub

Ik heb op deze manier dus een 160tal veldjes gedefinieerd. Als ik een kolom in mijn sheet wil tussenvoegen moet ik dus alles een waarde opschuiven wat veel werk is.

Hetzelfde gebeurd bij het opslaan :

Code:
Private Sub ButtonSave_Click()

Dim nbrIDConvention As Integer

'define workzone
Set a = Worksheets("Conventions").Range("A4:DI200")

nbrIDConvention = id_nrconventie
For n = 1 To 200
    If a.Cells(n, 1) = nbrIDConvention Then 'look for convention in the list to update
        Call FieldsMappingStore(n)          'call the sub responsible for storing the values
        Exit For
    ElseIf a.Cells(n, 1) = "" Then          'look for empty row (where the convention will be added)
        a.Cells(n, 1) = nbrIDConvention     'create a new convention
        Call FieldsMappingStore(n)          'call the sub responsible for storing the values
        Exit For
    End If
Next n
Unload Me
ActiveWorkbook.Close SaveChanges:=True
End Sub

Private Sub FieldsMappingStore(n)

'COMPLETE THIS SUB WITH MAPPING FORM --> TARGET
Set a = Worksheets("Conventions").Range("A4:DI200")
    a.Cells(n, 3) = id_tak
    a.Cells(n, 4) = id_pc
    If id_risicoauto = True Then
        a.Cells(n, 5) = "X"
        Else: a.Cells(n, 5) = ""
    End If
.
.
End Sub

Hopelijk is bovenstaande begrijpbaar. Ik vroeg mij nu af of er een eenvoudigere manier bestaat om hetzelfde resultaat te bereiken.

Alvast bedankt voor de hulp
Bart
 
Waarom geen Find gebruiken zodat je niet elke regel moet controleren?
Of eventueel een autofilter.
Verder zie ik dat het bereik A loopt tot EE2000 maar de lus loopt tot 200.

Met vriendelijke groet,


Roncancio
 
Voor de kolomnummers kan je ook constanten gebruiken.
Bijvoorbeeld
Public Const kolTak = 3 As Byte
Public Const kolPC = 4 As Byte

In je code gebruik je de constanten als volgt:
id_tak = a.Cells(n, kolTak)

Als je later een kolom toevoegt hoef je maar één keer de nummers aan te passen.
 
ok maar als ik dan een kolom toevoeg ergens tussenin moet ik toch weer alle volgende nummers gaan aanpassen wat toch wat werk is. Is er eventueel geen mogelijkheid om in mijn worksheet elke kolom te benoemen en dan dit te koppelen aan de zone in de form (zelfde naam). Zo is het misschien mogelijk om enkel dit toe te voegen zonder de andere te moeten aanpassen.

Roncancio
Opdat ik de Find of Autofilter zou kunnen gebruiken ga ik nog wat moeten studeren daarop want anders ga da niet lukken denk ik.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan