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

addcontrols

Status
Niet open voor verdere reacties.

Symphysodon

Gebruiker
Lid geworden
14 dec 2012
Berichten
468
Beste Forummers,

Deze vraag is nog een onderdeel van een ander project, maar ik krijg het niet voor elkaar. Ik heb een userform met een antal labels, tekstvakken en een combobox allemaal met een naam en een volgnummer. Nu zou ik graag willen dat afhankelijk van het aantal rijen in een dynamische tabel TBL_Admin, nieuwe controls worden aangemaakt. In het voorbeeld staan 7 rijen in de tabel, in de userform zouden dan ook 7 rijen met controls moeten komen te staan met bijpassende naam. Met onderstaande code lukt het helaas niet
Code:
Sub commandbutton1_click()
Dim userformcontrol As Control

n = Sheets("Admin").ListObjects("TBL_Administratie").DataBodyRange.Rows.Count  'aantal
t = 15
Set userformcontrol = Me.Controls.Add("Forms.Label.1", "MyLabel", True)
For i = 1 To n
    With userformcontrol
        .Width = 45
        .Height = 9.75
        .Top = 70 + t
        .Left = 243
        .ZOrder (0)
    End With
    t = t + 15
Next
End Sub

Mvg
Marco
 

Bijlagen

Even 3 opmerkingen
  1. Controls.Add moet in het loopje en niet ervoor en geef een Unieke naam , "MyLabel"& i ,
  2. Je maakt gebruik van Frames, je plaatst dus op het Frame dwz: Me. Frame1.Controls.Add(..........
  3. Geef een Caption/rand mee dan zie je dat ze er zijn: .Caption = i
 
Dan krijg je dus zoiets:
Code:
    n = Sheets("Admin").ListObjects("TBL_Administratie").DataBodyRange.Rows.Count  'aantal
    For i = 1 To n
        Set ctl = Me.Frame1.Controls.Add("Forms.Label.1", "MyLabel" & i, True)
        With ctl
            .Width = 45
            .Height = 10
            .Top = 90 + t
            .Left = 243
            .ZOrder (0)
            .Caption = "Label " & i
        End With
        Set ctl = Me.Frame1.Controls.Add("Forms.Textbox.1", "m" & i & "_cons", True)
        With ctl
            .Width = 50
            .Height = 15
            .Top = 90 + t
            .Left = 95
            .ZOrder (0)
        End With
        Set ctl = Me.Frame1.Controls.Add("Forms.Textbox.1", "m" & i & "_sd_cons", True)
        With ctl
            .Width = 50
            .Height = 15
            .Top = 90 + t
            .Left = 150
            .ZOrder (0)
        End With
        t = t + 20
    Next
 
Goeie opmerkingen het werkt. Alleen de nieuwe controls worden niet onthouden, als ik na het toevoegen na de editor ga staat het originele userform nog in het programma ipv het aangepaste
Code:
Sub CommandButton1_Click()
Dim userformcontrol As Control

n = Sheets("Admin").ListObjects("TBL_Administratie").DataBodyRange.Rows.Count  'aantal
t = 15

For i = 1 To n
    Set userformcontrol = Me.Frame1.Controls.Add("Forms.Label.1", "MyLabel" & i, True)
    With userformcontrol
        .Width = 45
        .Height = 9.75
        .Top = 70 + t
        .Left = 45
        .ZOrder (1)
        .Caption = Sheets("Admin").ListObjects("TBL_Administratie").DataBodyRange(i + 1, 2).Value
    End With
    
    Set userformcontrol = Me.Frame1.Controls.Add("Forms.Textbox.1", "MyLabel" & i, True)
    With userformcontrol
        .Width = 50
        .Height = 15
        .Top = 70 + t
        .Left = 95
        .Name = "m" & i & "_cons"
        .ZOrder (1)
    End With
    
    t = t + 15
Next
End Sub
 
@Accessguru
Ik zag net je code, bedankt. Ik heb even een tijdelijke opdrachtknop toegevoegd en de code aangepast
Code:
Sub CommandButton1_Click()

n = Sheets("Admin").ListObjects("TBL_Administratie").DataBodyRange.Rows.Count  'aantal
    For i = 1 To n - 1
        Set ctl = Me.Frame1.Controls.Add("Forms.Label.1", , True)
        With ctl
            .Width = 45
            .Height = 10
            .Top = 70 + t
            .Left = 45
            .ZOrder (0)
            .Caption = Sheets("Admin").ListObjects("TBL_Administratie").DataBodyRange(i + 1, 2).Value
        End With
        Set ctl = Me.Frame1.Controls.Add("Forms.Textbox.1", "m" & i & "_cons", True)
        With ctl
            .Width = 50
            .Height = 15
            .Top = 70 + t
            .Left = 95
            .ZOrder (0)
        End With
        Set ctl = Me.Frame1.Controls.Add("Forms.Textbox.1", "m" & i & "_sd_cons", True)
        With ctl
            .Width = 50
            .Height = 15
            .Top = 70 + t
            .Left = 150
            .ZOrder (0)
        End With
        
        Set ctl = Me.Frame1.Controls.Add("Forms.Label.1", , True)
        With ctl
            .Width = 45
            .Height = 15
            .Top = 70 + t
            .Left = 243
            .ZOrder (0)
            .Caption = Sheets("Admin").ListObjects("TBL_Administratie").DataBodyRange(i + 1, 2).Value
        End With
        Set ctl = Me.Frame1.Controls.Add("Forms.Textbox.1", "m" & i & "_cons", True)
        With ctl
            .Width = 50
            .Height = 15
            .Top = 70 + t
            .Left = 293
            .ZOrder (0)
        End With
        Set ctl = Me.Frame1.Controls.Add("Forms.Textbox.1", "m" & i & "_sd_cons", True)
        With ctl
            .Width = 50
            .Height = 15
            .Top = 70 + t
            .Left = 349
            .ZOrder (0)
        End With
'Frame 2
        Set ctl = Me.Frame2.Controls.Add("Forms.Checkbox.1", , True)
        With ctl
            .Width = 60
            .Height = 18
            .Top = 68 + t
            .Left = 18
            .Caption = Sheets("Admin").ListObjects("TBL_Administratie").DataBodyRange(i + 1, 2).Value
            .ZOrder (0)
        End With
        
        Set ctl = Me.Frame2.Controls.Add("Forms.Textbox.1", "USL_" & i, True)
        With ctl
            .Width = 50
            .Height = 15
            .Top = 70 + t
            .Left = 84
            .ZOrder (0)
        End With
        Set ctl = Me.Frame2.Controls.Add("Forms.Textbox.1", "Streef_" & i, True)
        With ctl
            .Width = 50
            .Height = 15
            .Top = 70 + t
            .Left = 138
            .ZOrder (0)
        End With
        Set ctl = Me.Frame2.Controls.Add("Forms.Textbox.1", "LSL" & i, True)
        With ctl
            .Width = 50
            .Height = 15
            .Top = 70 + t
            .Left = 194
            .ZOrder (0)
        End With

        t = t + 15
    Next
    End Sub

Op het werkblad blijven de toegevoegde controls behouden maar als ik de userform in de editor open zijn ze weer weg.
 

Bijlagen

Laatst bewerkt:
Is toch logisch? Je genereert de vakken 'live' op het moment dat je ze nodig hebt. Als je ze vast in het formulier wilt hebben, kun je ze beter eenmalig allemaal neerzetten (kun je gelijk ook de layout van het formulier optimaliseren) en die elementen die je niet nodig hebt verbergen. Al blijf je dan zitten met een vaste hoogte voor de elementen. Maar je zou ze allemaal ook over elkaar heen kunnen plaatsen in het ontwerp, en ze dan met code positioneren en zichtbaar maken. Een formulier in ontwerp fase openen met VBA kan prima in Access; daar ken ik de techniek wel voor. Niet voor Excel. Maar ik vind het nogal gezocht om het op die manier te doen.
 
Ik heb het nog niet helemaal door
Code:
With ThisWorkbook.VBProject.VBComponents("UserForm1").designer.Controls("Frame1")
    .SetFocus
    Set ctl = .Add("Forms.Textbox.1", "m" & i & "_cons", True)
    With ctl
        .Width = 50
        .Height = 15
        .Top = 70 + t
        .Left = 95
        .ZOrder (0)
    End With
End With
 
Ik heb een poging gedaan om het zonder frame te doen met de code:
Code:
Sub commandbutton1_click()
Dim userformcontrol As Control

n = Sheets("Admin").ListObjects("TBL_Administratie").DataBodyRange.Rows.Count  'aantal grafieken

t = 15
For i = 1 To n
With ThisWorkbook.VBProject.VBComponents("usNieuw").designer.Controls.Add("Forms.Textbox.1", "m" & i & "_cons", True)
        .Width = 50
        .Height = 15
        .Top = 70 + t
        .Left = 95
        .ZOrder (0)
End With

t = t + 15
Next
End Sub

Maar krijg een foutmelding dat de objectvariabele niet is ingesteld.

@EVR Wat bedoel je met de eerste optie in je post #6?
 
Staat die commandbutton1 in de UserForm.
Is nogal onduidelijk zonder voorbeeldbestand.
 
In #5 staat toch een voorbeeldbestand. Ik heb aan dat bestand een ander userform toegevoegd: usNieuw en nu zonder frame.

Het zou tof zijn als er een oplossing komt, want ikzelf kom er echt niet uit.
 

Bijlagen

@EVR Wat bedoel je met de eerste optie in je post #6?

De optie zoals beschreven in post #2 en uitgewerkt door Accesguru om vervolgens mbv withevents in een Klassenmodule de code te koppelen met de toegevoegde controls
 
Ik snap nog niet helemaal hoe ik de code voor het toevoegen van de controls gekoppeld krijg. Ik dacht dat je in de klassemodule moet vertellen wat er gedaan moet worden na bijvoorbeeld het klikken op de knop Nieuw bestand in het werkblad.
Ik heb van JKP een opzet gebruikt en het is dus de bedoeling dat nadat je de controls toegevoegd hebt ze zichtbaar blijven na het afsluiten en weer openen van het bestand.
 

Bijlagen

De code loopt door alle Textboxes op de sheet (0 dus) en niet op jouw form.

Maar als je wilt dat bepaalde controls al meteen op jouw Userform staan na afsluiten en weer openen, plaats ze dan al in de Ontwerpmodus op jouw Userform en verberg de ongebruikte bij openen van jouw formulier. Om hoeveel regels gaat het maximaal?
 
Het gaat om een maximum van 27 rijen van controls.

Als ik op de ontwerpmodus de ongebruikte verberg is de klasse module dan nog nodig
 
Neen, kan uiteraard wel, maar je maakt het jezelf een stuk makkelijker om "alvast" 27 rijen aan te maken in de ontwerpmodus
Bij het opstarten van het formulier kun je ze dan per rij (on) zichtbaar maken
 
Het is gelukt
Code:
n = Sheets("Admin").ListObjects("TBL_Administratie").DataBodyRange.Rows.Count  'aantal
ctlTot = 17
For Each ctl In Me.Frame1.Controls
    For i = 1 To ctlTot
        If ctl.Name = "m" & i & "_cons" Or ctl.Name = "m" & "_sd_cons" Or ctl.Name = "m" & "_gem" Or ctl.Name = "m" & "_sd" Then
            If i > n Then ctl.Visible = False Else ctl.Visible = True
        End If
    Next
Next

Bedankt voor de hulp EvR en AccesGuru.

mvg
Marco
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan