tellen lege velden

Status
Niet open voor verdere reacties.

jwaque

Verenigingslid
Lid geworden
16 aug 2006
Berichten
438
Allereerst mijn dank voor al jullie antwoorden afgelopen jaar. Ik wil iedereen een hele fijne kerst wensen en alle goeds en gezondheid voor 2021

dan mijn vraag:
Ik heb een formulier met daarin een tabbesturingselement. Op iedere tab komt een groep met velden te staan. Nu zou ik graag tellen hoeveel velden er, per tab, zijn gevuld.

Ik heb al gegoogled maar weet nog niet echt wat ik nu precies wil tellen en hoe ik dat in VBA verwoord. ik heb onderstaand maar volgens mij is dit niet echt wat ik wil tellen want nu tel ik ook de bijschriften.

Ik zou dus graag iets hebben als: als de ctl.tag="x" en value= is leeg of nvt dan tellen

Kunnen jullie me op weg helpen, volgens mij tel ik nu ingevulde tags en dat wil ik niet?
en een tweede vraag: kan ik in het veld extraInfo ook meerdere tags plaatsen?

Code:
Private Sub Knop446_Click()
    For Each ctl In Me.Controls
        If IsNull(ctl.Tag) Then
            i = i + 1
        Else
            i = 1
        End If
        t = t + 1
    Next ctl

    MsgBox i & " van " & t & " niet gevuld"

End Sub

wat me wel lukt is obv een tag een waarde toekennen
Code:
    For Each ctl In Me.Controls
        If ctl.Tag = "NietProductie" Then ctl.Value = "nvt"
    Next ctl
 
De .Tag is een string.
Doe het eens zo:
Code:
Private Sub Knop446_Click()
    For Each ctl In Me.Controls
        If TypeName(ctl) <> "Label" And ctl.Tag = "" Then
            i = i + 1
        End If
        t = t + 1
    Next ctl

    MsgBox i & " van " & t & " niet gevuld"
End Sub
 
Laatst bewerkt:
dank je. Ik kan nu wel het totaal aantal velden tellen in de selectie. Maar hoe kan ik nu de de velden die leeg zijn of nvt bevatten tellen. Ik denk dat ik iets van ctl.tag.value="nvt" nodig heb om de velden te definieren die ik wil tellen maar hoe zie ik nu of ze gevuld zijn. ctl.value="" geeft een foutmelding

Code:
Private Sub Knop446_Click()
    For Each ctl In Me.Controls
        If ctl.Tag = "APOKDV" And ctl.Value = "" Then
            i = i + 1
        Else
            i = i
        End If
        t = t + 1
    Next ctl

    MsgBox i & " van " & t & " niet gevuld"

End Sub
 
Probeer het hier eens mee:

Code:
Private Sub Knop16_Click()
    Dim pg As Page
    Dim i As Integer
    Dim y As Integer
    Dim str   As String
    On Error Resume Next
    
    For i = 1 To Me.TabbestEl0.Pages.Count
        For y = 0 To Me.TabbestEl0.Pages(i - 1).Controls.Count - 1
            If Nz(Me.TabbestEl0.Pages(i - 1).Controls(y).Value, "") = "" Then
                If Me.TabbestEl0.Pages(i - 1).Controls(y).ControlType = 109 Then
                    str = str & Me.TabbestEl0.Pages(i - 1).Name & " " & Me.TabbestEl0.Pages(i - 1).Controls(y).Name & vbCrLf
                End If
            End If
        Next
    Next
    
    MsgBox str
    
End Sub

Het Tabbesturingselement noemt TabbestEl0
De button waarmee alles genoemd wordt noemt Knop16
En er wordt enkel gecontroleerd op TextBoxen.

succes
 
Nu zou ik graag tellen hoeveel velden er, per tab, zijn gevuld.
... en een tweede vraag: kan ik in het veld extraInfo ook meerdere tags plaatsen?
Tab besturingselementen zijn op een formulier ‘onzichtbaar’. Je hoeft dus, als je naar een veld verwijst, nooit het betreffende tabblad op te geven of te benoemen. De vraag is dan ook of je met VBA kunt opvragen op welk tabblad een veld staat. Ik heb dat nog nooit geprobeerd. Ook nooit nodig gehad trouwens. Maar ik wil wel eens voor je kijken.

Wat je tweede vraag betreft: een object heeft maar één eigenschap ExtraInfo (Tag). Dus daar moet je het mee doen. Dat weerhoudt mij er niet van om er meerdere gegevens in op te slaan, maar je hebt dan dus een trucje nodig. Da’s heel simpel: scheidt de data met een symbool. Ik gebruik meestal het Pipe symbool: |. Dan staat er dus bijvoorbeeld: “tblContact|CP_Naam” in de tag. Die tekst moet je dan uiteraard wel weer op het juiste moment splitsen. Bijvoorbeeld met de SPLIT functie.
 
Als je zegt een foutmelding te krijgen vertel deze er dan ook bij.
 
Tab besturingselementen zijn op een formulier ‘onzichtbaar’. Je hoeft dus, als je naar een veld verwijst, nooit het betreffende tabblad op te geven of te benoemen. De vraag is dan ook of je met VBA kunt opvragen op welk tabblad een veld staat. Ik heb dat nog nooit geprobeerd. Ook nooit nodig gehad trouwens. Maar ik wil wel eens voor je kijken.
.

ik hoef ze niet perse per tab te tellen. als ik kan tellen per tag groepje vind ik dat ook prima. Ik ga eens meer info zoeken hoe de SPLIT functie te gebruiken.
 
Als jouw tabbesturingselement een andere naam heeft: ja, natuurlijk moet je dat aanpassen.
 
... maar hoe zie ik nu of ze gevuld zijn. ctl.value="" geeft een foutmelding
In je code loop je door alle controls heen, dus ook knoppen, labels, lijnen etc. Knoppen en labels hébben echter geen value, hooguit een Caption. Zorg dus, als je ergens een waarde van wilt uitlezen (doorgaans dus objecten als keuzelijsten en tekstvelden) dat je éérst filtert op díe objecten die een waarde hebben. En lees dáár dan de Value van uit. Ik gebruik daarom meestal een Select Case om de types te scheiden.
 
Ik weet natuurlijk niet wat je wil bereiken, maar misschien is het wel eenvoudiger om de velden van je tabel te valideren + een validatietekst er in te zetten.
Ook als je gebruik maakt van een tabbesturingselement zou je de volgende pagina pas kunnen laten zien, als alles wat ingevuld moet worden ook echt is ingevuld.
 
Ik weet natuurlijk niet wat je wil bereiken, .
Ik denk dat dat het moeilijkste stuk is. ik ga het met een voorbeeld proberen uit te leggen.

het formulier is bedoelt om aan te geven of diverse items zijn afgehandeld. die items wil ik groeperen dmv een tag, zodat als tagA veld1 nvt is dan gaan de velden van tagX automatisch ook op nvt of juist niet.
tagA veld 1 ""
tanA veld 2 ja
tagB veld 3 nee
tagB veld 4 ""
tagB veld 5 ""

ik wil nu tellen dat tabA nog 1 veld leeg heeft en tabB nog 2 lege velden.

ik wil uiteindelijk weten hoeveel velden nog niet gevuld zijn z
 
Laatst bewerkt:
Doe er alsjeblieft een voorbeeldje bij, want het wordt er alleen maar schimmiger van. Met de db erbij is het waarschijnlijk in 5 minuten opgelost. Nu, met al die roestige glazen bollen, kan het nog een paar dagen duren :).
 
Als jouw tabbesturingselement een andere naam heeft: ja, natuurlijk moet je dat aanpassen.

gevonden, naam van het hele element en niet van het tabblad. error opgelost maar ik denk niet dat hij telt wat ik wil.
 
ga mijn best doen.
frmAssortimentswijzigingen
Ik heb in het veld toelichtingen gezet wat ik per pagina verwacht. Hoop dat dit mijn vraag duidelijker maakt.
 

Bijlagen

  • assortimentsbeheer test.zip
    130,5 KB · Weergaven: 12
Dit:
hier zijn de 3 velden onder GDS niet gevuld dus wil ik ergens een 3 zien.
is niet echt een 'wetenschappelijk verantwoorde' verduidelijking, toch? Ik zie nergens een tekstveld waar het aantal in zou moeten worden bijgehouden.
 
Dit:

is niet echt een 'wetenschappelijk verantwoorde' verduidelijking, toch? Ik zie nergens een tekstveld waar het aantal in zou moeten worden bijgehouden.

klopt. ik dacht ga eerst een poging doen om een getal te krijgen (heb al wel een tekstbox neergezet waar het ongeveer moet komen). het weergeven daarna lukt hopelijk wel. Ik heb de 'rekensom' nu onder de knop zitten. Ik beheers access nog niet helemaal dus probeer het in kleine stappen te doen.
-tellen lege velden
-tellen lege velden met een tag

Maar het tellen van velden valt me moeilijker dan ik dacht.
 
ik denk dat ik het gevonden heb. mocht er nog een nettere methode zijn dan hoor ik het graag. In elkgeval super bedankt voor jullie hulp
Code:
Dim ctl As Control

For Each ctl In Me.Controls
        If ctl.ControlType = acTextBox Or ctl.ControlType = acComboBox Or ctl.ControlType = acListBox Then   'alleen de tekst controles
            If ctl.Tag = "apoKDV" Then
                If Len(ctl) > 1 Then
                    i = i + 1
                    n = n + 1
                Else
                    i = i
                    n = n + 1
                End If
            End If
          End If
            
                
Next ctl
Set ctl = Nothing
MsgBox i
Me.TxtApoKDV = i / n


End Sub
 
Je wilde het in eerste instantie per pagina, dus dan krijg je het ook per pagina :).
Code:
Dim pg As Page, ctl As Control
Dim i As Integer, y As Integer
Dim str As String
    
    ''On Error Resume Next
    With Me.tabAssortiment
        For Each pg In .Pages
            i = 0: y = 0
            On Error Resume Next
            For Each ctl In pg.Controls
                If ctl.ControlType = 109 Or ctl.ControlType = 111 Then
                    If Nz(ctl.Value, "") <> "" Then
                        i = i + 1
                    Else
                        y = y + 1
                    End If
                End If
            Next ctl
            If i > 0 Then
                If str <> "" Then str = str & vbLf
                str = str & pg.Name & " - Aantal gevulde objecten: " & i
            End If
            If y > 0 Then
                If str <> "" Then str = str & vbLf
                str = str & pg.Name & " - Aantal lege objecten: " & y
            End If
        Next pg
    End With
    MsgBox str
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan