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

56 commandbuttons benoemen...

Status
Niet open voor verdere reacties.

Spiesse

Gebruiker
Lid geworden
14 jul 2011
Berichten
902
Beste forumgangers,

voor een nieuw projectje ben ik op zoek naar een mogelijk om 56 command buttons te benoemen volgens een bereik A1:A56.

de code
Code:
Private Sub UserForm_initialize()
With Commandbutton1
    .Caption = Sheets("blad1").Range("a1").Value
End With
End Sub
en dit 56 keer herhalen is een manier om dit te doen, maar zo onlogisch :)

op internet heb ik al zitten zoeken maar nog geen correcte manier tegengekomen...

Alvast dank op voorhand!
Spiesse

Bekijk bijlage deli command.xlsm
 
Op het moment dat je zoveel buttons gaat doen kun je beter de buttons dynamisch aanmaken. Je kunt de buttons dan via een array aanspreken.

Ik ga even je file openen om te zien wat voor layout je zoekt
 
hey wampier, thx voor de bereidwilligheid dit te bekijken. Het is een bestelprogramma dat ik wil maken voor broodjes te bestellen op ons werk.

Mss een tweede vraagje: een combobox, uit maximaal hoeveel items kan deze bestaan? Ik heb een combobox aangemaakt met de volgende code om deze te vullen
Code:
Private Sub UserForm_initialize()
With Sheets("blad1")
ComboNaam.List = Sheets("blad1").Range("E1:E" & .Cells(.Rows.count, 1).End(xlUp).Row).Value
End With
End Sub

ik zie nu echter maar een klein deel van de lijst (548 regels lang)

thx in advance!
 
Beperking van de combobox ken ik niet, maar kan me voorstellen dat het rond de megabyte tekst maximaal is.

hier een heel beknopt voorbeeld van dynamisch buttons aanmaken:

Maak een nieuw formulier en voeg deze code toe:

Code:
Private Sub UserForm_Initialize()
    Dim knop() As Object
    ReDim knop(4)
    For i = 0 To 3
        Set knop(i) = UserForm1.Controls.Add("Forms.CommandButton.1")
        knop(i).Name = "knop" & i
        knop(i).Caption = i
        knop(i).Left = i * 25
        knop(i).Width = 20
    Next i
End Sub

Dit is nog niet de hele oplossing natuurlijk, maar op deze manier kun je in principe een willekeurige hoeveelheid knoppen aanmaken.
 
wampier, dit lukt me, en is een goed begin. Maar hoe benoem ik dan de buttons volgens een range in bv kolom E?
 
Je kunt de knop.caption = aanpassen:
Code:
knop(i).caption = activesheet.cells(i+1,5).value

zoals ik aangaf is dit een begin. Je kunt alles instellen wat je bij een normale knop ik kan stellen, hoogte, breedte, positie, tekst, etc. etc.
 
ok, merci he! ik ga es van start hiermee. Ik laat nog van me horen bij verdere vragen.

bedankt alvast!

prettig weekend

spiesse
 
Je gaat waarschijnlijk vastlopen als je de knop wat wilt laten doen. Als ik zo nog even tijd heb zal ik dat ook nog even toevoegen.
 
mss nog tijd voor iets extra? :)

in een textbox wil ik de waarde dan zien van de commandbutton die ik ingedrukt heb (met tijd komen er 2 waarden in) :)

groeten
 
Is de hoeveelheid knoppen variabel of een vaste hoeveelheid? In principe maakt het niet veel uit, maar bij variabele hoeveelheden is het makkelijker met een collectie te werken dan met een array
 
De opslag bestaat uit 2 delen. Het eerste deel hieronder is een kleine aanpassing aan de voorbeeldcode die je al had


Code:
Dim opslag As Collection

Private Sub UserForm_Initialize()
    Set opslag = New Collection
    Dim nknop As CommandButton
    For i = 0 To 3
        Set knopje = New knoppen
        Set nknop = UserForm1.Controls.Add("Forms.CommandButton.1")
        nknop.Name = "knop" & i
        nknop.Caption = ActiveSheet.Cells(i + 1, 5).Value
        nknop.Left = i * 25
        nknop.Width = 20
        Set knopje.kn = nknop
        Set knopje.parent = Me
        opslag.Add Item:=knopje, Key:="knop" & i
    Next i

End Sub

Voor het tweede deel moet je een klassenmodule aanmaken: invoegen -> klassenmodule
vervolgens in het venster aan de linkerkant (eigenschappen) de naam aanpassen naar: "knoppen"

als laatste dit in de klassenmodule plakken:

Code:
Public parent As Object
Public WithEvents kn As CommandButton

Sub kn_Click()
    MsgBox (kn.Caption)
End Sub

indien je een textbox wil aanpassen kun je dit aanpassen naar:

Code:
Sub kn_Click()
    parent.TextBox1.Text = kn.Caption
End Sub
 
hey wampier, in het weekend geen tijd gevonden om hiermee aan de slag te gaan.
Ik probeer met de info iets te maken :) zal alleszins je hulp nodig hebben :)

groeten
spiesse
 
Ik heb mijn code iets algemener gemaakt zodat je in principe de code kunt hergebruiken tussen verschillende pages etc. De "klassemodule" is nog wel steeds nodig:

Code:
Dim opslag As Collection

Private Sub UserForm_Initialize()
    Set opslag = New Collection
    knopmatrix Me, 6, 3, 50, 50, 5, 10, 10
End Sub

Private Sub knopmatrix(Sender As Object, Aantal As Long, Breedte As Long, XSize As Long, YSize As Long, Spacing As Long, Top As Long, Left As Long)
    Dim nknop As New knoppen
    For i = 0 To Aantal - 1
        Set nknop = New knoppen
        Set nknop.kn = Sender.Controls.Add("Forms.CommandButton.1")
        Set nknop.parent = Sender
        nknop.kn.Width = XSize
        nknop.kn.Height = YSize
        nknop.kn.Left = Left + (i Mod Breedte) * (XSize + Spacing)
        nknop.kn.Top = Top + Fix(i / Breedte) * (YSize + Spacing)
        nknop.kn.Name = "knop" & i
        opslag.Add Item:=nknop, Key:="knop" & i
    Next i
End Sub

De knopmatrix routine maakt automatisch een grid knoppen van "aantal" knoppen "Breedte" knoppen breed. Deze worden meteen goed gepositioneerd aan de hand van de opgegeven hoogte en breedte van de knoppen en de opgegeven tussenafstand.
 
Maak de uitvoeringstijd van een macro zo beperkt mogelijk.
Aanmaken van controls in een userform tijdens de uitvoering van een macro vind ik geen goed idee.

Je oorspronkelijke vraag is nl. zo eenvoudig op te lossen:

Code:
Sub M_snb()
    sn = Sheet1.Cells(1).Resize(56)
    j = 1
    For Each it In ThisWorkbook.VBProject.VBComponents("Userform1").Designer.Controls
        If TypeName(it) = "CommandButton" Then
            it.caption=sn(j,1)
            j = j + 1
        End If
    Next
End Sub

PS. Hebben jullie meer dan 548 verschillende soorten broodjes ?
Ik denk dat er nog wat aan het ontwerp van je werkblad verbeterd kan worden.
 
Laatst bewerkt:
Maak de uitvoeringstijd van een macro zo beperkt mogelijk.
Aanmaken van controls in een userform tijdens de uitvoering van een macro vind ik geen goed idee.

Qua performance is het geen probleem. Ik heb met mijn routine voor de gein eens getest en pas rond de 1000 dynamische buttons begin je echt merkbaar verschil te hebben in de opstarttijd. Er zijn hele goede redenen om een dynamisch bereik te willen. Bijvoorbeeld als de aantallen buttons per dag moeten verschillen en/of je de layout automatisch aan wil laten passen.

Overigens is het misschien in dit geval wat overkill, maar ik maak graag gebruik van dit soort grid functies en andere dynamische opbouw. De functies zijn herbruikbaar en je design is makkelijk mee te nemen naar andere forms. Helaas leent VB6 zich niet erg voor dit gebruik qua taal, maar de performance is onder water bijna net zo snel als designtime.

Maar goed, ik weet uit andere posts en replies dat we beide voor andere doelgroepen ontwikkelen en een andere designfilosofie hebben, dus dit is puur een informatieve toevoeging ;)
 
Bijvoorbeeld als de aantallen buttons per dag moeten verschillen en/of je de layout automatisch aan wil laten passen.

Waarvoor eigenschappen als visible en enabled natuurlijk heel geschikt zijn.

Mij is overgens niet gebleken van enige dynamiek in de door de vraagsteller beoogde opzet.

Overigens leek bij de antwoorden alsof bekendheid met de methode die ik #14 beschreef ontbrak.
 
Laatst bewerkt:
hoi SNB en wampier,

ik probeer deze namiddag jullie tips uit. En SNB, ik heb idd nog niet gewerkt met klassenmodules en zo van die zaken. De 'gewone' VBA lukt me al behoorlijk, maar dit blijkt toch andere koek te zijn :)

Ik hou je op de hoogte van mijn mislukkingen...

Groeten
Spiesse
 
Zonder een klassemodule, maar met dezelfde functionaliteit.
Zet de code in de code module van bijv. een werkblad, of een macromodule.

Code:
Sub M_snb()
    sn = Sheet1.Range("A1:A4")
    For j = 1 To 4
        With ThisWorkbook.VBProject.VBComponents("Userform1").Designer.Controls.Add("Forms.CommandButton.1")
           .Name = "knop" & j
           c00 = c00 & vbLf & "~" & .Name & "~~" & .Name & "|"
           .Caption = sn(j, 1)
           .Left = j * 25
           .Width = 20
        End With
    Next
    
    ThisWorkbook.VBProject.VBComponents("Userform1").CodeModule.AddFromString Replace(Replace(Replace(Replace(c00, "|", ".caption|End Sub|"), "~~", "_click()|" & vbTab & "msgbox "), "~", "Private Sub "), "|", vbLf)
End Sub


Wil je meer weten over het gebruik van een klassemodule in combinatie met gebeurtenissen van userformcontrols, zie:

http://www.snb-vba.eu/VBA_Userform_invoercontrole.html
 
Laatst bewerkt:
Mij is overgens niet gebleken van enige dynamiek in de door de vraagsteller beoogde opzet.
Maar goed, ik weet ... dat we beide ... andere designfilosofie hebben

Dat wil zeggen, geen haar op mijn hoofd die er aan zou denken om bij zo'n project ooit een statische layout te gebruiken. Bij veel "klanten" ben je dan uiteindelijk meer tijd bezig met tientallen knoppen verslepen, resizen, toch weer meer / minder knoppen etc etc. Verwissel je twee knoppen zijn je tabstops ineens niet meer logisch en meer van dat soort dingen.

Zoals ik al aangaf in mijn vorige post is je oplossing keurig (al zou ik die zelf in de context van de userform draaien in "initialize") en werkbaar, maar ik zou het uiteindelijk niet willen onderhouden. Ik vind het daarom ook moeilijk om het aan te bevelen als een oplossing, hoewel het inderdaad, puur gekeken naar de vraag, het meest directe antwoord is.
 
Waarvoor eigenschappen als visible en enabled natuurlijk heel geschikt zijn.

Mij is overgens niet gebleken van enige dynamiek in de door de vraagsteller beoogde opzet.

Overigens leek bij de antwoorden alsof bekendheid met de methode die ik #14 beschreef ontbrak.

SNB, mijn dynamiek is op weg. Ik heb nog geen snars tijd gevonden om mijn ontwerp iets meer uit te werken. moet trouwens gans het topic nog zelf es overlopen... ik zet straks mijn vernieuwd bestandje met meer commentaar hier.

trouwens, we hebben geen 548 broodjes... Wel zoveel werknemers die kunnen bestellen.

ik zet een nieuw bestand online straks.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan