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

Checkboxes in een frame tellen

Status
Niet open voor verdere reacties.

bkoppers

Gebruiker
Lid geworden
11 jan 2011
Berichten
110
Wie kan mij helpen,
Ik heb een frame in een userform met daarin 150 checkboxjes, graag zou ik willen weergeven hoeveel checkboxjes er zijn geselecteerd.
Weet iemand hoe ik dat kan doen, hoogstwaarschijnlijk heb ik bij jullie hulp een "oja natuurlijk:o" moment, maar momenteel kom ik er niet uit.

Mvgr,
Bkoppers
 
Even wachten, dat "oja natuurlijk" moment komt er wel aan indien het er al in zat.
Als het zo simpel is komt dat zeker.
 
Maar vertel vooral ook wat meer over je formulier. Ben sowieso al benieuwd hoe je een overzichtelijk formulier maakt met 150 selectievelden :D. Maar veel belangrijker is: hoe heb je de naamgeving ervan geregeld?
 
Zo iets:

Code:
Sub AantalGecheckt()
    Dim oCtl As Control
    Dim lCt As Long
    For Each oCtl In Me.Frame1.Controls
        If TypeName(oCtl) = "CheckBox" Then
            If oCtl.Value <> 0 Then
                lCt = lCt + 1
            End If
        End If
    Next
    Label1.Caption = lCt
End Sub

Moet je helaas of 150 event routines voor je checkboxjes maken, of ze aan een klassemodule knopen met 1 generieke event handler.
 
Of zoiets:
Code:
Private Sub CommandButton1_Click()
Dim obj As Control
Dim i As Integer
    For Each obj In Me.Controls
        If Left(obj.Name, 5) = "Check" Then
            If obj.Object.Value = True Then i = i + 1
        End If
    Next
    MsgBox "Aantal geselecteerd: " & i
End Sub
Met een aparte knop dus.
 
Merk op, dat jouw code geen rekening houdt met eventueel buiten het frame staande checkboxes...
 
Ja, dat bedoel ik, de vraag is om checkboxes IN een frame te tellen, niet alle checkboxes op de userform. :-)
 
Ik mag toch hopen dat TS naast die 150 selectievakjes in een frame er niet nóg meer op gedonderd heeft :).
 
Allen hartelijk dank voor jullie hulp, ik heb de oplossing van jkpieterse iets aangepast en het werkt perfect.

dit is het geworden. (als iemand hem nog korter kan maken, sta ik in voor sugesties :))
Code:
Private Sub Frm1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Dim chBx
    Dim chBx_aantal As Long
    For Each chBx In Frm1.Controls
        If chBx.Value = True Then chBx.ForeColor = Blauw
        If chBx.Value = False Then chBx.ForeColor = Zwart
        If chBx.Value = True Then chBx.Font.Bold = True
        If chBx.Value = False Then chBx.Font.Bold = False
'-----telt aantal aangevinkte checkboxen---------
        If TypeName(chBx) = "CheckBox" Then
        If chBx.Value <> 0 Then
            chBx_aantal = chBx_aantal + 1
'------------------------------------------------
        End If
        End If
Next
    Label3.Caption = "Aantal geselecteerd: " & chBx_aantal
End Sub

en voor de gedesinteresseerde , zo ziet de code van het userform er uit. (ook hier geld: als iemand hem nog korter kan maken, sta ik in voor sugesties :))

Code:
Private Sub UserForm_Activate()
Label2.Caption = Range("mr_aantal").Value

CB_QC001.Caption = Range("_QC001").Value
CB_QC002.Caption = Range("_QC002").Value
CB_QC003.Caption = Range("_QC003").Value
CB_QC004.Caption = Range("_QC004").Value
CB_QC005.Caption = Range("_QC005").Value
CB_QC006.Caption = Range("_QC006").Value
CB_QC007.Caption = Range("_QC007").Value
CB_QC008.Caption = Range("_QC008").Value
CB_QC009.Caption = Range("_QC009").Value
CB_QC010.Caption = Range("_QC010").Value
CB_QC011.Caption = Range("_QC011").Value
CB_QC012.Caption = Range("_QC012").Value
CB_QC013.Caption = Range("_QC013").Value

enz,enz tot QC150

end sub
en een screenshotje voor de liefhebber

scrshot.png
 
Laatst bewerkt:
Dat laatste moet zeker korter kunnen:
Code:
Dim i As Integer
For i = 1 To 150
    Me("CB_QC" & Right("000" & i, 3)).Caption = Range("_QC" & Right("000" & i, 3)).Value
Next i
 
super bedankt OctaFish, kun je me misschien even toelichten waar die "3" voor staat. is dat omdat het 3 cijfers moeten zijn?
 
Wow, in een mousemove event. Dat wordt tig keer aangeroepen als de muis beweegt (en nooit als je de muis niet gebruikt!). Iets beter (als we dat mouse event toch misbruiken):

Code:
Private Sub Frm1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Dim chBx As Control
    Dim chBx_aantal As Long
    For Each chBx In Frm1.Controls
'-----telt aantal aangevinkte checkboxen---------
        If TypeName(chBx) = "CheckBox" Then
            If chBx.Value = True Then 
                chBx.ForeColor = Blauw
                chBx.Font.Bold = True
                chBx_aantal = chBx_aantal + 1
            Else
                chBx.ForeColor = Zwart
                chBx.Font.Bold = False
            End If
        End If
Next
    Label3.Caption = "Aantal geselecteerd: " & chBx_aantal
End Sub
 
ik heb naar aanleiding van OctaFish zijn/haar oplossing van het inkorten, een andere lange code proberen in te korten, maar ik zie toch iets over het hoofd of doe het helemaal verkeerd, wie wil mij nog eens helpen.

Code:
Private Sub CommandButton1_Click()

        Range("_MR01").Value = IIf(CB_QC001, Range("_QC001").Value, "")
        Range("_MR02").Value = IIf(CB_QC002, Range("_QC002").Value, "")
        Range("_MR03").Value = IIf(CB_QC003, Range("_QC003").Value, "")
        Range("_MR04").Value = IIf(CB_QC004, Range("_QC004").Value, "")
        Range("_MR05").Value = IIf(CB_QC005, Range("_QC005").Value, "")
        Range("_MR06").Value = IIf(CB_QC006, Range("_QC006").Value, "")
        Range("_MR07").Value = IIf(CB_QC007, Range("_QC007").Value, "")
        Range("_MR08").Value = IIf(CB_QC008, Range("_QC008").Value, "")

enz,enz

ik had gedacht het zo te doen, maar helaas werkt het niet

Code:
Dim i As Integer
For i = 1 To 150
    Range("_MR" & Right("00" & i, 2)).Value = IIf("CB_QC" & Right("000" & i, 3), Range("_QC" & Right("000" & i, 3)).Value, "")
Next i
 
dankje wel jkpieterse voor je reactie mbt mouseover, heb je een tip hoe ik het beter kan doen, en dat het toch steeds bijgewerkt wordt.
lijkt me wat omslachtig om het bij iedere .click op een checkbox te zetten.

ik leer iedere keer wat nieuws hier, dus wellicht kun jij mij hier iet bij leren.
 
Die '3' staat voor het aantal tekens dat je in de string nodig hebt. Het getal 150 bestaat uit 3 cijfers, dus alle getallen onder de 100 moeten een of meer voorloopnullen krijgen. Dat doe je door een string te maken van nullen (max 3) en daar de waarde van i achter te zetten. "000" & 15 (als voorbeeld) levert dus de string "00015" op. Daar zitten teveel nullen in en die haal je met Right weg. Daarmee pak je van de samengestelde string de 3 rechter tekens. Hou je over: "015".
Dat is ook precies waarom je nieuwe procedure in de misère springt, want je hebt maar 2 posities te vullen met Range("_MR" & Right("00" & i, 2)). En je gebruikt waarden t/m 150. Oftewel: 1/3 van je getallen bestaat uit meer cijfers dan je aan kan.
 
Als het raamwerk alleen vinkvakken bevat (en daar lijkt het verdacht veel op) :

Code:
Private Sub UserForm_Click()
    Label1.Caption = ""
    For Each ct In Frame1.Controls
       Label1.Caption = Val(Label1.Caption) - ct.Value
    Next
End Sub
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan